Сейчас на форуме: asfa, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Подскажите, каким генератором лоадера такое можно сделать.
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 18 июля 2013 16:20
· Личное сообщение · #1

Проблема в следущем. В каждой очередной версии одной программы, приходится подменять несколько байт. Адрес подмены ищу всегда одеим и тем-же способом. Поэтому и хочется создать один "универсальный для всех версий" лоадер.
Способ поиска адреса и байт для патча:
Есть определенная текстовая сигнатура. Ищу по ней адрес. Выше этого адреса в определенном интервале ищу вторую текстовую сигнатуру. Перевожу текст этой сигнатуры в НЕХ-значение. Подставляю это хекс значение в третью, но уже нех-сигнатуру. Ищу адрес этой третьей сигнатуры . И чуть выше адреса этой третьей сигнатуры нахожу адрес места куда буду вносить нужные изменения.
Может сумбурно написал, но если понадобится, могу написать пример.
Вопрос, каким генератором лоадеров можно это осуществить, так сказать сделать "умный лоадер". Тоесть какой генератор лоадеров позволит ввести такой алгоритм поиска, а не просто поиск по сигнатуре?




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

Создано: 18 июля 2013 16:41
· Личное сообщение · #2

Не проще ли взять и самому написать? Благо, лоадер пишется за 10 минут.




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 18 июля 2013 16:53
· Личное сообщение · #3

WinHex поддерживает скрипты, можно заложить скрипт поиска. Но если не подойдёт по каким-либо причинам (не хватит функционала, неудобства, ...), то действительно проще свой написать, поскольку искать под конкретные нужды замучаешься.

-----
IZ.RU




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 18 июля 2013 16:55 · Поправил: Kuzya69
· Личное сообщение · #4

Archer
Насчет "проще", не уверен. Для меня большая проблема, как аттачиться лоадером к проге, обойдя защиты. Потом как открыть дамп процесса, как обходить проверку црц (или хотя-бы задержку сделать). Я такое точно на асме не напишу.
А можно готовые лоадеры (исходники) посмотреть? Дайте ссылочки, пожалуйста.
Лучше если язык лоадеров будет делфи, даже пусть с "асм-вставками".
Меня именно интересует, как запустить программу, и открыть ее виртуальную память. Ну и потом завершить лоадер не навредив процессу.
DenCoder
Да видел я в ВИН-ХЕКСе скрипты. Но никак не могу найти команду открывания RAM, запущенного процесса.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 18 июля 2013 17:01
· Личное сообщение · #5

Разберешься?

делфи
Code:
  1.  program loader;
  2.  
  3. uses
  4.   Windows;
  5.  
  6. var
  7.   si : Startupinfo;
  8.   pi : Process_Information;
  9.  
  10. procedure Patch(Address: Cardinal; PatchedBytes: Array Of Byte; OrigBytes: Array Of Byte);
  11. var
  12.   NBW: Cardinal;
  13.   Old: byte;
  14. begin
  15.   ReadProcessMemory(pi.hProcess, Pointer(Address), @Old, 1, NBW);
  16.   if OrigBytes[0] = Old then
  17.   begin
  18.     WriteProcessMemory(pi.hProcess, Pointer(Address), @PatchedBytes[0], Length(PatchedBytes), NBW);
  19.     ResumeThread(pi.hThread);
  20.     CloseHandle(pi.hProcess);
  21.     CloseHandle(pi.hThread);
  22.   end
  23.   else
  24.   begin
  25.     Messagebox(0,pchar('Bytes not found...'),pchar('Error'),mb_iconinformation);
  26.     TerminateProcess(pi.hProcess,0);
  27.     CloseHandle(pi.hProcess);
  28.     CloseHandle(pi.hThread);
  29.   end;
  30. end;
  31.  
  32. begin
  33.  
  34.   if CreateProcess(nil,'target.exe',nil,nil,FALSE, Create_Suspended,nil,nil,si,pi) = true then
  35.   begin
  36.     Patch($00000001, [$FF, $FF], [$00, $00]);
  37.   end;
  38. end.


масм:
Code:
  1.  
  2. .586
  3. .model flat,stdcall
  4. option casemap:none
  5.  
  6. include \masm32\include\windows.inc
  7. include \masm32\include\user32.inc
  8. include \masm32\include\kernel32.inc
  9. includelib \masm32\lib\user32.lib
  10. includelib \masm32\lib\kernel32.lib
  11.  
  12. .data
  13. FileName  db "crackme.exe",0
  14. Error     db "Process could not started!",0
  15.  
  16. Startup STARTUPINFO <>
  17. processinfo PROCESS_INFORMATION <>
  18.  
  19. .data?
  20. hInstance HINSTANCE ?
  21. ByteBuf dd ?
  22. .code
  23. start:
  24.          invoke GetModuleHandleA, NULL
  25.          mov    hInstance,eax
  26.          invoke CreateProcess, addr FileName, NULL, NULL, NULL, NULL, CREATE_SUSPENDED,NULL, NULL, addr Startup, addr processinfo
  27.          .if eax == NULL
  28.                  invoke MessageBox, NULL, addr Error, NULL, MB_ICONEXCLAMATION
  29.          .else
  30.              call patch
  31.          .endif
  32.          invoke ExitProcess,eax
  33.  
  34. patch proc hWnd: DWORD
  35. LOCAL tmp: byte
  36.             _patch macro _pos, _byte
  37.                               mov tmp, _byte
  38.                               invoke WriteProcessMemory, processinfo.hProcess, _pos, addr tmp, 1, ByteBuf
  39.                               invoke ResumeThread, processinfo.hThread
  40.                         endm
  41.  
  42. _patch 00000001h, 0FFh
  43.  
  44.          ret
  45.  
  46. patch endp
  47.  
  48. end start


-----
xchg dword [eax], eax


| Сообщение посчитали полезным: Kuzya69

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 18 июля 2013 17:07 · Поправил: Kuzya69
· Личное сообщение · #6

void
Спасибо. Попробую понять.

Так получается, что лоадер, который на Делфи, не запускает прогу, а атачится уже к запущенной? А как бы посмотреть на лоадер, который еще и запускает прогу, атачится к ней, исправляет байты в памяти процесса, и отключается от проги?



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 18 июля 2013 17:32
· Личное сообщение · #7

Kuzya69 пишет:
Так получается, что лоадер, который на Делфи, не запускает прогу, а атачится уже к запущенной?

С чего такие умозаключения? а CreateProcess там на что?



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 18 июля 2013 18:06 · Поправил: Kuzya69
· Личное сообщение · #8

Vovan666
Извиняюсь, бегло посмотрел. Привык, что основной код вверху, а процедуры внизу.

Извиняюсь, а как поисковики по сигнатуре пишутся в готовых лоадерах?
Они всю память процесса копируют в массив, а потом в массиве ищут? Или побайтно делают ReadProcessMemory? Или еще есть какие приемы в плане, размер-быстродействие?



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 18 июля 2013 19:27 · Поправил: void
· Личное сообщение · #9

Kuzya69 пишет:
Они всю память процесса копируют в массив, а потом в массиве ищут? Или побайтно делают ReadProcessMemory? Или еще есть какие приемы в плане, размер-быстродействие?

Ненадо ничто никуда копировать, работаешь напрямую с памятью.

Code:
  1. function dwFindPattern(dwAddress, dwLen: DWORD; bMask: PByte; szMask: Pointer): DWORD;
  2.   //===========
  3.   function bDataCompare(pData, bMask: PByte; szMask: Pointer): Boolean;
  4.   begin
  5.     While (Byte(szMask^) <> $00) Do
  6.       begin
  7.         If (Byte(szMask^) = Byte('x')) and (pData^ <> bMask^) Then
  8.           begin
  9.             result := false;
  10.             exit;
  11.           end;
  12.         pData := PByte(DWORD(pData)+1);
  13.         bMask := PByte(DWORD(bMask)+1);
  14.         szMask := Pointer(DWORD(szMask)+1);
  15.       end;
  16.     result := (Byte(szMask^) = $00);
  17.   end;
  18.   //===========
  19. var
  20.   i: Integer;
  21. begin
  22.   result := 0;
  23.   For i := 0 To dwLen-1 Do
  24.     begin
  25.       If bDataCompare(PByte(dwAddress+i),bMask,szMask) Then
  26.         begin
  27.           result := dwAddress+i;
  28.           Exit;
  29.         end;
  30.     end;
  31. end;


Ищем:
Code:
  1. var
  2.   cAddress: Cardinal;
  3. const
  4.   baVtablePattern: array[0..13] of Byte = ($C7,$06,$00,$00,$00,$00,$89,$86,$00,$00,$00,$00,$89,$86);
  5.   sigVTableMask: PChar = 'xx????xx????xx';
  6. begin
  7.   cAddress:= dwFindPattern(GetModuleHandleA('d3d9.dll'),828000,@baVtablePattern,sigVTableMask);


PS: надеюсь следующим твоим вопросом не будет "ребят, я чет туплю, напишите за меня"

-----
xchg dword [eax], eax





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

Создано: 18 июля 2013 19:39
· Личное сообщение · #10

Напрямую с памятью, видимо, имеется в виду, что уже в адресном пространстве нужного процесса код. В общем случае проще считать в буфер и искать там.
А вообще все эти вопросы ни о чём уже томили, топик-кандидат на закрытие. Лень открыть гугл и поглядеть описание 2-3 функций в мсдн?



Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 18 июля 2013 19:48
· Личное сообщение · #11

void , Archer
Ну не пинайте, я понимаю, надоел. Но это мой первый лоадер. Раньше с готовыми "делалками лоадеров"
занимался. Поэтому и вопрос был про готовый генератор. Но тут тема резко сменила свое направление. И стала еще более интересной.
Спасибо вам, что помогаете.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 18 июля 2013 20:00
· Личное сообщение · #12

Archer пишет:
Напрямую с памятью, видимо, имеется в виду, что уже в адресном пространстве нужного процесса код. В общем случае проще считать в буфер и искать там.

Спорно, зачем делать ненужную работу, когда можно
уже в адресном пространстве нужного процесса

Kuzya69 пишет:
Ну не пинайте, я понимаю, надоел. Но это мой первый лоадер. Раньше с готовыми "делалками лоадеров"
занимался. Поэтому и вопрос был про готовый генератор. Но тут тема резко сменила свое направление. И стала еще более интересной.

Сейчас у тебя есть почти все готовое. Осталось это соеденить воедино и тестировать.

-----
xchg dword [eax], eax





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 18 июля 2013 21:25
· Личное сообщение · #13

void, а как твоя функция dwFindPattern окажется в адресном пространстве нужного процесса, чтобы можно было, как ты выражаешься:
void пишет:
работаешь напрямую с памятью.

...а?

-----
the Power of Reversing team


| Сообщение посчитали полезным: ARCHANGEL

Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 18 июля 2013 21:46
· Личное сообщение · #14

самый функциональный патч-мэйкер, умеет делать и лоадеры
http://exelab.ru/f/action=vthread&forum=3&topic=8207&page=0



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 19 июля 2013 16:12
· Личное сообщение · #15

DillerInc пишет:
...а?

ring0, лол

-----
xchg dword [eax], eax





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 19 июля 2013 16:32 · Поправил: DenCoder
· Личное сообщение · #16

DillerInc пишет:
void, а как твоя функция dwFindPattern окажется в адресном пространстве нужного процесса, чтобы можно было, как ты выражаешься:

Одним из способов
1) перевести в базонезависимый асм-код на асме и внедрить в процесс
2) перевести в асм-код, подсчитать необходимые смещения и внедрить в процесс
3) перенести функцию в shared-секцию и подгрузить shared-секцию в процесс (Recommended)

-----
IZ.RU





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 19 июля 2013 16:50 · Поправил: DillerInc
· Личное сообщение · #17

Похоже, что влияние клерка не проходит бесследно...

-----
the Power of Reversing team





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 19 июля 2013 16:55
· Личное сообщение · #18

Kuzya69 пишет:
Они всю память процесса копируют в массив, а потом в массиве ищут?

самый простой способ. еще файл с диска возможно считать/отмапить, если ReadProcessMemory напрягает

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 19 июля 2013 17:06
· Личное сообщение · #19

если делается generic loader, то:
сначала читаем файл -> ищем искомое место (по сигнатуре или как нибудь еще) -> RVA to VA минус imagebase -> CreateProcess SUSPENDED -> [Ebx+8] получаем imagebase процесса, добавляем найденное ранее место для патча -> патчим -> ResumeThread -> ExitProcess




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 19 июля 2013 17:16
· Личное сообщение · #20

DillerInc

О чём тут вообще речь, не понимаю

| Сообщение посчитали полезным: ajax

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 19 июля 2013 18:14 · Поправил: Kuzya69
· Личное сообщение · #21

ajax пишет:
файл с диска возможно считать/отмапить
А можно ссылочку на аналогичный код?
Vovan666 пишет:
...сначала читаем файл -> ищем искомое место (по сигнатуре или как нибудь еще) -> RVA to VA минус imagebase -> CreateProcess SUSPENDED -> ...
Сам файл упакован и распаковывается в памяти. Искать сигнатуры и вычислять место патча приходится именно в памяти. Или я вас неправильно понял?
void
Спасибо за примеры кода. пробую разобраться, почему я не могу считать определенную область из памяти в буфер. Вернее ReadProcessMemory в последнем параметре выдает, что считал например 10 байт, но при попытке перезаписать эти байты из буфера в файл или вывести на печать, срабатывают эксепшоны:
1) Application Error
Exception EExternalException in module ntdll.dll at 0000e4ff. External exception C0000008.
2) Application Error
Exception EAccessViolation in module Loader1.exe at 00005924. Access violation at address 00405924 in module 'Loader1.exe'. Write of address 63206D59.
Видимо я или с адресацией напутал, или с типами переменных. Не думайте, я не прошу написать за меня код. Попробую сам разобраться, как правильно пользоваться этими АПИ, и как работать с памятью процесса, спасибо и за то, что вы уже выложили.
Я просто поясняю почему "затих".




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 19 июля 2013 18:28 · Поправил: ajax
· Личное сообщение · #22

Kuzya69 пишет:
Сам файл упакован и распаковывается в памяти

только из памяти тогда. валится - что-то из параметров не так пользуешь.
стоп. а как ты узнаешь, что он уже в памяти типа распаковался?

добавил: тогда все уже рассказали, кодь

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 19 июля 2013 18:39 · Поправил: Kuzya69
· Личное сообщение · #23

ajax пишет:
а как ты узнаешь, что он уже в памяти типа распаковался?
Ставлю паузу. Когда использую готовый лоадер, то и 3-х секунд для паузы хватает, чтоб потом правильно пропатчить.
Code:
  1.   
  2.   //...................................... 
  3.  if CreateProcess(nil,'exper.exe',nil,nil,FALSE,Create_Suspended,nil,nil,si,pi)=true then
  4.       begin
  5.         ResumeThread(pi.hThread);
  6.         sleep(4000);
  7.         ReadProcessMemory(pi.hProcess,Pointer(Address),@Old,10,NBW);
  8. //...................................





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 19 июля 2013 22:49
· Личное сообщение · #24

DillerInc пишет:
Похоже, что влияние клерка не проходит бесследно...

Ой, и меня посчитали

Kuzya69 пишет:
Ставлю паузу. Когда использую готовый лоадер, то и 3-х секунд для паузы хватает

В зависимости от языка, на котором писалась прога, в начале обязательно вызываются специфические ф-ции. Даже после распаковки. VirtualAlloc, например, но не факт. Перехватывая её, мы знаем что уже всё распаковалось.

Ну в этом духе более точнее )

-----
IZ.RU




Ранг: 27.8 (посетитель), 51thx
Активность: 0.030
Статус: Участник

Создано: 20 июля 2013 05:20 · Поправил: ADMIN-CRACK
· Личное сообщение · #25

В тему вопрос.
Вот если я нахожу имя файла

MSIMG32 proc hInstDLL:DWORD

fn GetModuleFileName,0,OFFSET fName,128h
fn CreateFile,[OFFSET fName],GENERIC_READ,0,0,OPEN_EXISTING,0,0
MOV[FileHandle],EAX
fn GetFileSize,[FileHandle],0
CMP EAX,1E6F30h
JNZ @EXIT
fn CloseHandle,[FileHandle]
fn GetModuleFileName,0,OFFSET fName,256h
fn LoadLibrary,OFFSET fName
ADD EAX,2BFCD0h
MOV EBX,EAX
fn VirtualProtect,EBX,4h,PAGE_EXECUTE_READWRITE,ADDR old_addr
MOV BYTE PTR DS:[EBX],033h
MOV BYTE PTR DS:[EBX+1],0C0h
MOV BYTE PTR DS:[EBX+2],040h
MOV BYTE PTR DS:[EBX+3],0C3h
@EXIT:
MOV EAX,1
LEAVE
RETN 2Ch

MSIMG32 Endp

Это заголовок библы.
как там пропатчить по сигнатуре?
С лодырем понятно все.
А с загружаемой библы не совсем.
Буду благодарен за советы.



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 20 июля 2013 07:08
· Личное сообщение · #26

ADMIN-CRACK, на форуме уже кто-то давно выкладывал исходник, поищи.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 20 июля 2013 10:20
· Личное сообщение · #27

ADMIN-CRACK
у автора dup2 было что-то фришное на масме для поиска паттернов

PS: так не красивее?

ADD EAX,2BFCD0h
push eax
fn VirtualProtect,EAX,4h,PAGE_EXECUTE_READWRITE,ADDR old_addr
pop eax
MOV DWORD PTR [EAX],0C340C033h
fn VirtualProtect,EAX,4h,old_addr,ADDR tmp_addr ; не забывай возвращать аттрибуты

@EXIT:
xor eax,eax
inc eax
LEAVE
RETN 2Ch

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 20 июля 2013 10:29
· Личное сообщение · #28

ajax пишет:
у автора dup2 было что-то фришное на масме для поиска паттернов

в аттаче

afd4_20.07.2013_EXELAB.rU.tgz - d2k_patchengine.rar



Ранг: 27.8 (посетитель), 51thx
Активность: 0.030
Статус: Участник

Создано: 23 июля 2013 20:27 · Поправил: ADMIN-CRACK
· Личное сообщение · #29

ajax
Благодарю.
Это уже есть в принципе давно.
Это я так со старого исходника на скорую руку вставил.

Vovan666
Этим давно пользуюсь для патча екзешки.
Дьявол сам не сделал такой штуки без помощи отдельного файла с шаблоном.
Мне интересно немного другое.
Поиск сигнатур в памяти.
У меня подгружаемая длл, и из неё при старте проги нужно найти косяк и устранить его.
Собственно вопрос как, найти в памяти этого проца эти данные.
А как исправить это не вопрос.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 23 июля 2013 21:45
· Личное сообщение · #30

ADMIN-CRACK

я под это когда-то адаптировал этот исходник
http://www.manhunter.ru/assembler/261_postroenie_karti_pamyati_processa.html

грубо говоря после
Code:
  1. @@:
  2.         test    [mbi.Protect],40h       ; PAGE_EXECUTE_READWRITE
  3.         jz      @f


добавил readprocessmemory и там уже искал


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


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