http://batry.hypermart.net/DFMV_1e.htm
- 标 题:汉化辅助软件---有谁感兴趣? (38字)
- 作 者:guest
- 时 间:2000-7-18 7:06:14
- 链 接:http://bbs.pediy.com
http://batry.hypermart.net/DFMV_1e.htm
http://www.abgc.homecreatures.com/September1999/xOtix/vcl_30.zip
Registration Key: 35005259-dr0
标题: 用了这个注册码,虽然显示已注册,但是打开一个delphi程序后,选择save resource,它仍然会提示只有注册用户才能使用此功能。
内容:
下面的这个比较是有用的,虽然不影响它在About对话框里显示Registered to:XXXX,但是影响Save
Resource。
015F:0040F140 MOV EDX,[EBP-0C] //正确
015F:0040F143 POP EAX
//错误
015F:0040F144 CALL 004011B0
015F:0040F149 SETZ BL
以ResXplor3.exe为例,其它类似。
输入注册码之后用hmemcpy作断点,中断后按12次F12,就到这里,是在vcl30.dpl中。执行call之前敲d edx可以看见自己输入的注册码,于是用BPR
edx edx+len-1设断点监视假注册码(len为注册码长度)。BPR断点是很好用的,可惜在NT上好象没有。
015F:4137BEBB MOV EDX,[EBP-28] //假注册码
015F:4137BEBE MOV EAX,[EBP-08]
015F:4137BEC1 CALL 41304754
015F:4137BEC6 MOV BYTE PTR [EBP-09],01
015F:4137BECA XOR EAX,EAX
然后按F5执行,就到这里停下来。还是在DLL中。在执行REPNZ SCASB那条指令的时候看一下AL寄存器中的值为2D,这说明它试图在你输入的假注册码中匹配横杠字符(减号),由此可知注册码是含有横杠的。实际上下面的代码就对应C语言中的strstr(
)函数,即检查一个串是否为另一个串的子串。
015F:41304CA9 MOV AL,[ESI]
015F:41304CAB INC ESI
015F:41304CAC SUB ECX,EDX
015F:41304CAE JLE 41304CC4
015F:41304CB0 REPNZ SCASB
015F:41304CB2 JNZ 41304CC4
015F:41304CB4 MOV EBX,ECX
015F:41304CB6 PUSH ESI
015F:41304CB7 PUSH EDI
015F:41304CB8 MOV ECX,EDX
015F:41304CBA REPZ CMPSB
015F:41304CBC POP EDI
015F:41304CBD POP ESI
015F:41304CBE JZ 41304CCC
015F:41304CC0 MOV ECX,EBX
015F:41304CC2 JMP 41304CB0
015F:41304CC4 POP EDX
015F:41304CC5 XOR EAX,EAX
015F:41304CC7 JMP 41304CD1
015F:41304CC9 XOR EAX,EAX
015F:41304CCB RET
015F:41304CCC POP EDX
015F:41304CCD MOV EAX,EDI
015F:41304CCF SUB EAX,EDX
015F:41304CD1 POP EDI
015F:41304CD2 POP ESI
015F:41304CD3 POP EBX
015F:41304CD4 RET
在假注册码中加入一个横杠字符,重复上面的步骤,执行完上面的RET指令后,按F10或者直接向下翻屏就看见一段比较:
015F:0040EF5A MOV EAX,[EBP-10]
015F:0040EF5D LEA ECX,[EBP-08]
015F:0040EF60 MOV EDX,00000003 //3个字符
015F:0040EF65 CALL 0040EE10
015F:0040EF6A MOV EAX,[EBP-0C]
015F:0040EF6D MOV AL,[EAX]
015F:0040EF6F MOV EDX,[EBP-08]
015F:0040EF72 CMP AL,[EDX] //比较注册码的首字符
015F:0040EF74 JNZ 0040EFA0
015F:0040EF76 MOV EAX,[EBP-0C]
015F:0040EF79 MOV AL,[EBX+EAX-01]
015F:0040EF7D MOV EDX,[EBP-08]
015F:0040EF80 CMP AL,[EDX+02] //比较横杠前的那个字符
015F:0040EF83 JNZ 0040EFA0
015F:0040EF85 MOV EAX,[EBP-0C]
015F:0040EF88 MOV AL,[EBX+EAX-02]
015F:0040EF8C MOV EDX,[EBP-08]
015F:0040EF8F CMP AL,[EDX+01] //比较横杠前的倒数第2个字符
015F:0040EF92 JNZ 0040EFA0
015F:0040EF94 MOV EDI,00000001 //good guy
015F:0040EF99 JMP 0040EFA0
015F:0040EF9B MOV EDI,00000001
015F:0040EFA0 DEC EDI
//bag guy
015F:0040EFA1 SETZ BL
015F:0040EFA4 JMP 0040EFA8
至此我们找到了注册码中的3位。继续按F10(或者按一下F12),又看见一段判断。这个判断也不复杂,写个小程序穷举一下或者在心里推算一下就可以确定注册码的2~5位应该是什么(但是不唯一)。
015F:0040F05A MOV EDX,00000002
015F:0040F05F CALL 00401C28 //把注册码的2~5转成一个整数
015F:0040F064 MOV ECX,EAX
015F:0040F066 CMP ECX,00001389 //根据该数和0x1389的大小分成两种情况
015F:0040F06C JGE 0040F080
015F:0040F06E LEA EAX,[ECX+29] //小于0x1389则加上0x29
015F:0040F071 MOV ECX,00000007
015F:0040F076 CDQ
015F:0040F077 IDIV ECX
015F:0040F079 TEST EDX,EDX
015F:0040F07B SETZ BL
//和必须是7的倍数才行
015F:0040F07E JMP 0040F096
015F:0040F080 MOV EAX,ECX
015F:0040F082 SUB EAX,27 //大于等于0x1389则减去0x27
015F:0040F085 MOV ECX,0000000D
015F:0040F08A CDQ
015F:0040F08B IDIV ECX
015F:0040F08D TEST EDX,EDX
015F:0040F08F SETZ BL //差必须是0x0D的倍数才行
015F:0040F092 JMP 0040F096
继续按F10,看见另一个判断,这是在判断注册码的第6位。
015F:0040F140 MOV EDX,[EBP-0C] //正确
015F:0040F143 POP EAX
//错误
015F:0040F144 CALL 004011B0
015F:0040F149 SETZ BL
至于横杠后面为何是名字,等注册成功后看一下它的About对话框就明白了,因为那里显示的是Registered to: XXXX。