加壳实战(一)

目标:将代码段加密,防止IDA等静态工具分析。

步骤:

   1.添加一个区段(文件大小、区段数量)

   2.将源OEP修改为新的区段的地址

   3.将代码段异或加密

   4.在新的区段OEP处,添加异或解密代码

注意事项:

      1.代码段默认属性为不可写,需要手动修改。

      2.有随机基址属性的程序会重定位代码,一般我们会去掉这个属性,如果没有去掉,就需要在壳代码中进行重定位。 

具体操作:

1.添加区段

使用LordPE打开exe文件,在“区段”窗口右键-》选择“添加区段”。

 添加区段后,程序是无法运行的,因为虚拟大小、文件大小都是空的,所以我们需要先设置,在新添加的区段中右键,选择“编辑区段”

 分别设置“虚拟大小”和“物理大小“,这里我们均设置为0x200

 这时候我们只是设置了新区段的大小的信息,实际上该区段地址中还没有实际数据,所以我们要来手动添加。

 关闭LordPE,使用010Editor打开exe文件。在010Editor菜单中,点击"Edit"-》“Insert/Overwrite”-》“Insert Bytes...”。

在弹出的窗口中,Start Address一栏填写要插入的地址,这个地址应该是在文件的尾部,当前例子中可以看到是0x12C00。Size一栏填写插入的数据大小,这个数值是我们在上一步添加区段时

设置的大小(0x200),核对无误后点击“Insert"。

 插入后,记得保存文件,快捷键为Ctrl + S。

 2.修改OEP,增加OEP代码

 可以看到,原来的OEP是0x11D2,我们将它该为0x17000,等在该地址中执行完我们加进去的代码之后,再跳回源OEP,这样程序确保程序能够正常执行。

 2.1 修改OEP

 

 2.2 在新OEP中添加代码

详细分析下方框内这几条指令:

第一条指令:call的是下一条指令的地址,这里相当于将下一条指令的地址压入栈中,然后跳转到该地址。

第二条指令:将刚才入栈的地址赋给了eax

第三条指令:将eax减去0x17005,这里的0x17005是由RVA 0x17000加上当前指令的大小5字节,得到的是映像基址并存在eax

第四条指令:将eax加上源OEP,得到的也就是源OEP的VA地址了

第五条指令:跳转到源OEP。

 3.加密代码段

LordPE中查询到代码段的相对虚拟地址(RVA)为0x1000,文件偏移(FOA)为0x400、大小为0xA000

 

 用010Editor打开,在代码段起始地址上右键鼠标-》“Selection"-》”Maek Selection Start".

          在代码段末尾地址上右键鼠标-》“Selection"-》”Maek Selection End".

 

 这样就选中了整个代码段,下面就是对这个段的数据进行异或。

 点击菜单中的“Tool”-》“Hex Operations”-》“Binary Xor...”。

 在弹出的窗口中,输入要异或的数值,这里我们输入0x15,按"OK"。

 5.增加解密代码

由于代码段本身有重定位信息,那么在加密之后,重定位会出现问题,所以我们应该去掉随机基址

去掉随机基址可以用010Editor,在Variables窗口中会显示PE文件的信息

 

将扩展头的DllCharacteristics的值40 81改为00 81,这样就去掉了程序的重定位。

下面我们来添加解密代码

到这一步基本就完成加壳了,但是不要忘记,我们一开头说过的注意事项,还需要设置代码段的可写属性

打开010Editor,找到PE文件的区段表的代码段(.text)-》Characteristics成员的IMAGE_SCN_MEM_WRITE位,将值该为1(可写),然后保存文件。

 

 

至此,加壳已经完成。双击程序打开,运行正常。

使用IDA查看,加壳前:

 

 加壳之后:

 // 附件:一个压缩包,里面有加壳前和加壳后的exe文件。

Desktop.rar (cnblogs.com)

posted @ 2022-06-16 18:36  21X  阅读(571)  评论(0编辑  收藏  举报