动态分析TraceMe.exe

      在学习《加密与解密第三版》时,由于运行环境是win10 64位系统,用OD打开TraceMe时出现诸如不显示程序窗口等问题都是因为OllyDbg在64位机上的bug导致的, 打开Log会发现无法处理的异常然后程序结束.
解决方法:安装Olly Advanced后在插件的Options->Additional  Options勾选x64  Compatiblity-mode

     
      首先示范下原软件,当输入错误用户名和序列号会弹出窗口报错。
动态分析TraceMe.exe_第1张图片

      现在开始一个完整的的调试分析过程,取消开始设计的所有断点,在OD中按F9将TraceMe运行起来,输入用户名和序列号。

动态分析TraceMe.exe_第2张图片


程序是ANSI编码,出现诸如此样式的对话框有两种可能函数,GetDlgItemTextA和GetWindowTextA,由于不知道程序具体调用了什么函数来处理字符,只好一个一个试。按Ctrl+G打开跟随表达式窗口,键入GetDlgItemTextA。(注:OD中对API的大小写敏感,输入函数名大小写必须正确)
动态分析TraceMe.exe_第3张图片

来到USER32.DLL中的GetDlgItemTextA的函数入口处,并在此处按F2下断点。单击B按钮可查看。



单击程序的“Check”按钮,程序断在GetDlgItemTextA函数开始处。
在4011AE处下断点,以便反复调试。
按Alt+F9回到软件领空,发现是GetDlgItemTextA函数,紧接着还有一个,F8单步布过即可。

动态分析TraceMe.exe_第4张图片
运行到4011CA处要注意了,跟踪esp+4,发现数据窗口右边字符出现了我的用户名“Antonia”。

动态分析TraceMe.exe_第5张图片

动态分析TraceMe.exe_第6张图片



由此可推断,下一行的test用来判断非空,cmp函数用来判断用户名字符长度是否小于5,再下面的俩个lea分别对应储存用户名的内存地址和你输的序列号,略过,call函数调用内存,F7步入。跟入后不难看出esp+18处存入的是用户名Antonia字符串长度并将其存放在edi中,之后ecx被赋值3,并与edi比较,也就说当用户名长度小于3则直接跳过,不执行算法并报错。
动态分析TraceMe.exe_第7张图片

这个循环一股脑的在计算什么东西,目测就是序列号了

分析算法可得,循环跳过用户名的前3个字符,依次将字符的Ascii码与一段程序内的内存对应相乘,并且将结果累加到Esi

分析下各个寄存器的作用

EAX:程序内的内存指针,与ECX一同递增,每次与字符Ascii相乘,且运算完第8个数后循环回第一个数

ECX:用户名内存指针,跳过用户名前3个字符

BL:字符Ascii

DL:和字符Ascii相乘的Hex

ESI:结果存放

EDI就是字符串长度,判断是不是要继续循环

到这里算法分析就基本结束了

循环结束后,将Hex换成等价的十进制数,并与用户输入的进行对比,相同则成功。(关于这部分序列号的分析,本文参考了网络http://www.bathome.net/thread-44827-1-1.html)

     再次回到领空,发现只要4011F5一句不跳转即可注册成功,双击该行,输入指令NOP,这个指令机器码是90,此处用9090代替7437。


此时可见标志寄存器ZF取反。

动态分析TraceMe.exe_第8张图片

现在随意输入用户名和序列号,这个TraceMe都会提示注册成功。但目前修改的只是内存中的数据,要是修改一直有效,就必须将修改写进磁盘文件中。
动态分析TraceMe.exe_第9张图片


动态分析TraceMe.exe_第10张图片

爆破成功!

动态分析TraceMe.exe_第11张图片

     —————时二O一八年三月十四日晌午  by Snippers

你可能感兴趣的:(OD调试分析)