代码注入概念
代码注入是一种向目标进程插入独立运行代码并使之运行的技术,其一般调用CreateRemoteThread() API以远程线程的形式运行插入的代码,亦称为线程注入。代码以线程过程(ThreadProcedure)形式插入,而代码中使用的数据则以线程参数的形式插入,即代码和数据是分别注入的。
代码注入与DLL注入的区别
DLL注入适用于代码量大且复杂的情况,而代码注入适用于代码量少且简单的情况。
DLL注入需要先把注入代码放入某个DLL文件,再将整个DLL文件注入目标进程。DLL代码中使用的所有数据位于DLL的数据区域,整个DLL插入目标进程时,代码和数据是共存于内存,因而代码能够正常执行。
代码注入仅向目标进程注入必要的代码,要想使注入代码正常运行,还必须将代码中使用的数据一同注入。
另外,代码注入的优点为:占用内存少;难以查找痕迹;无需另外的DLL文件。
DLL注入示例
在之前写的文章《DLL注入》中有简单的讲解。这里先看看DLL注入的常规做法,即将代码写入DLL文件,然后将DLL注入到目标进程后会执行DLL中的程序,这里以MsgBox.dll注入到notepad进程中弹框为例。
MsgBox.cpp
// MsgBox.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "windows.h"
DWORD WINAPI ThreadProc(LPVOID lParam){
MessageBoxA(NULL, "DLL注入 By SKI12", "blog.youkuaiyun.com/ski_12", MB_OK);
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
switch( fdwReason ){
case DLL_PROCESS_ATTACH :
CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
break;
}
return TRUE;
}
如果在编译中出现如下错误时,只需到dllmain.cpp中删除DllMain()函数即可:
生成成功后,将得到MsgBox.dll文件。
另外还需要编写DLL注入的程序,如之前《DLL注入》文章中所示,这里不再累赘。
打开notepad程序,查看其PID,再到cmd中进行DLL注入,:
接着跟踪调试。在完成MsgBox.dll注入notepad进程后,用OllyDbg查看DLL注入代码: