《batchdoc算法分析与注册机的编写》由会员分享,可在线阅读,更多相关《batchdoc算法分析与注册机的编写(8页珍藏版)》请在金锄头文库上搜索。
1、BatchDoc 算法分析与注册机的编写文/KYO在工作空闲的时候由于兴趣爱好就想找些共享软件破着玩玩,既能陶冶情操又能解剖作者有意思的算法分析,何乐而不为呢?不过不喜欢找体积很大的东西,原因也不用多说,仅仅下载就耽误不少时间呢。找来找去在这个地址 http:/ 找到一个体积才 700 多 K 的软件,它是一个基于 Microsoft Word 内核的文档批量处理工具,功能也很多,我就不介绍了,反正我又不是冲着它的软件用途而来的。更新时间我看是 07年 5 月 9 号,还是个比较新的软件呢。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。http:/返利网,淘你喜
2、欢,淘宝返利,淘宝返现购物。*下载下来安装后打开主文件 C:Program FilesBatchDoc BatchDoc.exe,界面就是一个注册框,我随便写个注册码 kyo327 测试,发现弹出对话框,注册失败。如图 1看来可以利用查找字符串的方法断点了。现在先退出来,用 PEID 查一下软件基本情况。可以得知该程序运用了 Microsoft Visual Basic 5.0 / 6.0 的编程语言,没有加壳,呵呵省了不少工夫。下面直接用 OD 加载并查找字符串,发现没有找到可用的字符,那我就用 OD带的一个插件万能断点来下断吧。这次被断到了这里:004419F3 8B55 DC MOV E
3、DX,DWORD PTR SS:EBP-24004419F6 . 6A 01 PUSH 1004419F8 . 52 PUSH EDX004419F9 . 68 28154100 PUSH BatchDoc.00411528 ; -004419FE . 53 PUSH EBX004419FF . FF15 7C114000 CALL DWORD PTR DS:;这是个查找字符的函数,从上面 4 个参数可以看到这里是查找注册码中是否含有”-”字符,如果含有”-”,则 ebx=1,否则 ebx=000441A05 . 8BC8 MOV ECX,EAX00441A07 . FF15 D4104000
4、 CALL DWORD PTR DS:; MSVBVM60._vbaI2I400441A0D . 8D4D DC LEA ECX,DWORD PTR SS:EBP-2400441A10 . 8945 E8 MOV DWORD PTR SS:EBP-18,EAX00441A13 . FF15 00124000 CALL DWORD PTR DS:; MSVBVM60._vbaFreeStr00441A19 . 8D4D D4 LEA ECX,DWORD PTR SS:EBP-2C00441A1C . FF15 FC114000 CALL DWORD PTR DS:; MSVBVM60._vbaF
5、reeObj00441A22 . 8B06 MOV EAX,DWORD PTR DS:ESI00441A24 . 56 PUSH ESI00441A25 . FF90 08030000 CALL DWORD PTR DS:EAX+30800441A2B . 8D4D D4 LEA ECX,DWORD PTR SS:EBP-2C00441A2E . 50 PUSH EAX00441A2F . 51 PUSH ECX00441A30 . FFD7 CALL EDI00441A32 . 8BD8 MOV EBX,EAX00441A34 . 8D45 DC LEA EAX,DWORD PTR SS:E
6、BP-2400441A37 . 50 PUSH EAX00441A38 . 53 PUSH EBX00441A39 . 8B13 MOV EDX,DWORD PTR DS:EBX00441A3B . FF92 A0000000 CALL DWORD PTR DS:EDX+A000441A41 . 85C0 TEST EAX,EAX00441A43 . DBE2 FCLEX00441A45 . 7D 12 JGE SHORT BatchDoc.00441A5900441A47 . 68 A0000000 PUSH 0A000441A4C . 68 A00C4100 PUSH BatchDoc.0
7、0410CA000441A51 . 53 PUSH EBX00441A52 . 50 PUSH EAX00441A53 . FF15 5C104000 CALL DWORD PTR DS:; MSVBVM60._vbaHresultCheckObj00441A59 8B4D DC MOV ECX,DWORD PTR SS:EBP-2400441A5C . 51 PUSH ECX00441A5D . FF15 28104000 CALL DWORD PTR DS:; MSVBVM60._vbaLenBstr00441A63 . 33DB XOR EBX,EBX00441A65 . 83F8 03
8、 CMP EAX,3;比较注册码长度是否大于 300441A68 . 0F9FC3 SETG BL00441A6B . F7DB NEG EBX00441A6D . 33D2 XOR EDX,EDX00441A6F . 66:837D E8 01 CMP WORD PTR SS:EBP-18,100441A74 . 8D4D DC LEA ECX,DWORD PTR SS:EBP-2400441A77 . 0F9FC2 SETG DL00441A7A . F7DA NEG EDX00441A7C . 23DA AND EBX,EDX00441A7E . FF15 00124000 CALL D
9、WORD PTR DS:; MSVBVM60._vbaFreeStr00441A84 . 8D4D D4 LEA ECX,DWORD PTR SS:EBP-2C00441A87 . FF15 FC114000 CALL DWORD PTR DS:; MSVBVM60._vbaFreeObj00441A8D . 66:85DB TEST BX,BX;这里判断 bx 是否为 0,如果 ebx 为 0 则跳向失败。00441A90 0F84 D0040000 JE BatchDoc.00441F66可以看到这断代码的意思是判断注册码的,只有注册码长度大于 3,并且注册码中含有”-”,才能通过这个验证
10、。好了,现在明白这一点后,shift+f9 重来,输入 kyo327-1234 断下来后 f8 一直走,发现到了 00441a90 跳转没有实现。那我们接着 F8 分析。大家都知道 vb 写的程序大部分都是 DLL 里面没用的东西,就相当于封装起来的 MFC 一样,所以我们不必每一条指令都弄明白,只要把关键地方分析透就 OK 了。等我一直 F8 走到这里:00441C1F . 8B45 E0 MOV EAX,DWORD PTR SS:EBP-2000441C22 . 83C4 18 ADD ESP,1800441C25 . 8D4D E4 LEA ECX,DWORD PTR SS:EBP-1C
11、00441C28 . 50 PUSH EAX00441C29 . 51 PUSH ECX00441C2A .E8 31F9FFFF CALL BatchDoc.00441560 ; 算法 CALL 参数为注册码”-”前面的部分00441C2F . 8BD0 MOV EDX,EAX;算出来的 eax 放到 edx 中00441C31 . 8D4D DC LEA ECX,DWORD PTR SS:EBP-2400441C34 . FFD3 CALL EBX00441C36 . 50 PUSH EAX00441C37 . FF15 C4104000 CALL DWORD PTR DS:;这里比较”-
12、”后面部分和经过那个算法 CALL 算出来的部分,如果相等则返回值 eax=0.如果不相等返回值不为 000441C3D . 8BF8 MOV EDI,EAX00441C3F . 8D4D DC LEA ECX,DWORD PTR SS:EBP-2400441C42 . F7DF NEG EDI00441C44 . 1BFF SBB EDI,EDI00441C46 . 47 INC EDI00441C47 . F7DF NEG EDI00441C49 . FF15 00124000 CALL DWORD PTR DS:; MSVBVM60._vbaFreeStr00441C4F . 66:85
13、FF TEST DI,DI;如果 di=0 则跳向失败00441C52 . 0F84 16030000 JE BatchDoc.00441F6E发现在 00441c52 处有一个跳转,经测试发现如果这个跳转实现的话会跳向失败。那么就是说明只有 di 不等于 0 才能通过这个验证。那么往上看,在 00441c37 处有一个字符串比较函数,分析后得出,只有注册码的后半部分等于那个算法 CALL 算出来的字符串时才能通过这个验证。不过过了这个验证也就等于注册成功了。看来现在的关键部分就是分析00441C2A 处算法 CALL 的算法。当然如果想暴的话把 00441c52 的 JE 改为 JNE 应该也可行。可我是想写出注册机,因此还是老老实实 F7 跟进 00441C2A CALL BatchDoc.00441560 这个 CALL 看看吧。由于这个 CALL 里面垃圾代码太多,为了避免骗稿费之嫌我就贴算法的核心的部分:00441770 . 8A1C02