欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

过程 (4千字)

过程 (4千字)

以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。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功