eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: LoxmatbIj (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

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

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

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


Ранг: 1986.7 (!!!!)
Статус: Модератор
retired

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

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


Ранг: 296.9 (наставник)
Статус: Участник

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

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

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

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

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

Ранг: 211.3 (наставник)
Статус: Участник

Создано: 18 июля 2013 17:01 New!
Цитата · Личное сообщение · #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

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


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

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

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

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

Ранг: 617.3 (!)
Статус: Участник

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

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

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

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

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

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

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

Ранг: 211.3 (наставник)
Статус: Участник

Создано: 18 июля 2013 19:27 · Поправил: void New!
Цитата · Личное сообщение · #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: надеюсь следующим твоим вопросом не будет "ребят, я чет туплю, напишите за меня"


Ранг: 1986.7 (!!!!)
Статус: Модератор
retired

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

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

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

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

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

Ранг: 211.3 (наставник)
Статус: Участник

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

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

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

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

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


Ранг: 283.6 (наставник)
Статус: Участник
Author of GeTaOEP

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

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

...а?

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


Ранг: 617.3 (!)
Статус: Участник

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

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

Ранг: 211.3 (наставник)
Статус: Участник

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

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

ring0, лол


Ранг: 296.9 (наставник)
Статус: Участник

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

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

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


Ранг: 283.6 (наставник)
Статус: Участник
Author of GeTaOEP

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

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


Ранг: 331.3 (мудрец)
Статус: Участник
born to be evil

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

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

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

Ранг: 617.3 (!)
Статус: Участник

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

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


Ранг: 72.3 (постоянный)
Статус: Участник

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

DillerInc

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

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


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

Создано: 19 июля 2013 18:14 · Поправил: Kuzya69 New!
Цитата · Личное сообщение · #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.
Видимо я или с адресацией напутал, или с типами переменных. Не думайте, я не прошу написать за меня код. Попробую сам разобраться, как правильно пользоваться этими АПИ, и как работать с памятью процесса, спасибо и за то, что вы уже выложили.
Я просто поясняю почему "затих".


Ранг: 331.3 (мудрец)
Статус: Участник
born to be evil

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

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

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

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

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

Создано: 19 июля 2013 18:39 · Поправил: Kuzya69 New!
Цитата · Личное сообщение · #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. //...................................


Ранг: 296.9 (наставник)
Статус: Участник

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

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

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

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

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

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

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

Создано: 20 июля 2013 05:20 · Поправил: ADMIN-CRACK New!
Цитата · Личное сообщение · #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 (ветеран)
Статус: Участник

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

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


Ранг: 331.3 (мудрец)
Статус: Участник
born to be evil

Создано: 20 июля 2013 10:20 New!
Цитата · Личное сообщение · #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 (!)
Статус: Участник

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

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

в аттаче

{ Атач доступен только для участников форума } - d2k_patchengine.rar

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

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

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

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

Ранг: 617.3 (!)
Статус: Участник

Создано: 23 июля 2013 21:45 New!
Цитата · Личное сообщение · #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 —› Вопросы новичков —› Подскажите, каким генератором лоадера такое можно сделать.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS