• 手动脱Mole Box V2.6.5壳实战


    作者:Fly2015

    这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,之前也碰过该种壳但是这个程序似乎要复杂一点。

    首先对加壳程序进行侦壳处理。

    Exeinfo PE侦壳的结果:


    DIE侦壳的结果,很显然DIE告诉我们被加壳程序的源程序使用Delphi编写的,这个比较有用,对于我们找到程序的真实OEP很有帮助作用。


    OD载入该加MoleBox V2.6.5壳的程序,入口点汇编的代码如图。看到PUSHAD,我们很自然会想到使用ESP定律进行脱壳。F8单步走到PUSHAD的下一条指令即地址00469BD9处,选择ESP寄存器,右键-->HW Break [esp](硬件断点)F9运行程序。


    程序在刚才下硬件写入断点的地址处断了下来,如图。


    单步F7到地址0046997B3处,发现Call eax指令中的EAX保存是加壳程序真实OEP的VA地址0045159C


    F7跟进到地址0045159C处查看,汇编代码是不是很熟悉?典型的Delphi程序的入口点汇编代码。说实话,我不怎么喜欢Delphi程序的反汇编,因为对于Delphi程序的反汇编没有比较理想的工具。


    OK,被加壳程序的真实OEP找到了,是不是就可以直接Dump给程序脱壳完事呢?试一试就知道了。使用OD的插件OllyDump或者Load PE+ImportREC或者是Scylla_x86进行程序的脱壳,然后运行程序,结果如图。


    程序运行的不友好界面又出现了。被加壳程序的真实OEP地址已经找到了,但是程序运行还是出了问题,那么很有可能是Dump程序的IAT没有修复好。在进行程序的IAT修复的时候,直接将ImportREC程序中显示的无效函数地址给剪切了。经过观察发现,被剪切的无效函数不是系统Dll的导出函数,但是一般被加壳程序的IAT表中的函数地址结尾的标记是-1或者0等。后来经过参考吾爱破解上的帖子才知道,原来是有部分函数的API地址被加密处理了。


    下面使用OD在程序的内存数据中查找IAT表保存的内存位置。当找到了被加壳程序的真实的OEP以后,就可以在原程序真实OEP地址以后(被加壳原程序)代码中去查找被加壳原程序的IAT的保存地址即找到IAT表的入口地址。


    从上面找到的代码中,观察发现跟进地址0040658C处就能找到调用系统Dll导出函数的代码。果然,跟进以后找到了程序调用系统API函数的地方,比较明显的是在地址004554DC处保存着函数user32.PostQuitMessage的调用地址。


    在该程序的内存数据区Ctrl+G到地址004554DC处找到了函数user32.PostQuitMessage地址的保存位置。


    上下拖动一下OD的数据区的滚动条,就可以找到IAT表的起始VA地址0045512CIAT表的结束地址00455728并且IAT表的大小为455724 - 45512C = 5F8



    在IAT表发现了被加密的系统API函数的位置。很显然,被加密处理的IAT表中的函数地址在系统的Dll中是不存在,OD的解析中没有对应的系统API函数,如图。


    现在的任务就是将这部分加密的系统API函数恢复还原出来。

    Ctrl+F2OD再次调试载入被加壳的程序,删除之前下的硬件写入断点OD内存数据区Ctrl+GIAT表的起始VA地址0045512C处,然后找到IAT表中所有的被加密的系统API函数的保存地址如00455170处,选择这些地址 右键-->DWORD型的硬件写入断点,几次F9以后被加密的系统函数API地址显示出来了,然后将这些API函数地址记录下来。


    下面是经过上面这种方法记录下来的被加密系统API函数的地址。


    被加密系统API函数的地址没有恢复之前,用Scylla_x86看到的IAT表函数的结果是有18个无效函数地址。


    离被加壳程序脱壳又进了一步。Ctrl+F2OD再次运行程序进行分析,删除前面下的所有类型的断点。再次根据ESP脱壳定律,用之前的方法找到该程序的真实的OEPVA地址并运行到此即地址0045159C处。在OD的内存数据区Ctrl+GIAT表的起始VA地址0045512C处,然后找到IAT表中被加密系统API函数的地址处,根据前面的记录的系统API函数的正确地址手动将加密的函数API地址修改过来,如图。


    手动将加密的系统API函数的地址修改正确之后,用Scylla_x86看到的IAT表函数的结果,如图。


    OK,大功告成。直接用OD的插件OllyDump在程序真实的OEPRVA5159C处进行dump进程就可以完成改程序的完美脱壳了。或者使用Load PE结合RecImport进行程序的DumpIAT表的修复,完成程序的脱壳。或者直接使用Scylla_x86工具进行先程序Dump然后进行Fix Dump

    但是在使用工具的时候请注意Scylla_x86RecImport所填写的数据不一样,前者填入的VA地址,后者填写的RVA地址。


    程序脱壳成功,运行验证一下,如图。


    总结,上面的脱壳的方法是挫了点,但是思路没有错还是解决了问题,后面有空研究一下,其他比较好的脱壳的方法。


    Mole Box V2.6.5脱壳分析文档以及完美脱壳后的程序的下载地址:http://download.csdn.net/detail/qq1084283172/8896587

     

    吾爱破解脱壳练习第8期的地址:http://www.52pojie.cn/thread-11306-1-1.html

    吾爱破解脱壳练习第8期脱壳分析的地址:http://www.52pojie.cn/thread-11306-2-1.html



  • 相关阅读:
    1.5寻找倒数第k个元素
    MySQL基础之分组函数
    MySQL基础之单行函数
    MySQL基础查询(一)
    gem install redis Fetching: redis-4.1.3.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.3.0.
    SQL语句
    使用kill无法杀死mysql进程
    Ansible学习笔记
    rsync报错:rsync: chgrp ".hejian.txt.D1juHb" (in backup) failed: Operation not permitted (1)
    Linux磁盘管理
  • 原文地址:https://www.cnblogs.com/csnd/p/11800715.html
Copyright © 2020-2023  润新知