配置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