zoukankan      html  css  js  c++  java
  • 第11章:分析Tut.ReverseMe1.exe

    首先拿到程序,先跑一遍,看看大致的流程.

    程序一启动会弹出一个NAG,要去除它.

    一般来说,只要是启动窗口都会调用函数名字里有MessageBox的函数.于是在跨模块调用中搜索:

    可以发现,这些函数都是user32.dll中的函数,属于系统函数,因为VB的特性,它最终会调用系统函数,所以在此处断应该是没有问题的. 

    起初,在MessageBoxA/W这两个函数中下断点,结果都没有断下来.很疑惑,又在MessageBoxIndirectA中下断,发现停了下来,在浏览器搜索得知,此函数也可以创建消息框.

     我最开始的思路是,继续往里走,直到看见最里层的调用,结果走在里层发现会循环调用<user32.TranslateMessage>等函数.然后调用<win32u.NtUserShowWindow>初始化窗口,再加载窗口

    于是返回到调用这个函数的外面.再次观察,一般来说,若被调用的函数传入的参数没有使用到外面的堆栈,调用函数后也没有需要用到函数内的flag值,直接将函数nop掉是可以成功的.

    也有可能在编译完程序后再使用汇编代码将程序进行修改.

    不管怎么说,先打算尝试一下.首先观察在函数执行前后寄存器有什么变化(并且查询此函数的返回值),了解到此函数:

    并且实际操作中:

            

    有实际意义的寄存器中EAX ECX EDX寄存器发生了变化,继续往下执行,发现后面的代码在执行过程中并没有使用到ECX.因此判断EAX即为返回值,EDX 始终都返回0x460000.

    因此只需要:

     修改后直接运行,正常没有弹窗.

     但是,由于这个方法直接阻断了其它函数的调用,因此在点击 Register Me的时候同样不会弹出窗口告诉你是否注册正确.

     因此需要换一种方法,由于本方法没有采用书上直接搜索rtcMsgBox的方法,因此需要耗费时间找到MsgBox函数.大致的方法就是直接步过,如停下来了,就在此处下断,重启程序,运行到下断的地方,

    步进,再接着步过.直到最后找到想要的函数.

     有趣的是,在定位到想要的函数的时候,发现程序竟然断在了用户代码领空.

    同样在运行该函数之前和之后做比较,edx ecx eax均改变,但是edx ecx 在执行完之后被立刻赋予新值,故只有eax是返回值.但堆栈有变化,因此需要进入函数重新修改.

     继续运行,就成功修改了.

    直接搜索字符串,找到strcmp,下断点,运行:

     可知,密钥是 I'mlena151.

     

     总体来说,这是一个很简单的程序

  • 相关阅读:
    POJ 1436 Horizontally Visible Segments(线段树)
    POJ 1436 Horizontally Visible Segments(线段树)
    精益项目管理的可行性分析
    精益项目管理的可行性分析
    精益项目管理的可行性分析
    精益项目管理的可行性分析
    单点登录cas常见问题(二)
    单点登录cas常见问题(二)
    蓝氏兄弟依靠板栗东山再起,意外赚回八九万元
    元旦快乐,感谢一路相伴!
  • 原文地址:https://www.cnblogs.com/Rev-omi/p/13169950.html
Copyright © 2011-2022 走看看