Показать сообщение отдельно

  #10  
Старый 30.09.2007, 15:46
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами: 9981026

Репутация: 1564
По умолчанию

Теперь и под 2000 работает и под XP, все-таки доделала.... Суть в том, что вся процедура копируется в выделенную память. Конец процедуры определяется по опкоду рет xxxx. Написала для этого функцию. В качестве первого ее аргумента принимается адрес функции, в качестве второго - адрес загрузки библиотеки ntdll. Ясное дело, что без нормального дизассемблера длин тут не обойтись. Поэтому я встроила VirXasm32 (на васме можно взять), вы же можете другой встроить или свой написать. Лишь бы длина инструкции возвращалась в eax. Теперь не надо никаких характеристик секций менять, как раньше. все просто и удобно)))

Процедуре необходимо

Код:
.data
ntdl_ db "ntdll.dll",0 
buf_ db 300 dup(?)
sl db "\",0
Сам код
Код:
procedurecopy proc address_function:dword,imagebase:dword
; в eax возвращается адрес украденного кода, в edx - его размер. Если ошибка - регистры пусты
; освободить выделенную память вы должны сами! С помощью VirtualFree 
local hFile:dword
local dwSize:dword
local hMap:dword
local Base:dword
local rva:dword
local codesize:dword
mov edi,address_function
sub edi,imagebase
mov rva,edi
invoke GetSystemDirectory,offset buf_,255 ; системная директория
test eax,eax
je ret_
invoke lstrcat,offset buf_,offset sl ; формируем путь к ntdll
invoke lstrcat,offset buf_,offset ntdl_ 
invoke CreateFile,offset buf_,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
mov hFile,eax
inc eax
jz ret_
invoke GetFileSize,hFile, NULL
test eax,eax
jz ret_
mov dwSize,eax
invoke CreateFileMapping,hFile, NULL,1000002h, 0, dwSize, NULL
mov hMap,eax
invoke MapViewOfFile,hMap, FILE_MAP_READ, 0, 0, dwSize
mov Base,eax
test eax,eax
je ret_
add eax,rva
mov rva,eax
mov esi,eax
mov eax,codesize ; это на байт короче, чем mov codesize,0
xor codesize,eax
disasm:
call VirXasm32 ; дизассемблер длин. любой вам понравившийся, можно даж самопальный ;-)
cmp al,3 ; длина инструкции три байта? проверяем не ret xxxx?
jz pr_ ; проверяем на рет 
add codesize,eax ; если длина другая - идем дизасмить дальше, прибавляем длину к общей длине кода
add esi,eax ; к esi добавляем длину инструкции
jmp disasm 
pr_:
cmp byte ptr[esi],0c2h ; начало инструкции ret xxxx
jnz disasm_ ; идем дальше
jmp end_dasm_
disasm_:
add esi,eax
jmp disasm
end_dasm_:
add codesize,eax
inc codesize
invoke VirtualAlloc,0,codesize,MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE	
test eax,eax
je ret_
mov esi,rva
mov edi,eax
mov rva,eax
mov ecx,codesize
rep movsb 	 
invoke UnmapViewOfFile,Base
invoke CloseHandle,hMap
invoke CloseHandle,hFile
mov eax,rva
mov edx,codesize
jmp rt
ret_:
sub eax,eax ; если ошибка, то обнуляем
sub edx,edx
rt:
ret
procedurecopy endp

emulator_vir_protect proc  hProcess:dword,lpAddress:dword,dwSize:dword,flNewProtect:dword,lpflOldProtect:dword,addr_native:dword
 ; теперь добавился еще один параметр. адрес, по которому располагается native функция. то, что вернула в eax procedurecopy 
push lpflOldProtect
push flNewProtect
lea eax,dwSize
push eax
lea eax,lpAddress
push eax
push hProcess
call addr_native
ret
emulator_vir_protect endp

Последний раз редактировалось 0x0c0de; 30.09.2007 в 15:49..
 
Ответить с цитированием