Сейчас на форуме: bartolomeo, -Sanchez- (+4 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Лоадер на асме-е с поиском сигнатуры |
Посл.ответ | Сообщение |
|
Создано: 13 февраля 2006 08:59 · Личное сообщение · #1 В асм-е я пока слабоват. Помогите доработать лоадер, код которого приведен ниже, чтобы он: а) осуществлял автоматический поиск адреса, по которому расположены искомые байты б) учитывал командную строку ;============Start Loader code============ ; Замечание: Чтобы вызвать системную функцию Windows, программа должна поместить в стек все параметры от последнего к первому, т.е. функция MessageBoxA будет вызываться следующим образом: ;push uType ;push lpCaption ;push lpText ;push hWnd ;call MessageBoxA .386P Locals jumps .Model Flat ,StdCall ;Вызываемые системные функции Extrn MessageBoxA:PROC Extrn WaitForInputIdle:PROC Extrn WriteProcessMemory:PROC Extrn ReadProcessMemory:PROC Extrn CreateProcessA:PROC Extrn CloseHandle:PROC Extrn ExitProcess:PROC .Data A_Tag db 'Programma.exe loader',0 ; название лоадера B_Error db 'Error',0 D_txt db 'Programma.exe not found! Copy this file into program folder and run again',0 E_txt db 'ReadProcessMemory Error',0 F_txt db 'WriteProcessMemory Error',0 G_txt db 'Error of installation! Maybe version missmatch!',0 H_ProcessInfo dd 4 dup (0) ;индификатор процесса I_StartupInfo db 48h dup (0) ; определяет главное окно для нового процесса J_RPBuffer db 10h dup (0) ;буфер куда будут считываться данные File_Name db 'Programma.exe',0 fo dd 4512C4h ; адрес от куда начнем считывать данные sizeof dd 5 checkbytes db 055h,08bh,0ech, 081h, 0c4h ; байты, которые будем искать ;если их нет, значит мы имеем дело сдругой версией проги patch_data_1 db 0b0h,01h,0c3h patch_size_1 dd 3 patch_addr_1 dd 4512C4h .Code Main: push offset A_Tag mov dword ptr [I_StartupInfo],44h ; Размер в байтах структуры push offset H_ProcessInfo push offset I_StartupInfo ; Указатель на структуру StartupInfo push 0 push 0 push 20h ; Флаги cоздания push 0 push 0 push 0 push 0 push offset File_Name ; Указатель на имя выполняемого модуля call CreateProcessA ; Функция создания нового процесса test eax,eax jz OpenERR ; Если ZF=0, прыжок на сообщение об ошибке Wait4Unpack: push 100h ; Timeout (в миллисекундах) push dword ptr [H_ProcessInfo] ; идентификатор процесса call WaitForInputIdle ; функция ожидания Check_Data: ; проверка данных ;Функция ReadProcessMemory считывает в буфер определенный кусок памяти указанного процесса push 0 push dword ptr [sizeof] ; Длина push offset J_RPBuffer ; Буфер куда будем считывать данные push dword ptr [fo] ; Смещение от куда начнем считывать push dword ptr [H_ProcessInfo] ; идентификатор процесса, память которого мы будем читать call ReadProcessMemory test eax,eax jz ReadERR ; Если ZF=0, прыжок на сообщение об ошибке cld ;сбросить флаг направления (DF=0) lea esi, J_RPBuffer lea edi, checkbytes mov ecx, 3 rep cmpsb jnz VersionERR ; Если не найдены нужные байты, то прыжок на сообщеие о том, что хреновая версия проги, либо у cracker`а были кривые руки ;) Patch_that_ass: ; начинаем патчить... push 0 push dword ptr [patch_size_1] ; Длина push offset patch_data_1 ; Указатель на буфер с данными, которые будем писать push dword ptr [patch_addr_1] ; Адрес от куда начинаем патчить push dword ptr [H_ProcessInfo] ; Самое главное……процесс, который будем патчить call WriteProcessMemory ; paTch! Patch! test eax,eax jz WriteERR ; fUcK!…..ошибка записи ;( ... Close_This_app: push dword ptr [H_ProcessInfo] call CloseHandle push dword ptr [H_ProcessInfo+4] call CloseHandle Exit_Proc: Push LARGE-1 ; код выхода Call ExitProcess ;завершение программы VersionERR: lea eax, G_txt ; в eax 'Не та версия проги …' jmp abort_msg ReadERR: lea eax, E_txt ; в eax 'ReadProcessMemory Error' jmp abort_msg OpenERR: lea eax, D_txt ; в eax 'CreateProcess Error' jmp abort_msg WriteERR: lea eax, F_txt ; в eax 'WriteProcessMemory Error' abort_msg: push 10h ;Стиль окна push offset B_Error ; адрес строки с заголовком push eax ; адрес строки с сообщением push 0 call MessageBoxA jmp Close_This_app End Main ПыС. Думаю, этот код будет полезен всем новичкам. ![]() |
|
Создано: 13 февраля 2006 11:20 · Личное сообщение · #2 YDS а) осуществлял автоматический поиск адреса, по которому расположены искомые байты В каком смысле? Т.е. исходя из каких принципов он его должен искать. б) учитывал командную строку GetCommandLine(VOID) Parameters This function has no parameters. Return Values The return value is a pointer to the command-line string for the current process. P.S. А чем тебе invoke не угодил? ![]() |
|
Создано: 13 февраля 2006 12:19 · Личное сообщение · #3 asd пишет: а) осуществлял автоматический поиск адреса, по которому расположены искомые байты В каком смысле? Т.е. исходя из каких принципов он его должен искать. В прямом: есть искомая последовательность байт, необходимо найти адрес в памяти (в контексте загруженного лоадером процесса), по которому она находится (первое вхождение). asd пишет: б) учитывал командную строку GetCommandLine(VOID) А ввиде кода? Как корректно поместить commandline во второй push перед call CreateProcessA? ![]() |
|
Создано: 13 февраля 2006 12:32 · Личное сообщение · #4 |
|
Создано: 13 февраля 2006 12:39 · Личное сообщение · #5 a)--> Link <-- б) Никогда не пробовал с ней работать, но наверно так: call GetComandLine mov hcl,eax push offset A_Tag mov dword ptr [I_StartupInfo],44h ; Размер в байтах структуры push offset H_ProcessInfo push offset I_StartupInfo ; Указатель на структуру StartupInfo push 0 push 0 push 20h ; Флаги cоздания push 0 push 0 push 0 push hcl push offset File_Name ; Указатель на имя выполняемого модуля call CreateProcessA ; Функция создания нового процесса ![]() |
|
Создано: 13 февраля 2006 12:52 · Личное сообщение · #6 |
|
Создано: 13 февраля 2006 13:02 · Личное сообщение · #7 |
|
Создано: 13 февраля 2006 14:01 · Личное сообщение · #8 |
|
Создано: 13 февраля 2006 19:11 · Личное сообщение · #9 Как я понял тебе нужно вызвать прогу с теми-же параметрами, с какими ты вызываешь лоадер. Попробуй сделать так: Возьми строку, которую тебе выдала функция GetComandLine, и считай то, что находится после текста .exe параметром и дописывай её к твоей строке File_Name (тока наверное надо сначала выделить память под новую строку, затем туда по очереди запихнуть File_Name и твои параметры и уже эту строку передать функции CreateProcess в lpCommandLine) Всё делается через функции lstrcat,lstrcmp,lstrcpy ![]() |
|
Создано: 14 февраля 2006 20:53 · Личное сообщение · #10 Если ещё нужно, то привожу часть кода из Loaddll.exe 00410083 |. E8 160A0000 CALL <JMP.&KERNEL32.GetCommandLineA> ; [GetCommandLineA 00410088 |. 8BF0 MOV ESI,EAX 0041008A |. 46 INC ESI 0041008B |> 8A06 /MOV AL,BYTE PTR DS:[ESI] 0041008D |. 46 |INC ESI 0041008E |. 0AC0 |OR AL,AL 00410090 |. 75 0F |JNZ SHORT loaddll.004100A1 00410092 |. C705 20004200 >|MOV DWORD PTR DS:[420020],loaddll.00420>; ASCII "Missing DLL name" 0041009C |. E9 EB010000 |JMP loaddll.0041028C 004100A1 |> 3C 22 |CMP AL,22 004100A3 |.^75 E6 \JNZ SHORT loaddll.0041008B 004100A5 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] 004100A7 |. 3C 20 |CMP AL,20 004100A9 |. 75 03 |JNZ SHORT loaddll.004100AE 004100AB |. 46 |INC ESI 004100AC |.^EB F7 \JMP SHORT loaddll.004100A5 Там всё сделано не совсем так, как я сначала сказал. Этот код получает ключ, к которым у тебя запущен ехе-шник. В ESI буде указатель на ключ, или если его нет, то произойдёт этот джамп: 0041009C |. E9 EB010000 |JMP loaddll.0041028C Зате я бы сделал так: ; Это вставляешь туда, где у тебя определение переменных ~^~^~^~^~^ S dd ? FimeName db 'abc.exe ',0; Имя проги для запуска ~^~^~^~^~^ invoke GlobalAlloc,GMEM_FIXED,1024 invoke GlobalLock,eax; mov [S],eax invoke lstrcat,[S],FileName ; Переписываешь код, который я привёл выше invoke lstrcat,[S],ESI И передаешь S, как lpCommandLine Наверное должно быть как-то так. ![]() |
|
Создано: 15 февраля 2006 13:23 · Личное сообщение · #11 |
|
Создано: 15 февраля 2006 13:40 · Личное сообщение · #12 |
|
Создано: 15 февраля 2006 15:13 · Поправил: Klajnor · Личное сообщение · #13 Asterix, скачал, но сразу не стал разбираться, потому что include 'ParseBuffer.inc' - такого файла у меня нет А вцелом сделано более грамотно, YDS советую тебе посмотреть. И ещё возник такой вопрос : где нужно зацикливать прогу? На OEP или на прыжке на него? [EDITED] где нужно зацикливать прогу? На OEP или на прыжке на него? - Да! Ну и глупость я сказал =) Если алгорит такой : 1) Где-то ставим джам, чтобы прога зациклилась 2) Ждем распаковки 3) Убираем джам 4) Патчим 5) Отпускаем процесс Значит джам ставим вместо джампа на OEP =) ![]() |
|
Создано: 15 февраля 2006 15:45 · Поправил: Asterix · Личное сообщение · #14 |
|
Создано: 15 февраля 2006 16:06 · Личное сообщение · #15 Asterix пишет: никто не спросил этот файл, значит никому не интересно или никто не смотрел на код У меня и то и другое. На асме начал писать совсем недавно( межет быть неделю назад, а до этого ни разе не пробовал). Поэтому 2 дня назад, когда асм мне выдал ошибку, что файла нет, у меня отпало всякое желание смотреть код. Сёдня посмотрел и вроде даже всё понял =) Ща вообще стараюсь хоть сколько-то участвовать в обсуждениях связанных а ассемблером( так вроде легче понимать) А чё за файл? Приаттач plz, может и мне пригодится ![]() |
|
Создано: 15 февраля 2006 16:36 · Личное сообщение · #16 |
|
Создано: 15 февраля 2006 16:39 · Личное сообщение · #17 |
|
Создано: 15 февраля 2006 18:07 · Личное сообщение · #18 |
|
Создано: 15 февраля 2006 19:29 · Личное сообщение · #19 |
![]() |
eXeL@B —› Вопросы новичков —› Лоадер на асме-е с поиском сигнатуры |