简单的注册机练习
分析:
解析之前先查壳,再运行做好分析。
这是一个无壳的三十二位的程序,之后我们再运行一下看有没有什么提示性字符。由于程序是用很老的VB 5.0编写的,所以没有相应的动态连接库,需要自己下载,放到SysWOW64里面。
这里有个失败提示,所以在放入OD之后可以直接对字符串进行检索,查看有没有这个失败信息字符串,然后定位到程序位置并开始分析。
OD-解析:
首先根据之前的报错信息去尝试查看是否能检索出错误字符串,这样好锁定到它的位置。这个是有的,然后我们还能看到旁边还有其他的提示信息,有一个比较像successful的提示信息,应该是成功提示,但是咱也不能无凭无据乱说,所以还是通过错误信息跳转到程序执行处。
可以看到这个错误提示的前面有一个跳转,可以猜测这个跳转就是判断跳转,要破解的话我们也只需要对这个跳转来个84、85的转换,或者74、75的转换。所以跟着跳转去查看分析。
果然这里有个je跳转,然后前一句就是cmp判断,而且我们发现,就在这个跳转的下方有个成功的提示信息,所以我们大致可以肯定爆破方法就是修改je。
尝试运行一下,
这时我们就已经成功爆破了这个程序,非常简单。但是我们还需要了解一下它的一个运行过程。
算法分析:
我们继续从成功提示的位置往前翻看,我们能看见一处字符串比较这里有一个strcmp字符串比较,在调用这个函数之前它push了两个参数,一个是ecx另一个是一个字符串SynTaX 2oo1那么就可能这个字符串就是注册码,(简单的会直接给,复杂的会对一个简单字符串进行各种操作,不会用直接显示的字符串)那么ecx就是通过寄存器将我们输入的字符串传参给函数strcmp,为了进一步的证实我们的猜想,我们在比较函数执行前下一个断点,然后开始运行。
输入一个123456,确定。
可以看到ecx寄存器中存放的就是我们输入的123456,这就代表我们的猜测是对的。所以SynTaX 2oo1就是注册码,如果这里的比较函数是一个人为手写,那可能就带有字符串操作。
接着往下看看
mov edi,eax //这里将比较后的结果给到edi中
这里可以看到寄存器eax中是全1,这代表两个字符串不相同。
lea ecx,dword ptr ss:[ebp-0x28] //将输入字符串所在栈上的位置给ecx
neg edi //neg取补指令,对edi取补
sbb edi,edi //sbb借位减法,会从cf标志寄存器上借位
inc edi //inc加1
neg edi
call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>]
lea ecx,dword ptr ss:[ebp-0x2C]
call dword ptr ds:[<&MSVBVM50.__vbaFreeObj>]
cmp di,si
之后就是开始清理空间了。比较是di和si一样全零,会跳转。所以这里改一下di和si的值也是可以的,esi寄存器在之前是通过异或专门清零了的。