C++处理stub.dll

本文介绍了如何配置和处理stub.dll,包括将数据段与代码段合并、编写代码获取API地址、混淆与反调试、解密/解压缩以及加密IAT等步骤。重点在于动态获取API函数地址,如LoadLibraryExA和GetProcAddress,以实现shellcode在无法使用导入表的情况下正常工作。通过内联汇编代码展示了获取kernel32基址和GetProcAddress函数地址的过程,并以弹出MessageBoxW测试为例验证了功能的成功实现。

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

配置stub工程
将工程设置release版本,如果不想代码被优化,可以禁止优化。


大概流程如下:

① 将数据段,只读数据段和代码段进行合并

② 编写代码获取API的地址

③ 加入混淆指令,反调试

④ 解密/解压缩

⑤ 加密IAT等等

之后会把存根文件stub.dll的.data,.rdata这2个区段合并到.text段并设置为可读可写可执行属性,需要前置代码

//把数据段融入代码段
#pragma comment(linker,"/merge:.data=.text")
//把只读数据段融入代码段
#pragma comment(linker,"/merge:.rdata=.text")
//设置代码段为可读可写可执行
#pragma comment(linker,"/section:.text,RWE")

 

根据之前说的已经知道壳区段就是新添加的区段了,里面将保存移植过来的stub的.text段里的所有内容,称之为壳代码。

而使用壳代码的时候要注意,因为加完壳后,在壳代码中无法使用导入表,因此,需要自己动态获取需要使用的API函数的地址。


只要获取到LoadLibraryExA和GetProcAddress两个函数的地址,我们就可以根据LoadLibraryExA来获取任意模块dll的基地址,再使用GetProcAddress函数获取到任意API函数的地址了。


根据kernel32基址可获取到GetProcAddress地址。


下面是我获取kernel32基址的内联汇编代码。

__asm
{
push esi;
mov esi, fs:[0x30]; //得到P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值