硬编码寻找序列号(五)

使用工具

  • OllyDbg 1.10原版,简称OD
  • OD 汉化插件均来自互联网;
  • CrackMe来自互联网,仅供学习使用;
  • 文中特殊数字均是HEX,为了书写方便采用DEC

逆向思路

  1. 首先,打开软件到处点点,逆向一个软件起码要会用吧,不会用就没必要说逆向了;

  2. 倒入OD开始分析:

    • 首先按下Ctrl + AOD分析一下代码;

    • 接着按下Ctrl + N查看使用了哪些API,翻了翻还真不少,善用搜索,GetDlgItemTextA没找到,那就试试GetWindowTextA,还真有,就它了,在GetWindowTextA上设置断点,然后去断点窗口双击断点进入反汇编窗口给断点设置备注,这是一个好的习惯,请保持;

    • F9运行程序,然鹅,输入内容并点击验证按钮后,程序并没有暂停;

    • 界面有按钮,试试消息断点,还是没用,又尝试硬件断点以及内存断点均无效;

    • 使用一个特殊的API:TranslateMessage,没错,它的功能就是字面的意思翻译虚拟按键消息为字符消息,很好很强大;

    • API列表页面搜索,还真有,设置断点,然后在断点窗口双击断点进入反汇编窗口给断点设置备注,还没有完,在断点上右键断点>>条件记录或者Shift + F4(也就是条件记录断点,毕竟API断点的本质就是CC断点),修改条件:

      TranslateMessage

    • 然后运行程序,输入并点击验证,程序在TranslateMessage函数的行首暂停下来,然后Ctrl + F9或者点击菜单栏的调试选项并选择执行到返回,然后F8单步执行到程序领空;

    • 然后在内存窗口按下Ctrl + B或者右键选择查找,搜索输入的序列号:

      查找

      找到最接近输入的序列号的内容,设置内存访问断点:

      内存访问断点

    • 运行程序,程序暂停在了读取序列号的地方,开始分析:
      好聪明的“程序”,开始转移数据了:

      转移数据

    • 既然它都挪窝儿了,咱也别闲着了:在EDI上右键选择数据窗口中跟随,果然,输入的序列号在这里了,选择序列号的数据右键断点>>删除内存访问断点删除第一次设置的内存访问断点,也可以理解为设置在ESI上的内存访问断点,既然数据都转移了,断点也就没意义了,所以要重新设置在EDI上,再次选择序列号的数据右键断点>>内存访问,这样就实时掌握了输入的序列号的动向了:

      EDI

    • 继续运行程序,终于来到来最关键的地方:比较

      比较

      分析完毕,逻辑简单粗暴:

      • 首先,假码 和 可疑字符串 的前 4 个字节的机器码进行比较,不相等跳转到下一步;
      • 接着,假码 和 可疑字符串 的第 1 个字节的机器码进行比较,不相等跳转到下一步;
      • 最后,恢复寄存器的内容并RETN,直接弹出错误的弹窗;
    • 分析的时候已经发现了正确的序列号,也就是可疑字符串,试一下:

      完工