这几天为了写个小程序.花了不少时间.
因为用纯ASM编程序.而且网上Win32ASM资料不是很多.
只能硬看一些C和C++文章.毕竟都是调用API
现在把学到的一些知识分享一下.让一些刚入门的新手得到很快的学到知识
做病毒木马,或者外挂.少不了注入.或者钩子.远程线程之类的.
远程创建线程不够强大.还需要重定位等等.很复杂.
而DLL注入其他程序后 可以为所欲为的使用其API.所以方便了很多
要想在某个程序上为所欲为.DLL注入对我们来说最方便的.
而现在要讲的是如何的注入DLL到其他程序呢.与其让注入DLL到别的程序.
不如说成让别的程序主动加载我们的DLL 不是更好理解么
DLL注入步骤如下.
1.得到要注入的进程标示符,也就是PID
2.然后得到进程的进程句柄
3.在目标进程中申请一段内存
4.写入DLL路径
5.得到LoadLibrary函数的线性地址
6.创建远程线程执行LoadLibrary,而参数就是我们的DLL路径
.
得到进程标示符的方法很多.这里我将用最简单的FindWindow函数来说明
代码:
.DATA? FindHwnd dd ? ;保存返回后的句柄 PID dd ? ;保存返回后的PID标示符 hProcess dd ? ;保存进程句柄 hMemory dd ? ;申请的内存入口地址 lpLoadLibrary dd ? .DATA FindTitle db '要注入的进程窗口标题栏文字',0 DllFileName db '这里写DLL路径',0 szDllKernel db 'Kernel32.dll',0 szLoadLibrary db 'LoadLibraryA',0 .CODE start: INVOKE FindWindow,NULL,addr FindTitle ;寻找指定的窗口 MOV FindHwnd,EAX INVOKE GetWindowThreadProcessId,FindHwnd,addr PID INVOKE OpenProcess,PROCESS_ALL_ACCESS,FindHwnd,PID ;获取进程句柄 MOV hProcess,EAX ;上面的PROCESS_ALL_ACCESS 要具有足够的权限才可以的 invoke VirtualAllocEx,hProcess,NULL,12,MEM_COMMIT,PAGE_EXECUTE_READWRITE MOV hMemory,EAX ;在目标进程中申请内存空间, invoke WriteProcessMemory,hProcess,hMemory,addr DllFileName,128,NULL ;在目标进程上申请的内存 写入DLL路径 INVOKE GetModuleHandle,addr szDllKernel ; INVOKE GetProcAddress,eax,addr szLoadLibrary ;获取LoadLibrary的函数地址 MOV lpLoadLibrary,EAX ;最后我们要让目标进程执行LoadLibrary来加载我们的DLL. INVOKE CreateRemoteThread,hProcess,\ ;在目标进程中创建远程线程 NULL,0,\ lpLoadLibrary,\ ;LoadLibrary的线性地址,也就是创建后直接让目标进程执行LoadLibrary hMemory,\ ;这是我们在目标进程申请的内存.我们之前在这里写入了我们自己的Dll路径 0,\ ;这里的0代表 远程线程创建后立即执行 NULL 然后 INVOKE CloseHandle,eax ;关掉远程线程句柄 EAX是创建远程线程后返回的线程句柄 ;新手们会问.创建了远程线程为什么还要关闭.这样远程线程怎么执行呢? ;其实线程和,线程句柄是不一样的.线程结束 要遇到Ret 才会结束 ;而线程句柄要靠我们的CloseHandle来结束 INVOKE ExitProcess,NULL ;最后DLL注入成功了.目的达到了也就结束我们的程序
