代码注入(线程注入)

本文详细介绍了代码注入的概念,对比了代码注入与DLL注入的区别,通过实例展示了DLL注入和代码注入的过程,包括如何创建DLL、如何注入代码到目标进程,并分析了两种方法在内存占用和可追溯性上的优缺点。
摘要由CSDN通过智能技术生成

代码注入概念

代码注入是一种向目标进程插入独立运行代码并使之运行的技术,其一般调用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.csdn.net/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注入代码:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值