壳的执行流程:
① 保存寄存器环境
③ 初始化壳需要的一些函数
② 解压代码和数据
⑤ 修复 IAT
④ 修复重定位
⑥ 恢复寄存器环境
⑦ 跳转到原始 OEP
1 写壳是写什么东西??
1.1 需要写一个加壳程序。(就是一个可执行文件)
1.2 需要写一个解壳代码。(嵌入到目标程序中的)
2 我们如何将解壳代码附着到目标程序中??
2.1 编写一个程序,然后把程序的代码段扣出来。我们使用的方法就是编写一个dll文件,然后将dll的代码段拷贝过去。
2.2 由于代码段中可能会使用全局变量,而全局变量在数据段中,所以我们需要将代码段与数据段合并到一起。
2.3 将目标程序的OEP设置到我们的解壳代码中。
3 我们可能会遇到的难题
3.1 我们的壳代码可能要和用户进行交互。
让dll文件导出一个全局变量,然后我们在加壳的时候,通过导出表找到这个全局变量,直接修改。
这样的话,加壳程序比较容易找到这个位置
解壳代码也容易使用这个位置。
3.2 我们需要重定位
有两个可能需要重定位的地方
第一个:壳代码一定需要重定位
第二个:目标程序可能需要修复重定位
第1个解决方法: 直接去掉重定位,这样就不需要解决这个问题了。
第2 个解决方法:将其重定位段抹掉,然后在自己的解壳代码中修复重定位。
3.3 解壳代码不容易调试
因为解壳代码是被贴到目标程序上的,可能会造成两种情况
1 目标程序能运行,代码会崩溃,这种情况比较好办,直接用OD调试即可,就能知道哪里错了。
2 目标程序不能运行,不是有效的PE文件。这种情况,解决方法如下:
1 浏览自己写的代码,看哪里写错了
2 将加壳后的程序放到PE分析工具中,看有没有不符合PE文件规范的地方。
3 将代码恢复到上一个版本,重写一下。
3.4 我们在解壳代码中,可能会需要用到系统的API函数。
我们需要自己写一个GetProcAddress功能类似的函数,用以找到真正的GetProAddress和LoadLibrary函数
有了这两个函数我们就能找到所有的系统API。
GetProcAddress这个函数在Kernel32.dll中。通过PEB中LDR链能够找到Kernel32.dll的基址。
我们分析Kernel32.dll的导出表,就能够在导出表中找到相应函数的地址。
那我们该如何一步一步的将壳写出来??
1 实现一个加壳程序,能够在目标程序中添加一个区段,什么都不做,能够正常运行。
2 能够将OEP修改到你的新区段中,什么不做,直接跳转原始OEP,能够正常运行。
3 将代码段简单加密,在解壳中进行解密,能够正常运行。
(弹密码框 可以加密更多的地方 可以进行动态解密。。。。)
网友评论