DLL注入
DLL被加载到进程的时候会自动运行DLLMain()函数,可以把想执行的代码放到DLLMain()函数里
DLL的入口函数主要有四种:
DLL_PROCESS_ATTACH:第一次加载DLL时执行
DLL_PROCESS_DETACH:调用FreeLibrary时执行
DLL_THREAD_ATTACH:调用DLL时执行
DLL_THREAD_DETACH:删除DLL时执行
DLL注入主要使用三种方法:
1.创建远程线程CreateRemoteThread()
代码实现主要步骤为:
1.使用OpenProcess()返回获得目标进程的句柄
2.计算DLL的路径长度,并且要加上0结尾,VirtualAllocEx()在目标进程中分配内存,储存dll路径
3.使用WriteProcessMemory()在目标进程的内存中写入数据,将dll路径写入目标进程里
4.GetModuleHandle()获取kernel32模块的地址,再使用GetProcAddress()获取模块中LoadLibrary地址(只要dll和目标进程位于同一台主机,那么LoadLibrary的地址就一致)
5.CreateRemoteThread()创建远程线程加载dll,通过dll入口函数DLL_PROCESS_ATTACH执行代码
2.使用注册表AppInit_DLLs值
直接在注册表里编辑HKEY_LOCAL_MACHINE\SOFEWARE\Microsoft\Windows NT\CurrentVersion\Windows修改AppInit_DLLs的值,数据为DLL的路径,再把数值数据改为1,只要user32.dll被调用,就会加载到进程
3.消息勾取SetWindowsHookEx()
利用钩子由OS将DLL注入到相应进程
也可以通过修改PE来加载DLL
IMAGE OPTIONAL_HEADER的IMPORT Table RVA就是IDT的RVA
查看IDT是否有足够的空间,一个IID结构体14字节,如果没有足够空间可以考虑把IDT转移到文件的空白区域,也可以增加文件最后一个节区的大小,或者在文件的末尾新增一个节区
主要步骤为:
1.修改导入表的RVA值,即IMAGE OPTIONAL_HEADER的IMPORT Table RVA
2.删除绑定导入表,IMAGE OPTIONAL_HEADER的BOUND IMPORT Table的RVA全改为0
3.创建新的IDT,先复制原IDT,然后在尾部写入新的IID,IID的编写主要分为三个参数:(Name,INT,IAT)的RVA值
IAT:ordinal和函数名
NAME:DLL名
IAT:可与INT相同
4.修改IAT节区的属性值,在.rdata节区头,向characteristics添加IMAGE_SCN_MEM_WRITE(80000000),再执行bit or运算,最终属性值变为c0000040即可
DLL卸载
主要目的就是驱使目标进程调用FreeLibrary()
实现步骤主要为:
1.使用CreateToolhelp32Snapshot()获取加载的DLL名称
2.使用OpenProcess()返回获得目标进程的句柄
3.GetModuleHandle()获取kernel32模块的地址,再使用GetProcAddress()获取模块中FreeLibrary地址
4.CreateRemoteThread()创建远程线程调用FreeLibrary()卸载DLL
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2021-6-12 19:24
被wx_dopeusa91编辑
,原因: