微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《逆向工程核心原理》精读——第11章视频讲座破解Tut.ReverseMel.exe

       最近在学习逆向相关。主要的参考书目就是这本《逆向工程核心原理》。这本书的好处在于有实践也同时由浅入深的学习台阶也适合新人。

        虽然本书有提及一定的汇编知识,但在阅读本书之前,最好还是需要会一些汇编。这是我读到这一章的最大感受。

        在分析本章的例子之前,先认识一下两个寄存器 CS/IP。这很重要,如果没有这个知识点作为打底,那么在破解本章的例子上的理解上会有一定的障碍。以下基于8086汇编的朴素理解,等我过几天补完32汇编再来升级版理解 23333

       CS:寄存器用于存放应用程序代码所在段的寄存器。

       IP:保存cpu要执行的指令地址。

       CALL:这个命令相当于是

      (PUSH  CS) PUSH IP + JMP 标志  的结合体。

       RET:相当于  POP IP

      调用函数时 CALL xxx   此时函数地址已经压到SS里面了,SP -。

       函数返回的时候RET,此时POP IP,把函数地址又给吐给IP了,此时SP+。

RETN XX 相当于 POP EIP+ ADD ESP XX

        这样一来一回,SP的变化相互抵消。

那么现在就来看书里面的例子。

1、跑一下程序

先出一个弹框

点击确定后输入一个

  

                                                                         

输入错误就 sorry~

2、任务

两个小任务  去掉弹框+找到正确的注册

3、去掉弹窗的任务

ctrl+f2重新载入程序

先找一下弹窗的函数

所有 rtcMsgBox打上断点

 

找到第三个,双击进入。扫一扫上文,发现有弹窗字眼,八九不离十,调用弹窗函数函数在这里了。 书中介绍的方式是修改调用弹窗的函数,跳过它。所以现在就需要向上找,找到函数的开头。

此时这个东西映入眼帘,差不多就是这里了,加上RETN 传入函数的参数的大小就可以了。为什么是这里,不了解的话复习本书《第七章 栈帧》130遍。

那么问题来了如何确定 传入函数的参数的大小呢?鉴于使用的是STDCALL的调用方式, 栈由被调用者负责清理。进一步解释一下,那就是call xx 调用之前,ESP就已经把入参减掉了。执行完毕call xx,后这个ESP就会被加回来,这个加回来的动作是被调用函数做到的。后面会截图演示这个过程。

注意,这里出现了三个函数,分别是 调用执行rtcMsgBox函数调用rtcMsgBox函数,rtcMsgBox函数。这三者的套娃关系就像上图所示。我们修改的就是FUNCB。我们不关注FUNCA,因为FUNCA仅仅作为驱动FUNCB之用,保持逻辑上的顺畅。

一个关键为什么东西调用了FUNCB。

再回到这张图。什么东西让EIP的地址变成00402C17?也就是什么东西调用完了,就执行代码段的00402c17。推动EIP变化的无非两种,一种是顺序执行代码段,即00402C14完了就到00402C17。这种可能性很低,因为retn 4是要退到某个函数返回地址的,不太可能要继续往下执行。那么还有一种可能就是CALL来的。那么这就带来两个信息,执行 push ebp之前的 esp存放的是call xx的下一个执行地址。(因为call的时候会把下一个要执行的地址push掉,即 push eip)。所以马上看右侧的寄存器。

 ESP 的值是0019fab4,栈区域显示,0019fab4 所保存的地址是7101e5a9。这个是个代码区域的地址。马上看右边。

 压入栈的EIP找到了,断点打在7401e5a7上。

F7往下看

f7往下

回来了。验证成功,执行FUNC的就是7401e5a7。

执行call eax之前 ESP是0019fab8

执行之后是0019fabc,相差4,则填入 RETN 4。

 

结果如下。

2、找到注册

这个就简单了,上下文扫一眼,看到_vbaStrCmp(),就是一个比较字符串。容易看到比较的字符串是I'mlena151。 

原文地址:https://www.jb51.cc/wenti/3279828.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐