这几天为了写个小程序.花了不少时间.
因为用纯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注入成功了.目的达到了也就结束我们的程序
第一次这么详细的写个帖子.有错误之处敬请大鸟指正.