前言
首先感谢L4nce的学长们写了《谈Safengine系列的脱壳》,给了我很大的帮助,让我开始了脱壳的入门。
L4nce的这篇文章一直被认为是“巨人的肩膀”,但我觉得还是有一些东西可以写得详细一点。因为是第一次学炮击和写剧本,没人指点,请大家指正。
我美妙的旅程
至此,我就假设大家都读完了L4nce的文章。接下来,我想说一些他在文章中没有写或者写得很完整的东西,以及我的一些“奇妙旅程”。
关于用脱壳写脚本的研究,我从简单的程序(只有几个API调用的汇编器)开始,分析了调用iat的代码的特点和功能,然后写了一个简单的脚本来测试脱壳的成功。然后用比较复杂的程序(易语言静态编译器)测试脚本,改进修改。
在我看来,这种方法可能比较费时,但可以逐步解决困难,避免“卡”在莫名其妙的问题上。
先说SE的IAT加密。。。一开始剧本是按照L4nce的思路写的,最后脱壳之类的测试成功。。。直到我打上√“使用哈希API函数名”然后测试外壳,才会无效。
分析了一下,我就不再走加edi,eax获取API地址的路了。这样的话,你只能另找方法获取API地址了
这迫使我重新分析了两个案例中调用镇静剂_section的过程,以寻找共同点和突破点。
一般来说,为了程序的速度,shell不会对原程序的iat调用加密太多,最多在第一次运行的时候运行的时间长一点,然后就立刻得到目标地址,调用API或者给寄存器分配API地址。这一点,我认为不仅适用于se,也适用于其他加密外壳。如果你遵循这个想法,你总能找到希望。
终于找到了一个点:推xxxxxx
se获得虚拟机中的目标(API)地址后,会修改为推送目标地址
因此,我修改了脚本流程:
1.查找呼叫镇静剂部分
2.步进跟踪查找推送xxxxxx和CMP DWORD PTRS: [ESP+0x4],0
3.立即将断点写入推送的硬件,以获取目标(应用编程接口)地址
4.确定IAT呼叫的类型并进行维修
关于第四点,L4nce说了大部分情况,但有些特殊情况没有详细说明。我想在这里列出相关信息:
常见:
1 .调用dword ptr [iat]
2.jmp dword ptr [iat]
3.mov reg,dword ptr [iat]
呼叫注册
罕见:
4.call @ jmp dword ptr [iat]
jmp dword ptr [iat]
在第四种情况下,调用有时是加密的,有时不是(但它调用的jmp dword ptr [iat]肯定是加密的)。在这种情况下,我们应该始终将其视为加密。
判断呼叫IAT的类型
在L4nce方法的基础上,我做了一些大的改动。方法如下:
1.为两个可能的返回地址设置一个单字节断点(int3 ):调用section+5和section+6。
2.确定获取的目标(API)地址是否大于外壳段,从而确定是Mov_Reg类型还是其他IAT调用类型
见雪id: lixinist
https://bbs.pediy.com/thread-251066.htm
这篇文章最初是由一个名为Lixinist的雪论坛创建的
转载,请来自观雪社区注明
热门书籍推荐
现在戳买!
1.《IAT Safengine Shielden v2.40 IAT修复及脚本编写》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《IAT Safengine Shielden v2.40 IAT修复及脚本编写》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/1059017.html