文章标题:申请邀请码-小菜搞破解
文章作者: cnfixit
软件名称: Word文档图片转换工具 http://www.yuneach.com/soft/Doc2Pic11.exe
加壳方式: 无壳
编写语言: vb
使用工具: Ollydbg v1.1, IDA pro v5.5
操作平台: windows 2003 sp2
作者声明: 本文章只做学术交流,任何个人及组织不得用于商业目的,不得违背中国相关法律使用。
引子:
认识看雪也有好几年了,几年前无意中来到这里时,这个充斥着汇编代码的地方吓着我了,尽管小菜我多年前读过ibm 80x86汇编那本书,也还是被吓的不轻,基本就能看懂个mov啊jmp啊什么的,于是我退却了,把看雪当做神殿级论坛,小菜这样的人压根儿就没希望,如果当时能硬着头皮啃啃,今天也许又是另外一个样子,但是人生就是这样,谁知道呢,不是吗?多年以后的今天,首次在看雪发破文,尽管没什么技术含量,但至少可以这么安慰自己:
无论快还是慢,只要在前进就好。
关系拉完了,转入正题。
在各位高人的好文指导下,100kx巨大的压力下,小菜我终于按耐不住了,上某软件站随便下了个共享软件,安装完毕,顺手用peid看了看,没加壳,vb写的
运行之,就要注册,填入1234567890,注册,有提示,OD载入,搜索字符串,可惜,没找到……
于是乎,bp MessageBoxA,运行,没拦住,bp MessagxBoxExA,一样没拦住,小白嘴脸暴露无遗……
正当惆怅之际,发现OD的【断点】菜单里有个VB Api的子菜单,进去一看,噢,rtcMsgBox,试试看吧,断之,拦住了,来到了MSVBVM60.dll的领空,运行弹出对话框点掉以后,来到了这里
00413FC9 . FF15 7C104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
向前翻啊翻啊的来到了这个函数的入口:
00413B10 > \55 PUSH EBP
00413B11 . 8BEC MOV EBP,ESP
00413B13 . 83EC 0C SUB ESP,0C
00413B16 . 68 661B4000 PUSH <JMP.&MSVBVM60.__vbaExceptHandler> ; SE 处理程序安装
就从这里开始,小菜在那些迷宫般的代码里转来转去转来转去转来转去,基本上没有什么进展,直到小菜看到一个多次飘过眼前却熟视无睹的函数后,事情才有了转机,它就是__vbaStrCmp,下断后大约摁了40来下F9(有时候小菜我还是很有耐心的- -),寄存器和堆栈窗口都迫不及待的显示出来了
0012EC44 00414DA5 返回到 Doc2Pic1.00414DA5 来自 MSVBVM60.__vbaStrCmp
0012EC48 00183524 UNICODE "6654623958"
0012EC4C 049C3ABC UNICODE "123456678" //我随便输入的注册码
EAX 00183524 UNICODE "6654623958"
ECX 0012EC9C
EDX 00183524 UNICODE "6654623958"
运行软件,在注册码填入6654623958,注册成功。
也许有人说,你这也叫破文啊,撞大运吧你,没错,如果来看雪的第一篇帖子就这么敷衍了事,版主怎么会给邀请码呢(做猥琐状)?怎么样也得把算法找出来注册机写出来吧,于是,为了像模像样的完成这篇破文,小菜我历经辛酸饱受困苦咬牙切齿泪流满面的反复调试,从序列号的计算方法开始一点点的调试,终于在让人蛋疼的__vba函数海里有了新发现,原来它是在硬盘上做的文章,bp GetVolumeInformationA,拦住后不久就计算出了序列号,篇幅限制就不多说序列号的计算方法了,看注册码,在上面那个爆出注册码的__vbaStrCmp调用附近,发现这么一个call:
00414A40 $ 55 PUSH EBP //函数入口
00414A41 . 8BEC MOV EBP,ESP
00414A43 . 83EC 0C SUB ESP,0C
…
00414D8E . E8 ADFCFFFF CALL Doc2Pic.00414A40 ; 关键!注意
跟进去后发现大量的求字符串长度、字符串比较、连接的函数和循环以及和数字的比较,于是坚定了这就是注册码计算部分的信心,奈何小菜逆向分析算法的能力实在太差,只好请出ida了,载入程序,直接转到上面那个函数的入口,G,填入00414A40 ,F5,多么熟悉的if-else啊
if ( _vbaStrCmp(Doc_0, v18) ) //Doc_0, Doc_1是我自己改的名字,刚分析出来的时候他们
{ //是内存中的dword数据,实际就是0.1.2.3….9
if ( _vbaStrCmp(Doc_1, v18) )
{
if ( _vbaStrCmp(Doc_2, v18) )
……
else
{
part1 = pResult;
part4 = pResult;
part3 = (int)Doc_3;
}
}
else
{
part2 = pResult;
part4 = pResult;
part3 = (int)Doc_1;
}
v10 = _vbaStrCat(part1, part2, part3, part4);
_vbaStrMove(&pResult, v10);
其实猛然看上去的时候,小菜我傻眼了,这什么玩意儿啊,后来改改变量名字仔细看看,噢,原来是一对一的映射关系,就是y=f(x),x=0,y=8,x=1,y=6….这就是算法……知道这个就容易了
注册机
至此,小菜的第一次完整的Crack算是完成了,没有什么技术含量,可以说耐心在这个过程中起了很大的作用,当小菜在msvbvm60.dll中迷失的时候、当找到计算序列号但是找不到计算注册码算法的时候、当找到算法却看不懂的时候,耐心就在跟自己说,再来一次(像不像爱迪生:))
最后,国际惯例,感谢各TV,各气象台,当然最要感谢的是看雪tv,版主啊,给个邀请码吧,100kx压力很大啊
[课程]Linux pwn 探索篇!