控制台程序是通过NtReadFile获取输入的, 不出意外的化, 会有一个线程处于NtReadFile的同步等待状态, 依次查看线程当前EIP, 看是否有这样的线程存在.
查看线程列表如下:
可以看到4号线程, 就是我们要找的输入线程, 在777E1E6C下断. 输入测试注册码12345678, 回车, 不出意外, 成功断下, 观察栈:
地址0xCC3C30存放的就是读取到的我们输入的测试注册码. 对其下硬件读断点, 跟踪注册码处理.
保持对测试注册码的读取跟踪, 直到下图所示位置:
通过上下问分析, sub_561270会从注册码中依次取一个字符放到'参数2'所指地址, 暂且将其命名为get_char, 继续跟踪:
ebp-1dc内存数据如下:
可以看到, 561410行-561454行代码, 读取验证码每一个字符直到'\a'(不包括), 做对应的ASCII-数值转换(从中也可以看出, 是不支持小写字符的), 存放到缓冲区 ebp-36c, 执行完毕后, ebp-36c内存数据如下:
紧随其后, 再次转换:
上图代码将ebp-36c中数据重组, 放到ebp-dc缓冲区, 处理后结果如下图:
第一个算法5614C0-5615BC, 注意规避561523-561553之间的反调试代码:
根据索引算出hash值, hash算法如下:
等价逻辑:
根据分析内容, 做个礼貌的回应, 构造一个最短长度的测试注册码:675EE1125B47D47B4E30C8644219BC4D3602B036296BA31F, 再次执行, '开场白'已过, 是时候进入真正的验证了.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-11-24 10:28
被Anakin Stone编辑
,原因: