Сейчас на форуме: bartolomeo, -Sanchez- (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Лоадер на асме-е с поиском сигнатуры
Посл.ответ Сообщение


Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 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

ПыС. Думаю, этот код будет полезен всем новичкам.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 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 не угодил?




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 13 февраля 2006 12:19
· Личное сообщение · #3

asd пишет:
а) осуществлял автоматический поиск адреса, по которому расположены искомые байты
В каком смысле? Т.е. исходя из каких принципов он его должен искать.


В прямом: есть искомая последовательность байт, необходимо найти адрес в памяти (в контексте загруженного лоадером процесса), по которому она находится (первое вхождение).

asd пишет:
б) учитывал командную строку
GetCommandLine(VOID)


А ввиде кода? Как корректно поместить commandline во второй push перед call CreateProcessA?



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 13 февраля 2006 12:32
· Личное сообщение · #4

пару лет назад я писал такой, на fasm'е

1cbf_Loader.asm.zip



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 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 ; Функция создания нового процесса




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 13 февраля 2006 12:52
· Личное сообщение · #6

asd пишет:
б) Никогда не пробовал с ней работать, но наверно так:
call GetComandLine
mov hcl,eax


Х-мм, не пашет. hcl - как правильно инициализировать?



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 13 февраля 2006 13:02
· Личное сообщение · #7

hcl dd 0 впрочем не принимай мой код, как истину, я же сказал, что не прробовал.




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 13 февраля 2006 14:01
· Личное сообщение · #8

Понятно, что командную строку нужно передать во второй параметр функции CreateProcessA, т.е. запихать в I_StartupInfo. А вот как это сделать



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 13 февраля 2006 19:11
· Личное сообщение · #9

Как я понял тебе нужно вызвать прогу с теми-же параметрами, с какими ты вызываешь лоадер.
Попробуй сделать так:
Возьми строку, которую тебе выдала функция GetComandLine, и считай то, что находится после текста .exe параметром и дописывай её к твоей строке File_Name (тока наверное надо сначала выделить память под новую строку, затем туда по очереди запихнуть File_Name и твои параметры и уже эту строку передать функции CreateProcess в lpCommandLine)
Всё делается через функции lstrcat,lstrcmp,lstrcpy



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 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

Наверное должно быть как-то так.




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 15 февраля 2006 13:23
· Личное сообщение · #11

Спасибо, буду разбираться.



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 15 февраля 2006 13:40
· Личное сообщение · #12

что-то пример моего интеллектуального лоадера никого не заинтересовал =) ,

а ведь просто так ждать распаковки по типу:

Wait4Unpack:
push 100h ; Timeout (в миллисекундах)
push dword ptr [H_ProcessInfo] ; идентификатор процесса
call WaitForInputIdle ; функция ожидания

- неправильное решение ;)



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 15 февраля 2006 15:13 · Поправил: Klajnor
· Личное сообщение · #13

Asterix, скачал, но сразу не стал разбираться, потому что
include 'ParseBuffer.inc' - такого файла у меня нет

А вцелом сделано более грамотно, YDS советую тебе посмотреть.
И ещё возник такой вопрос : где нужно зацикливать прогу? На OEP или на прыжке на него?

[EDITED]
где нужно зацикливать прогу? На OEP или на прыжке на него? - Да! Ну и глупость я сказал =)
Если алгорит такой :
1) Где-то ставим джам, чтобы прога зациклилась
2) Ждем распаковки
3) Убираем джам
4) Патчим
5) Отпускаем процесс

Значит джам ставим вместо джампа на OEP =)



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 15 февраля 2006 15:45 · Поправил: Asterix
· Личное сообщение · #14

Klajnor пишет:
include 'ParseBuffer.inc' - такого файла у меня нет


никто не спросил этот файл, значит никому не интересно или никто не смотрел на код

Klajnor пишет:
Значит джам ставим вместо джампа на OEP =)


не обязательно, ставим там где удобнее =)



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 15 февраля 2006 16:06
· Личное сообщение · #15

Asterix пишет:
никто не спросил этот файл, значит никому не интересно или никто не смотрел на код

У меня и то и другое. На асме начал писать совсем недавно( межет быть неделю назад, а до этого ни разе не пробовал). Поэтому 2 дня назад, когда асм мне выдал ошибку, что файла нет, у меня отпало всякое желание смотреть код. Сёдня посмотрел и вроде даже всё понял =)
Ща вообще стараюсь хоть сколько-то участвовать в обсуждениях связанных а ассемблером( так вроде легче понимать)
А чё за файл? Приаттач plz, может и мне пригодится



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 15 февраля 2006 16:36
· Личное сообщение · #16

.

c6d4_ParseBuffer.inc.zip



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 15 февраля 2006 16:39
· Личное сообщение · #17

одно важное уточнение, в моем коде байты, которые должны пропускаться при поиске,
в сигнатуре нужно заменять 0

но несложно переделать алго под себя если 0 не устраивает



Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 15 февраля 2006 18:07
· Личное сообщение · #18

Спасибо, хотя пишлось кое что подправить ( return заменить на ret, и дописать в конце endp)



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 15 февраля 2006 19:29
· Личное сообщение · #19

Klajnor пишет:
хотя пишлось кое что подправить ( return заменить на ret, и дописать в конце endp)


да, фасм немного видоизменился в части макросов proc за два года %)


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


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