The051. 反汇编练习,适合破解新手的160个CrackMe [006] 之 [追码]
The051. 反汇编练习,适合破解新手的160个CrackMe 之 [追码]
反汇编实战练手,下面是我的学习记录,如有疑问欢迎交流指正。^_^
被试程序合集下载:帖子https://www.52pojie.cn/thread-1598336-1-1.html
0x0、接着上一集开始追码。OD载入原始程序(aLoNg3x.1.exe),通过DeDe中知道NomeChange事件的RVA地址为00442E04,在OD中Ctrl+G转到这个地址,F2下断,F9运行,再程序中粘贴chuiyan为用户名,程序断下来了。(小提示:为什么要粘贴,因为这个编辑框变更事件,当你输入1个字符时程序就会断下来,而仅凭1个字符我们很难判断是不是我们输入的用户名,因此采用复制粘贴的方式一次性输入多个字符,便于辨认。)
https://s1.ax1x.com/2022/04/08/L9RVqP.png
0x2、根据分析,程序通过判断dl变量的值是否等于1来设置【Ok】按钮是否激活可用,dl设置为1的前提是al要等于1,下图00442E5B为关键算法call,决定了al的值是否为1,F7跟进去。
https://s1.ax1x.com/2022/04/08/L9Rma8.png
0x3、进入后,逐步分析代码,这个函数关键是要设置bl=1,才能使上图的al=1。我分析的流程为红框中根据用户名的每一位循环计算出ebx的值,然后00442AB1处的call里计算出eax的值,值得注意的是eax是根据用户输入的注册码计算出来的。继续00442AB6处,意思是ebx=ebx-eax,这里得到的ebx就是最终的值,与0x29A进行比较,为了让bl=1,这里必须让ebx等于0x29A才行。
综合上述分析得到一个公式:ebx(0x3BD1B,根据chuiyan运算得来)– eax(注册码,默认为0) = 666(0x29A),经过换算0x3BD1B为十进制数245019,为了让这个等式成立,在用户名不变的情况下,注册码的值必须为245019-666=244353。
https://s1.ax1x.com/2022/04/08/L9ReVf.png
0x4、根据上述猜测,将用户名和注册码输入,成功激活了Ok按钮。不论是先输入用户名,还是先输入注册码,只要是正确的,都可以激活Ok按钮。说明两个输入框都调用了验证机制。
https://s1.ax1x.com/2022/04/08/L9RnIS.png
0x5、知道了用户名和注册码,顺便去分析一下注册码输入窗口的运行流程,在DeDe中获取CodiceChange事件的RVA地址,Ctrl+G跳转到下图,简单看看代码,同样是获取注册码和用户名,然后调用了同样的算法call,call中如果bl=1,则al=1也成立了,Ok按钮被激活。
https://s1.ax1x.com/2022/04/08/L9RErt.png
0x6、研究完输入框,再来研究按钮点击事件,毕竟目标是点击按钮使其隐藏嘛。参照@海天一色001大牛走过的弯路,Ok按钮里的算法容易混淆,我直接从Cancella按钮开始分析,在DeDe中得到CancellaClick事件的RVA,Ctrl+G跳转到00442EA8处,F2下断,F9运行,在程序界面输入用户名和注册码,点击Cancella按钮,断下如下图。
https://s1.ax1x.com/2022/04/08/L9RKPg.png
0x7、配合DeDe分析代码,00442EF8为设置Cancella按钮隐藏的函数,上方的JE跳转很关键,是否跳转由al的值决定,00442EE7处的算法call又决定了al的值,因此关键在算法call,F7跟进去看看。
https://s1.ax1x.com/2022/04/08/L9RMGQ.png
0x8、根据分析,此函数流程为:取用户名第5个字符的16进制值,对0x7求余,然后余数+0x2,得到的值计算阶乘。根据上述流程,我输入的用户名为chuiyan,第5个字符为y,16进制值为79。接着求得余数为79 % 7 = 2,余数+2为4,然后将eax=00000004带入阶乘函数中计算得出4的阶乘为24,24转换为16进制就是00000018。
https://s1.ax1x.com/2022/04/08/L9RQ2j.png
0x9、接着下面一个循环,将用户名的每一个字符的16进制值乘以阶乘结果00000018,得到的值保存在ebx中并进行累加,然后将累加后的ebx(00004698)与0x7A69对比,它俩必须相等才能使bl=1。公式可描写为ebx – 注册码 = 0x7A69,即注册码 = ebx – 0x7A69 = 00004698 - 0x7A69 =18072(10进制) - 31337(10进制) = -13265。
https://s1.ax1x.com/2022/04/08/L9Rlxs.png
0xA、将上述计算结果带入程序,点击Cancella按钮,发现按钮成功隐藏了,同时Ok按钮被激活了,但点击没有反应。
https://s1.ax1x.com/2022/04/08/L9R8rq.png
0xB、下面继续解决Ok按钮隐藏,OD中Alt+B打开断点窗口,禁止其他所有断点,仅激活Ok按钮点击事件的断点。F9运行,输入如下用户名和注册码,点击cancella按钮使其隐藏,在点击Ok按钮,断在如下位置。通过之前的经验,很容易找到00442DC1处为关键算法call,F7步入。
https://s1.ax1x.com/2022/04/08/L9R3Mn.png
0xC、算法call里根据输入的注册码【-13265】,从最后一位到第一位,循环计算出正确的用户名为ACDAFE,具体计算过程已在下图注释部分写明。
https://s1.ax1x.com/2022/04/08/L9RGq0.png
0xD、最后测试一下效果,运行程序,输入用户名和注册码,点击Cancella按钮使其隐藏,同时激活Ok按钮,再将用户名改为ACDAFE,点击Ok按钮也隐藏了,追码破解成功。
https://s1.ax1x.com/2022/04/08/L9RYZV.png
0xE、总结一下:追码过程很艰辛,一句一句摸索,反复重启调试,花了很多时间和精力。不过在过程中学到了很多汇编知识,受益匪浅。
近期工作繁忙,一晃20多天没发帖了,继续加油!!!
感谢大佬的破解
我也在破解这个程序 已经卡了几天了不得要领
就是看不懂Delphi的反汇编程序 被Delphi的汇编弄{:1_908:}了 感谢分享~ 很不错的学习网站
感谢分享 感谢分享,很详细的分享!!!{:1_921:}{:1_919:} 楼主这个反汇编软件能不能分享下 分享的太有价值了,对于我这个小白可以落地 好东西啊感谢分享 感谢分享
页:
[1]
2