先介绍基本情况:我是做嵌入式开发的,所以对C语言比较了解.由于上位机软件和设备测试需要,有时候也会写一些C++(主要是QT),C#,python的程序,所以各方面知识都懂一些.
好多人觉得写代码很枯燥,但我还是比较喜欢写代码的,特别是喜欢做调试,是不是很奇怪。最近发现自己的stm32 primer不能用了,原因是老的软件没有win10下面的驱动,于是找了最新版的Ride7安装。奈何奸商太坏,我用primer自带的rlink注册竟然提示超过有效期,于是才想到了学习逆向,进入了这个世界我就感觉上瘾啦,太符合我的爱好了(大笑)。由于我有一些基础知识,这样对于学习软件逆向爆破省去了很多基础的学习过程,这些我就不介绍啦,初入门的话还是要学点汇编和windows编程基础的。我是只看了一节ollydbg的调试课程就开始实践写下了这个文章,中间可能有些比较低级的操作或者错误各位大佬莫笑,望大家指正。
----------分割线-----------------
打开OD,加载程序Ride7.exe,F9运行
软件执行注册过程,输入序列号,报错
于是我就想, 是不是只要让这边跳过序列号判断,就可以完成注册了,说干就干,开始查找字符串”Invalid Serial Number”.
右键代码区-中文搜索-搜索ASCII
找到对应的字符串
双击跳转到代码区域
再往上找跳转语句,发现
于是我就想,修改掉008D9D2D和008D9D67和008D9D13三处的跳转,让程序直接运行008D9E87处的跳转语句jmp short 008D9EA3
先在最早的地址下断点008D9D13,检查ZF标志为0,表示前面的运算不相等,所以不会跳转.
双击008D9D13处语句,直接跳过Invalid提示
程序虽然没有提示Invalid,但是依然提示重新输入RKit序列号..
说明跳转不对,于是把那边改成nop,让程序继续运行下去
8D9D67处也改成nop
一路单步执行到008D9EA3,没有其他地方跳转到Invalid了.F9全速运行
此时界面变了,提示输入activecode
随便输入一个,提示如下
继续搜索ascii码
E选择可执行模块ride7.exe
搜索ascii,双击跳转
和之前一样的搜索方式,往上找跳转,想办法跳过这个提示.
000B9924是用来跳过Unable提示的
上面如果有出错则会跳转到000B9926,所以可以沿着000B9926找到跳转过来的地方,改掉.
又发现B9917处,可以从000B9898,000B98B0, 000B98C8, 000B98E0, 000B98F8, 000B9910多方面跳转过来,而执行到B9917处的话也是可以跳过Unable错误提示的,这里我就往上看了一下代码
感觉很像对MCU类型的判断,既然我们是用来编译ARM的,那我就改ARM处的跳转代码.也就是希望能执行到B9898
单步执行发现修改B9891,不要跳转即可顺利执行到B9898,然后略过报错
接着出现新错误提示
搜索ASCII码,跳转到B9C6D
往上找跳转,找到769c66,发现从769bb2跳转过来的,
找到769bb2,下断点,查看ZF=0,继续执行的话就会发生跳转到769c66,继而提示activation code err,
所以把这边的跳转改成nop,让程序继续执行.
单步调试可以发现关于activation的备注,并且在执行到769C0A就会提示””Activation error”,预测激活的流程应该就在这一段里面
单步执行到00769BF2,函数名为SetActivation
查看堆栈,参数为刚才我们设置的激活码
猜测这个地方call的就是真正的激活函数.接下来需要跳转到函数里面进行分析爆破,F7进入,程序跳转到Rkits07.dll
到此找到了ride7的注册函数真正位置,接下来就是怎么让注册顺利进行了,下期再见。