书上面一道题的解法
本帖最后由 疯如初 于 2020-4-16 10:15 编辑### 前言
我是一个学逆向的小白,大概可能学了几天时间,技术不好,希望大佬能帮忙指点下我的过程,谢谢!
有些跟着书上做的,因为刚学呢(最后伪代码是独立完成的)
这篇文章其实不是转载的,但由于感觉技术含量不高,而且初学文且大多数跟着书上做的,所以就放分享区了
### 工具
Ollydbg
### 被调试文件
TraceMe.exe(无壳)
### 难度
简单
### 过程
!
打开后,发现是需要通过序列号来授权的,取出文本框内的文本需要通过Win32API的GetDlgItemText或GetWindowText
这个是用GetDlgItemText的
ctrl+g然后找到GetDlgItemText的入口位置下int3断点
!
点击check后,程序被中断在74944390,F8走出win32api的子程序
!
F8一直向下走,在004011f5被条件转移到了0040122e
!
发现不太对劲,好像已经被发现我序列号输错了
判断如果不条件转移就破解成功了,所以现在就可以直接把004011f5改成nop就可以不管怎么输入都正确了
### 序列号算法分析
因此定位序列号检测算法在004011f5条件转移前面,在GetDlgItemText后面
!
经过分析后(分析见od注释)发现,004011e5处的call 00401340是唯一一个可能作为验证算法的地方,故判断00401340为序列号验证子程序的入口
004011e5处下断点,ctrl+f2重新开始,运行到004011e5处f7跟进子程序
!
!
看着汇编指令慢慢分析后,把注释也标在旁边,最后自己翻译成自创的伪代码(怎么舒服怎么写)
!
最后只要保证序列号和被这个算法一通算下来的一样就行
##### note
读这段汇编的时候最后稍微卡了一下,因为neg这个指令没仔细了解,也没学过,看名字也就是个正转成负数这类的东西了
但我看到后面sbb的时候意识到问题不对劲,因为如果标志寄存器中的cf位为1的话会导致一个sbb要额外减去1
查了一通发现neg在弄不为0的操作数的时候cf会变成1
所以调用lstrcmpA这个Win32API的时候,目的根本就不是比谁大,而是看是否相同
因为sbb eax,eax不管怎样来说eax-eax都是为0的,但由于cf的存在,它就有可能变成-1或0
而neg操作的对象正是lstrcmpA的返回值(比较对象相同返回0,大于返回正数,小于返回负数)
然后执行完sbb eax,eax后,再来一手inc eax就把结果变成了0和1
所以只要和相同的话,这个序列号检查子程序会返回1(意味着输入正确),不同就0(意味着输入错误)
### 总结
这个主要还是找下感觉看着书上做的,但发现这个不算难的,做着做着还是发现可以做出来的,分析也不算费劲,前面也说到发现关键子程序做到了唯一定位
后面的序列号检查算法分析(翻译成自己的伪代码)是自己独立做的,后来对比下这个程序的源码发现差不多
### 参考
段钢-加密与解密
小哈龙-影响标志位的汇编指令-https://blog.csdn.net/qq_22642239/article/details/51442739
: https://frc6.com/usr/uploads/2020/04/3516564622.png
: https://frc6.com/usr/uploads/2020/04/361342764.png
: https://frc6.com/usr/uploads/2020/04/2755213603.png
: https://frc6.com/usr/uploads/2020/04/2917748298.png
: https://frc6.com/usr/uploads/2020/04/541370094.png
: https://frc6.com/usr/uploads/2020/04/2312327678.png
: https://frc6.com/usr/uploads/2020/04/3559819172.png
: https://frc6.com/usr/uploads/2020/04/3676559556.png 附件好像不是这个,也是刚学习破解,不懂原理 ,只懂一顿操作
拖入odBPMessageBoxA
断点在
0018F6E8|75F1DE11返回到 msvcrt.75F1DE11 来自 msvcrt.75F1DE1B
enter 进入到
75F1DE11 这个应该是返回的地址
F8跟进
把jnz改成je
是这样么 本帖最后由 疯如初 于 2020-4-16 10:19 编辑
c4bbage 发表于 2020-4-16 09:51
附件好像不是这个,也是刚学习破解,不懂原理 ,只懂一顿操作
拖入odBPMessageBoxA
那个是kctf的第一题,是不允许直接爆破的,要找出作者设的密码,我本来发的这一篇,后来发现比赛还没结束。。。。我就换成这一篇了
等那边结束以后,我把你那个附件的我的做法发下 零基础几天就这么厉害?🐮 冷诗烟 发表于 2020-4-16 06:08
零基础几天就这么厉害?🐮
逆向就学了几天,但汇编之前学了一段时间(但编译器写出来的汇编看的真头疼) 学习一下,了解了解 cdq这指令第一次看见用:lol kof888 发表于 2020-4-16 06:31
cdq这指令第一次看见用
我也是第一次(临时搜的百度,然后看到百度一群人骂这个指令,说他鸡肋。。。) 比赛还没结束你就发题解? 本帖最后由 疯如初 于 2020-4-16 07:11 编辑
你与明日 发表于 2020-4-16 06:49
比赛还没结束你就发题解?
不是结束了吗
-----更新-----
我刚去看了下,没结束。。。我的错
我删掉了并换了篇我之前写的另一个文章
谢谢提醒
我以为只持续一天的,我还过了一天发(因为昨天我看公众号上说持续一天,刚看了下,是每天开一个。。。。我的错) 楼主不简单,学习一下,了解了解 楼主加油