======================================================================
【工程作者】深海游侠[CZG][OCN]
【作者邮箱】shenhaiyouxia@163.com
【作者主页】http://86.22.cn/
======================================================================
【软件名称】私人保险箱 V5.50
【下载地址】http://www4.skycn.com/soft/14176.html
【加壳保护】ASPack加壳
【工程平台】Win ME
【调试工具】TRW2000系列
【脱壳方式】专用工具脱壳
======================================================================
【破解过程】
首先下断点,程序顺利断下,我们来到这里!

016F:004DACC0 50               PUSH     EAX              //EAX=假码
016F:004DACC1 6A03             PUSH     BYTE +03
016F:004DACC3 8D45F8           LEA      EAX,[EBP-08]     
016F:004DACC6 50               PUSH     EAX
016F:004DACC7 8D45F4           LEA      EAX,[EBP-0C]
016F:004DACCA E891AEFEFF       CALL     004C5B60         //猜的没错的话应该是读取机器码,具体没跟。
016F:004DACCF 8B45F4           MOV      EAX,[EBP-0C]     //EAX=机器码
016F:004DACD2 B902000000       MOV      ECX,02
016F:004DACD7 BA01000000       MOV      EDX,01
016F:004DACDC E857AFFEFF       CALL     004C5C38         //毫无疑问,算法CALL,跟进!
016F:004DACE1 8B55F8           MOV      EDX,[EBP-08]     //EDX=真码
016F:004DACE4 58               POP      EAX              //EAX=假码
016F:004DACE5 E8A2A3F2FF       CALL     0040508C         //经典比较
016F:004DACEA 7566             JNZ      004DAD52         //关键跳
016F:004DACEC B201             MOV      DL,01
016F:004DACEE A1847A4600       MOV      EAX,[00467A84]
016F:004DACF3 E88CCEF8FF       CALL     00467B84
016F:004DACF8 8BD8             MOV      EBX,EAX
016F:004DACFA BA01000080       MOV      EDX,80000001
016F:004DACFF 8BC3             MOV      EAX,EBX
016F:004DAD01 E81ECFF8FF       CALL     00467C24
016F:004DAD06 B101             MOV      CL,01
016F:004DAD08 BAACAD4D00       MOV      EDX,004DADAC
016F:004DAD0D 8BC3             MOV      EAX,EBX
016F:004DAD0F E854D0F8FF       CALL     00467D68
016F:004DAD14 8D55F0           LEA      EDX,[EBP-10]
016F:004DAD17 8B8604040000     MOV      EAX,[ESI+0404]
016F:004DAD1D E846ACF6FF       CALL     00445968
016F:004DAD22 8B4DF0           MOV      ECX,[EBP-10]
016F:004DAD25 BAC8AD4D00       MOV      EDX,004DADC8
016F:004DAD2A 8BC3             MOV      EAX,EBX
016F:004DAD2C E863D5F8FF       CALL     00468294
016F:004DAD31 8BC3             MOV      EAX,EBX
016F:004DAD33 E8CC91F2FF       CALL     00403F04
016F:004DAD38 6A00             PUSH     BYTE +00
016F:004DAD3A B9D0AD4D00       MOV      ECX,004DADD0
016F:004DAD3F BADCAD4D00       MOV      EDX,004DADDC
016F:004DAD44 A1541C4E00       MOV      EAX,[004E1C54]
016F:004DAD49 8B00             MOV      EAX,[EAX]
016F:004DAD4B E898B9F8FF       CALL     004666E8              //成功CALL
016F:004DAD50 EB18             JMP      SHORT 004DAD6A
016F:004DAD52 6A00             PUSH     BYTE +00
016F:004DAD54 B9D0AD4D00       MOV      ECX,004DADD0
016F:004DAD59 BAE8AD4D00       MOV      EDX,004DADE8
016F:004DAD5E A1541C4E00       MOV      EAX,[004E1C54]
016F:004DAD63 8B00             MOV      EAX,[EAX]
016F:004DAD65 E87EB9F8FF       CALL     004666E8              //出错CALL
016F:004DAD6A 33C0             XOR      EAX,EAX
016F:004DAD6C 5A               POP      EDX
016F:004DAD6D 59               POP      ECX
016F:004DAD6E 59               POP      ECX
016F:004DAD6F 648910           MOV      [FS:EAX],EDX
016F:004DAD72 689CAD4D00       PUSH     DWORD 004DAD9C
016F:004DAD77 8D45F0           LEA      EAX,[EBP-10]
016F:004DAD7A E8119FF2FF       CALL     00404C90
016F:004DAD7F 8D45F4           LEA      EAX,[EBP-0C]
016F:004DAD82 BA02000000       MOV      EDX,02
016F:004DAD87 E8289FF2FF       CALL     00404CB4
016F:004DAD8C 8D45FC           LEA      EAX,[EBP-04]
016F:004DAD8F E8FC9EF2FF       CALL     00404C90
016F:004DAD94 C3               RET     


016F:004DACDC E857AFFEFF       CALL     004C5C38
|
016F:004C5C38 55               PUSH     EBP
016F:004C5C39 8BEC             MOV      EBP,ESP
016F:004C5C3B 83C4F0           ADD      ESP,BYTE -10
016F:004C5C3E 53               PUSH     EBX
016F:004C5C3F 56               PUSH     ESI
016F:004C5C40 57               PUSH     EDI
016F:004C5C41 33DB             XOR      EBX,EBX
016F:004C5C43 895DF0           MOV      [EBP-10],EBX
016F:004C5C46 894DF8           MOV      [EBP-08],ECX
016F:004C5C49 8BF2             MOV      ESI,EDX
016F:004C5C4B 8945FC           MOV      [EBP-04],EAX
016F:004C5C4E 8B7D08           MOV      EDI,[EBP+08]
016F:004C5C51 33C0             XOR      EAX,EAX
016F:004C5C53 55               PUSH     EBP
016F:004C5C54 68CB5C4C00       PUSH     DWORD 004C5CCB
016F:004C5C59 64FF30           PUSH     DWORD [FS:EAX]
016F:004C5C5C 648920           MOV      [FS:EAX],ESP
016F:004C5C5F 8BC7             MOV      EAX,EDI
016F:004C5C61 E82AF0F3FF       CALL     00404C90
016F:004C5C66 8B45FC           MOV      EAX,[EBP-04]         //EAX=机器码
016F:004C5C69 E8DAF2F3FF       CALL     00404F48             //取位数
016F:004C5C6E 84C0             TEST     AL,AL
016F:004C5C70 7643             JNA      004C5CB5             //总的来说就是看是否有机器码!
016F:004C5C72 8845F7           MOV      [EBP-09],AL
016F:004C5C75 B301             MOV      BL,01
016F:004C5C77 8D45F0           LEA      EAX,[EBP-10]
016F:004C5C7A 33D2             XOR      EDX,EDX
016F:004C5C7C 8AD3             MOV      DL,BL
016F:004C5C7E 8B4DFC           MOV      ECX,[EBP-04]         //ECX=机器码
016F:004C5C81 8A5411FF         MOV      DL,[ECX+EDX-01]      //取1位(主要看是第几次循环)
016F:004C5C85 8BCE             MOV      ECX,ESI              //ESI算是个累加器
016F:004C5C87 C1E908           SHR      ECX,08               //逻辑右移2位
016F:004C5C8A 32D1             XOR      DL,CL                //DL xor Dl
016F:004C5C8C E8DFF1F3FF       CALL     00404E70             //DL结果转为ASCII码表示出来!
016F:004C5C91 8B55F0           MOV      EDX,[EBP-10]         //表示出来
016F:004C5C94 8BC7             MOV      EAX,EDI
016F:004C5C96 E8B5F2F3FF       CALL     00404F50             //应该是排位用
016F:004C5C9B 33C0             XOR      EAX,EAX
016F:004C5C9D 8AC3             MOV      AL,BL
016F:004C5C9F 8B17             MOV      EDX,[EDI]            //表示出来
016F:004C5CA1 0FB64402FF       MOVZX    EAX,BYTE [EDX+EAX-01]
016F:004C5CA6 03F0             ADD      ESI,EAX              //ESI=EAX+ESI
016F:004C5CA8 0FAF75F8         IMUL     ESI,[EBP-08]         //下命令可看到[ebp-08]寄存器的值是2
016F:004C5CAC 03750C           ADD      ESI,[EBP+0C]         //[EBP+0C]寄存器的值是3
016F:004C5CAF 43               INC      EBX                  //计数器+1(看是否把每位机器码都计算了)
016F:004C5CB0 FE4DF7           DEC      BYTE [EBP-09]        //计算完了一个?去掉一个吧!
016F:004C5CB3 75C2             JNZ      004C5C77             //这里到4C5C77就是一个经典的循环计算!要计算每一位的数!
016F:004C5CB5 33C0             XOR      EAX,EAX
016F:004C5CB7 5A               POP      EDX
016F:004C5CB8 59               POP      ECX
016F:004C5CB9 59               POP      ECX
016F:004C5CBA 648910           MOV      [FS:EAX],EDX
016F:004C5CBD 68D25C4C00       PUSH     DWORD 004C5CD2
016F:004C5CC2 8D45F0           LEA      EAX,[EBP-10]
016F:004C5CC5 E8C6EFF3FF       CALL     00404C90
016F:004C5CCA C3               RET                            //返回

1)破解总结:
1>注册码和机器码位数是大概相对的,(除非遇上比较大的数).
2>注册码利用了循环每位机器码的计算方式!

2)破解推算:   (我的机器码是:0383FBFF)
       
                   计算过程(先取每位机器码)
第1位                30 xor (0 shr 8)   = 30(0)    
第2位          33 xor ((31*2+3) shr 8)  = 33(3)
第3位          38 xor ((98*2+3) shr 8)  = 39(9)
第4位          33 xor ((16C*2+3) shr 8) = 31(1)
第5位          46 xor ((30C*2+3) shr 8) = 40(@)
第6位          42 xor ((65B*2+3) shr 8) = 4E(N)
第7位          46 xor ((D07*2+3) shr 8) = 5C(\)
第8位          46 xor ((1A6D*2+3) shr 8)= 72(r)

总结:我的注册码就是: 0391@N\r

3)内存注册机:
中断地址:4DACE4
中断次数:1
第一字节:58
字节长度:1
寄存器:EDX(内存型)

4)注册信息保存位置:
HKEY_USERS\.DEFAULT\Software\SafeBox\RegNum: "0391@N\r"

5)感评:
其实像这类软件算法已经是十分十分简单,但我认为是比较典型的循环计算,而且是小循环,对小鸟们一定很有帮助!毕竟我们不是为破解别人软件而学破解的,我们想得到的是技术!另外有朋友如果写出VB注册机请帮忙把原码发给我,先谢谢了!
如果我这篇拙文对大家哪怕有一点点帮助,那么我的目的也就达到了。
最后我要感谢[CZG][OCN]的兄弟们和许许多多朋友给我的许多帮助!也感谢你能耐心看完这篇文章!收工!

======================================================================
【工程声明】本过程只供内部学习之用!如要转载请保持过程完整!
======================================================================

  • 标 题: 答复
  • 作 者:小虾
  • 时 间:2005-01-28 14:58

'唉,VB的注册机也有不好写的时候,不像C/C++或Pascal语言,连左、右逻辑移位的指令都没有,到最后还得自己添上  

Public CF As Boolean  '定义CF标志位

Public Function SHR(iShr As Long, n As IntegerAs Long 'SHR逻辑移位函数
  Dim i As Integer
  For i = 1 To n - 1
    iShr = iShr \ 2
  Next i
  CF = iShr And 1
  SHR = iShr \ 2
End Function

Private Sub Command1_Click()
  Dim Code, Sn As String
  Dim i, k As Integer
  Dim tmp, j As Long
  Code = Text1.Text
  
  If Code = "" Then
    MsgBox ("错误,请输入机器码!")
    Exit Sub
  End If
  
  j = 0
  tmp = SHR(j, 8)
  
  Sn = Chr(Asc(Mid(Code, 1, 1)) Xor tmp)
  
  j = j + Asc(Mid(Sn, 1, 1)) + 1
  
  For i = 2 To Len(Code)
    tmp = SHR((j * 2 + 3), 8)
    Sn = Sn + Chr(Asc(Mid(Code, i, 1)) Xor tmp)
    j = Asc(Mid(Sn, i, 1)) + (j * 2 + 3)
  Next i

  Text2.Text = Sn
End Sub