1.实验环境 win7 32
2.工具 VS2010 (默认编译选项)+ procexp.exe (优秀进程查看工具)
DLl注入背景:
将代码写入其他正在运行的进程空间
优点:
可以修改特定程序的bug,完善功能(对于无源码的程序)等等
基本方式:
1.消息勾取 (利用SetwindowsHooklEx())
2.创建远程线程
3.利用注册表(LoadApp_initDlls appInit_dlls)
4.手工修改PE文件方式加载DLL
1.消息勾取
此方法具体讲解及代码请参考
《《基础dll注入 ,基于C语言》》 上篇文章
2.创建远程线程方法:
1.先利用OpenProcess()打开制定PID进程返回资源句柄HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid)具体参数请参考 msdn
2.利用 VirtualAllocEx()为Dll申请内存
LPVOID lpMolloc = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);
3.写进远程进程缓冲区将dllWriteProcessMemory(hProcess, lpMolloc, (LPVOID)szDllPath, dwSize, 0)
4.获取loadlibrary() 地址
hMod = GetModuleHandle((LPCSTR)"kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"LoadLibraryA");
5.创建远程线程 即(Loadbreary(".dll")) 加载已经写进内存的dll
hThread = CreateRemoteThread(hProcess,NULL,0, pThreadProc,lpMolloc,0,NULL);
3.利用注册表
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT \CURRENT\VERSION\WINDOWS 目录下
将appInit_dlls中添加为dll路径
LoadApp_initDlls 中修改值为1
重启后利用procexp.exe 工具的find 功能查看即可 (只要加载啦user32.dll的进程都会加载自己定义的dll)
注意点:
1.加载的dll是我们自己写的,去实现特定功能的(附件里面将提供给大家一份共研究的)
2.LoadLibrary()函数地址的获取
真正的Loadlibrary() 函数地址应该是从远程进程中获取,但是由于系统核心dll 每次加载进内存的地址一样(os 提供的特定地址) ,所以可以这样写。而不从远程中获取
源码放在附件里面,有疑惑的同学可以一块讨论
看雪好像不支持markdown 写起来感觉不是特别好
参考文献:《逆向工程核心原理》
上传的附件:
demo.rar
(26.83kb,115次下载)