PE代码注入

本文介绍了一种32位PE可执行程序的代码注入方法,通过修改EntryPoint来实现在程序启动时先执行注入的代码。关键步骤包括禁用地址随机化,计算E8/E9跳转偏移,以及进行RVA与FOA地址转换。在执行完注入代码后,程序会跳转回原始入口地址继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PE文件入口地址EntryPoint指向了PE文件开始执行的位置,关于PE文件的具体格式,大家可以自行百度。

本代码主要实现了在32位可执行程序中注入了一个弹窗 。其主要原理是修改EntryPoint地址处的内容,指向自己代码的地方,然后执行完毕后,再跳转到原入口的地址。

其中值得注意的几点:
(1)需要关闭PE的地址随机化功能,可以通过修改OptionHeader头中的DllCharacteristics = 0x8100,来绕过地址随机化。
(2)计算E8和E9的时候,CALL 偏移:跳转地址 = 当前地址+5+x ->x = 跳转地址 -当前地址-5。求出x就是E8(CALL指令的硬编码)后的跳转偏移。
(3)需要进行RVA和FOA的转换,所有的地址都是加载到内存后的地址。

代码如下


BOOL AddCode(char* FileBuffer, LPCSTR NewFileName) {
   
    PIMAGE_DOS_HEADER dos = NULL;
    PIMAGE_NT_HEADERS nt = NULL;
    PIMAGE_FILE_HEADER file_header = NULL;
    PIMAGE_SECTION_HEADER section_header = NULL;
    PIMAGE_OPTIONAL_HEADER option_header = NULL;
    DWORD dwSizeofOptionHeader = NULL;
    DWORD dwVirtualAddress = NULL;
    DWORD dwPointerRawData = NULL;
    DWORD dwEntryCode = NULL;
    DWORD dwImageBase = NULL;
    DWORD dwUnInitDataSize = NULL;
    DWORD dwNumofSection = NULL;
    DWORD dwCodeWirteAddress = NULL;
    dos = (PIMAGE_DOS_HEADER)FileBuffer;
    nt = (PIMAGE_NT_HEADERS)(FileBuffer + dos->e_lfanew);
    file_header = (PIMAGE_FILE_HEADER)(&(nt->FileHeader));
    option_header = (PIMAGE_OPTIONAL_HEADER)(&</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值