В сети очень подробно расписан сплайсинг функций с использованием Dll. В статье "От зеленого к красному" встретил такой код: Код (Text): .data code1 label byte db 68h ;ОПКОД команды PUSH Hooker1 dd 0 ;ОПЕРАНД команды PUSH db 0c3h ;ОПКОД RET size_code1 equ $-code1 ...... .data? Old_Code1 db size_code1 dup (?) ...... .code SetHook1 proc NameFunc:dword,NameModul:dword invoke GetModuleHandle,NameModul invoke GetProcAddress,eax,NameFunc mov RealAddr1,eax;сохраняем адрес перехватываемой функции invoke ReadProcessMemory,-1,RealAddr1,offset Old_Code1,size_code1,0 mov Hooker1,offset Hooker invoke WriteProcessMemory,-1,RealAddr1,offset code1,size_code1,0 ret SetHook1 endp Подскажите пожалуйста, как бы выглядел сам перехватчик и обращение к нему в SetHook1 в базонезависимом коде.
очень приблизительно так (это перехват DllEntryPoint): Код (Text): label_main: dd hook_size dd offset label_delta dd offset label_proc dd 0 label_entry: ; db 0cch push eax push ecx push eax push ecx push edx call @F @@: pop ecx sub ecx,(@B-label_entry) db 0b8h label_delta: dd 0 lea edx,[ecx+(label_return-label_entry)] mov [esp+010h],edx mov byte ptr [ecx],0c2h mov word ptr [ecx+001h],0ch db 0b8h label_proc: dd 0 lea ecx,[ecx+eax] mov edx,[ecx] mov [esp+00ch],edx pop edx pop ecx pop eax retn label_return: push 1 pop eax retn 0ch hook_size equ $-label_entry а тебе зачем это ?
Просто испорченный объектным программированием недоделанный кодер пытается сделать инжект с перехватом, без dll =) .....и попутно выучить asm, ну может быть написать ламерский вирус Прости мою наглость, но не мог бы ты поподробнее расписать?
тоесть ты хочешь в WriteProcessMemory передать адресс кода с перехватом(который традиционно и лежит в длл) а не кода загрузки длл?
Просто как не пытаюсь - не могу привести перехватчик, приведенный в моем примере, в соответствие с тем кодом, который привел z0mailbox (непонятен принцип). Сказывается неопытность.....ну может и мозги подкачали
z0mailbox приводил код в ответ на вопрос о базонезависимом коде, ты же говоришь о перехвате без дополнительных длл.
Тогда повторюсь, чтобы не создавать путаницы: есть фрагмент (пример) кода сплайсинга. Код (Text): .data (1)code1 label byte (2) db 68h ;ОПКОД команды PUSH (3) Hooker1 dd 0 ;ОПЕРАНД команды PUSH - здесь код "прыжка" на обработчик (4) db 0c3h ;ОПКОД RET (5)size_code1 equ $-code1 ...... .data? (6)Old_Code1 db size_code1 dup (?) RealAddr1 DWORD ? ...... .code SetHook1 proc NameFunc:dword,NameModul:dword invoke GetModuleHandle,NameModul invoke GetProcAddress,eax,NameFunc mov RealAddr1,eax;сохраняем адрес перехватываемой функции invoke ReadProcessMemory,-1,RealAddr1,offset Old_Code1,size_code1,0 mov Hooker1,offset Hooker invoke WriteProcessMemory,-1,RealAddr1,offset code1,size_code1,0 ;здесь устанавливаем прыжок ret SetHook1 endp Где Hooker - сам обработчик. Меня интересует, как будут выглядеть код перехода со связанными метками и переменными (1-6) в базонезависимом коде, и как будет выглядеть их использование в ReadProcessMemory\WriteProcessMemory.
Вышеприведенный принцип базонзависимого кода (кстати, этим принципом вирусы под ДОС часто пользовались) 1)Делаем call на следующую команду. call @@1 @@1: 2)Берем из стека реальный адрес @@1 pop eax 3)все остальные обращения к памяти должны идти из расчета смещения (eax-@@1) т.е при компиляции кода у тебя смещение метки @@1 было одно, но сейчас стало другим, и разницу куда-то нужно приткнуть )
Спасибо, это понятно. Тогда адрес какой-либо переменной или функции будет выглядеть как "offset Name + Дельта". Но каким образом в масме сделать "Old_Code1 db size_code1 dup (?)" (мет. 6) с использованием дельта смещения? Ведь здесь одна переменная служит параметром, определяющим размер другой переменной.
переменная не может быть использована как параметр размера другой переменной, компилятор на этапе компиляции должен знать размер всех переменных в коде, чтобы сгенерировать EXE, а значение переменной будет известно только на этапе выполнения программы. зы. а нафиг при сплайсинге нужен базонезависимый код и вычисление дельта-смещения?
Но тогда как понять "Old_Code1 db size_code1 dup (?)"? Ведь получается, что size_code1 указывает на кол-во выделяемых байт. Дак ведь смотря для каких целей=) Зачем exe+dll, если можно просто exe?
а нафиг в сплайсинге DLL? длл там не нужна совсем. прочитай мою статью про сплайсинг, там пример есть. чистая EXE, никакого базонезависимого кода и прочего геморроя.
По поводу идеи переноса полного образа файла в процесс читал в каком-то из номеров хакера, только там с объяснениями не заморачивались. В статье, вроде, все понятно. Большое спасибо=)
дык это же элементарно. идея такова - ставят себе большую базу, далее выделяют по этому адресу в другом адресном пространстве память, равную по размеру размеру нашего исполняемого образа. Дальше постранично копируют свое тело в чужое адресное пространство, но по тем же виртуальным адресам. После такой операции все будет работать чики-пики, т.к. все нужное мы скопировали. Можно ставить сплайсинг на наши адреса и все ништяк.
Оно конечно хорошо, только рано или поздно - налетим на длл чью-нибудь. Или на такую же нестандартную базу.