美文网首页
如何写PE壳

如何写PE壳

作者: MagicalGuy | 来源:发表于2018-10-10 00:49 被阅读0次

    壳的执行流程:
    ① 保存寄存器环境
    ③ 初始化壳需要的一些函数
    ② 解压代码和数据
    ⑤ 修复 IAT
    ④ 修复重定位
    ⑥ 恢复寄存器环境
    ⑦ 跳转到原始 OEP

    1 写壳是写什么东西??
    1.1 需要写一个加壳程序。(就是一个可执行文件)
    1.2 需要写一个解壳代码。(嵌入到目标程序中的)

    2 我们如何将解壳代码附着到目标程序中??
    2.1 编写一个程序,然后把程序的代码段扣出来。我们使用的方法就是编写一个dll文件,然后将dll的代码段拷贝过去。
    2.2 由于代码段中可能会使用全局变量,而全局变量在数据段中,所以我们需要将代码段与数据段合并到一起。
    2.3 将目标程序的OEP设置到我们的解壳代码中。
    3 我们可能会遇到的难题
    3.1 我们的壳代码可能要和用户进行交互。
    让dll文件导出一个全局变量,然后我们在加壳的时候,通过导出表找到这个全局变量,直接修改。
    这样的话,加壳程序比较容易找到这个位置
    解壳代码也容易使用这个位置。
    3.2 我们需要重定位
    有两个可能需要重定位的地方
    第一个:壳代码一定需要重定位

    image.png

    第二个:目标程序可能需要修复重定位
    第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的导出表,就能够在导出表中找到相应函数的地址。

    image.png image.png

    那我们该如何一步一步的将壳写出来??
    1 实现一个加壳程序,能够在目标程序中添加一个区段,什么都不做,能够正常运行。
    2 能够将OEP修改到你的新区段中,什么不做,直接跳转原始OEP,能够正常运行。
    3 将代码段简单加密,在解壳中进行解密,能够正常运行。

    (弹密码框 可以加密更多的地方 可以进行动态解密。。。。)

    相关文章

      网友评论

          本文标题:如何写PE壳

          本文链接:https://www.haomeiwen.com/subject/gsfdaftx.html