Сейчас на форуме: _MBK_, Adler (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Ткните носом, что нетак
Посл.ответ Сообщение

Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 13:00 · Поправил: Sonic_X
· Личное сообщение · #1

Приветствую. Подскажите что делаю нетак. Нашел адресс в программе где идет сверка S/N, там в регистре ЕСХ находится правильный регномер, Адрес этот равен $00484F80, ОЕР проги по адресу (сморел в отладчике) $00544C77. Ну и собственно задумал написать утиль которая бы загружала прогу и считывала этот правильный регномер и потом прибивала бы цель. Мой алгоритм действий такой:
1.Создаем процесс с флагом отладки и приостанавливаем его
2.Ставим прерывание на ОЕР, отпускаем поток
3.Ловим Int3, возвражаем назад байт
4.Ставим новое прерывание на уже нужный нам адрес
5.Ловим Int3, читаем регистр ЕСХ
6.Прибиваем поток.
Вот код который я наваял:
Code:
  1. var
  2.   Form1: TForm1;
  3.   StartupInfo:TStartupInfo;
  4.   ProcessInfo:TProcessInformation;
  5.   DebugEv:_DEBUG_EVENT;
  6.   CNTX:_CONTEXT;
  7. implementation
  8.  
  9. {$*.dfm}
  10.  
  11. procedure TForm1.btn1Click(Sender: TObject);
  12. const
  13. Buff:array [0..1] of Byte=(0,$CC);
  14. var
  15. TargetPrg:array [0..MAX_PATH-1] of Char;//Путь и имя файла цели
  16. OEP:LongInt;
  17. Addr:LongInt;
  18. cAddress_0:LongInt;
  19. NumOfByte:Cardinal;
  20. begin
  21.   TargetPrg:=('C:\Program Files\TS\TS.exe');
  22.   OEP:=$00544C77;//Точка входа, найдена ч/з OllyDbg
  23.   Addr:=$00484F80;//Адрес где нужно остановится, найден ч/з OllyDbg
  24.  {Создаем процесс с флагом отладки}
  25.  CreateProcess(
  26.       nil,
  27.       TargetPrg,
  28.       nil,
  29.       nil,
  30.       False,
  31.       DEBUG_PROCESS //Будет в режиме отладки
  32.       or DEBUG_ONLY_THIS_PROCESS//Отлаживать тока целевой процесс
  33.       or CREATE_SUSPENDED,//Приостанавливаем чтоб выставить прерывание Int3
  34.       nil,
  35.       nil,
  36.       StartupInfo,
  37.       ProcessInfo);
  38.  
  39.  ReadProcessMemory(ProcessInfo.hThread,//Запоминаем байт
  40.  Pointer(OEP),@Buff[0],1,NumOfByte);
  41.  WriteProcessMemory(
  42.       ProcessInfo.hThread,
  43.       Pointer(OEP),
  44.       @Buff[1],//Ставим прерывание
  45.       1,
  46.       NumOfByte);
  47.   ResumeThread(ProcessInfo.hThread);//Отпускаем поток
  48.  
  49.     While true do
  50.   Begin
  51.     if not WaitForDebugEvent(DebugEv, 0) then
  52.       application.ProcessMessages;
  53.     if DebugEv.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then
  54.       if DebugEv.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT then
  55.       begin
  56.         CNTX.ContextFlags := CONTEXT_CONTROL;
  57.         GetThreadContext(ProcessInfo.hThread, CNTX);
  58.         { проверяем: EIP=Entry Point или нет }
  59.         if CNTX.eip - 1 = OEP then
  60.         Begin
  61.           CNTX.eip := CNTX.eip - 1;
  62.           CNTX.EFlags := CNTX.EFlags or $100; // флаг T
  63.           setThreadContext(ProcessInfo.hThread, CNTX);
  64.           // ставим байт на место
  65.           WriteProcessMemory(ProcessInfo.hProcess,
  66.           pointer(OEP), @buff[0], 1, NumOfByte);
  67.           //Новое прерывание на нужном адресе
  68.           WriteProcessMemory(
  69.                 ProcessInfo.hThread,
  70.                 Pointer(Addr),
  71.                 @Buff[1],//Ставим прерывание
  72.                 1,
  73.                 NumOfByte);
  74.           break;
  75.         end
  76.          else
  77.          { проверяем: EIP=Нужный нам адрес или нет }
  78.          if CNTX.eip - 1 = Addr then
  79.           begin
  80.             CNTX.ContextFlags:=CONTEXT_INTEGER;
  81.             GetThreadContext(ProcessInfo.hThread,CNTX); //получаем контекст
  82.             cAddress_0:=CNTX.Ecx; //нам надо значение регистра Ecx
  83.             {Здесь пока не разбирался, сюда я не дохожу...}
  84.              break;
  85.           end;
  86.  
  87.         ContinueDebugEvent(ProcessInfo.dwProcessId,
  88.         ProcessInfo.dwThreadid, DBG_CONTINUE);
  89.       end;
  90.     ContinueDebugEvent(ProcessInfo.dwProcessId,
  91.     ProcessInfo.dwThreadid, DBG_CONTINUE);
  92.   end;

Так вот ну никак не словлю прерывание, смотрел в отладчике Delphi как выполняется программа - 2 раза сравнит CNTX.eip - 1 = OEP и все, что я делаю нетак?



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 31 мая 2011 13:13 · Поправил: SReg
· Личное сообщение · #2

можешь так написать, проще будет
Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2.  const buf:array[1..4] of byte=($00,$00,$EB, $FE); adr:cardinal = $0088E1EE;
  3. var
  4. si:tstartupinfo;
  5. Pi:tprocessinformation;
  6. ctx:_CONTEXT;
  7. m:array[1..255]of byte;
  8. readb,i: Cardinal;
  9. serial:String;
  10. begin
  11. FillChar(si,SizeOf(si),0);
  12. FillChar(pi,SizeOf(Pi),0);
  13. if not CreateProcess( nil,PChar('aaa.exe'),nil,nil,false,CREATE_SUSPENDED,nil,nil,si,pi)
  14. then
  15. begin
  16. ShowMessage('Невижу возле себя файла aaa.exe');
  17. Exit;
  18. end
  19. else
  20. readprocessmemory (pi.hProcess,pointer(adr),@buf[1],2,i);
  21. writeprocessmemory(pi.hProcess,pointer(adr),@buf[3],2,i);
  22. resumethread(pi.hThread);
  23. repeat
  24. ctx.ContextFlags:=CONTEXT_FULL;
  25. GetThreadContext(Pi.hThread,ctx);
  26. until ctx.Eip = adr;
  27. suspendthread(pi.hThread);
  28. readprocessmemory(pi.hProcess, pointer(ctx.Edx), @m, 255, readb);
  29. serial := '';
  30. for i := 1 to readb do begin
  31. if m[i] <> 0 then serial := serial + Chr(m[i]) else Break;
  32. end;
  33. Edit1.Text:= serial;
  34. writeprocessmemory(pi.hProcess,pointer(adr),@buf[1],2,i);
  35. resumethread(pi.hThread);
  36. end;
  37. end.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 31 мая 2011 13:20
· Личное сообщение · #3

Непонятно, зачем TF, если он вообще не обрабатывается. Не будет работать код, если файл будет релоцирован.



Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 13:39
· Личное сообщение · #4

SReg
Не будет работать, так как регномер генерится в процессе загрузки проги, поетому и задумано сначало прерватся на ОЕР, и только потом на адресе нужном когда регномер уже сгенерирован и остается тока его взять, или я неправ?


Archer пишет:
Не будет работать код

А как сделать правильно? мне то и нужно всего ничего 2 раза брякнутся и прочитать регистр, программа написана на Qt4.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 31 мая 2011 13:51 · Поправил: SReg
· Личное сообщение · #5

Sonic_X пишет:
или я неправ?

неправ
P/S посмотрел подробней твой код. Похоже что ты вообще непонимаешь что пишешь. ужс нах.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 31 мая 2011 14:15
· Личное сообщение · #6

Если файл релоцирован, надо доставать новую базу и править все VA с учётом этой базы. Либо везде в адресах прописывать RVA и плюсовать в нужных местах новую базу. Но на двойной бряк это никак не должно влиять, просто косяк и всё.
И на первый вопрос я так и не увидел ответа.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 31 мая 2011 14:37 · Поправил: OnLyOnE
· Личное сообщение · #7

Sonic_X пишет:
регистре ЕСХ находится правильный регномер

Возможно покажусь не оригинальным, но если указатель на правильный рег.номер открыто лежит регистре... не проще ли проанализировать алго генерации и написать элементарный кейген?!
А не извращаться пытаясь писать сниффер?

P.S. Название программы подскажи.. или это тайна бермудского треугольника?

-----
aLL rIGHTS rEVERSED!




Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 14:51 · Поправил: Sonic_X
· Личное сообщение · #8

Archer пишет:
Непонятно, зачем TF

Этот код написан опираясь на статью http://cracklab.ru/art/?action=view&id=74, видно я упустил что-то или непрально понял.
SReg пишет:
Похоже что ты вообще непонимаешь что пишешь

Возможно. Неправильно цикл ожидания?
А можно пояснить откуда взялся $0088E1EE ?
OnLyOnE пишет:
не проще ли проанализировать алго

Там идет проверка введенного S/N и рядом правильный, мне показалось что так проще будет - стянуть правильный регномер. Видно я ошибался...
P.S. Сильно ногами не пинайте, я тока учусь



Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 15:04 · Поправил: Sonic_X
· Личное сообщение · #9

OnLyOnE пишет:
или это тайна бермудского треугольника

Не не тайна программа TachoSystem. Используется для проверки тахографа.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 31 мая 2011 15:16 · Поправил: OnLyOnE
· Личное сообщение · #10

Sonic_X пишет:
Не не тайна программа TachoSystem. Используется для проверки тахографа.

Ок.. ссылку на прогу кинь за одно
Можно в ПМ
Sonic_X пишет:
так проще будет

это тебе решать, каким путем идти...

-----
aLL rIGHTS rEVERSED!




Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 15:25 · Поправил: Sonic_X
· Личное сообщение · #11

OnLyOnE пишет:
Ок.. ссылку на прогу кинь за одно

В свободном доступе ее нету, если хочешь могу на почту кинуть. в архиве 45mb установщик.
Разбит по 10mb, одним куском не пойдет.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 31 мая 2011 15:35
· Личное сообщение · #12

Sonic_X пишет:
Разбит по 10mb, одним куском не пойдет.

Можно еще проще.. жмешь в архив с паролем и закачиваешь к примеру на zalil.ru
Кидаешь ссылку и пароль на архив мне в пм.. гляну ее на предмет кейгена

-----
aLL rIGHTS rEVERSED!




Ранг: 1.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2011 16:11
· Личное сообщение · #13

OnLyOnE пишет:
в пм..

Все сделал, смотри пм.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 01 июня 2011 15:11
· Личное сообщение · #14

Sonic_X пишет:
Все сделал, смотри пм.



-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Вопросы новичков —› Ткните носом, что нетак
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати