首页
社区
课程
招聘
已经搞懂了程序的注册码校验过程,但是不知道怎么算注册码
发表于: 2009-11-2 17:26 12987

已经搞懂了程序的注册码校验过程,但是不知道怎么算注册码

2009-11-2 17:26
12987
一个手机软件,ProxyCap 1.30
跟了两三天了,总算是搞懂了注册码的验证过程,也写出了对应的注册码验证程序。
但是问题就在这了,注册码验证程序能写出来,但是就是不知道该如何算出真的注册码,希望有哪位大虾能抽点时间帮我看看,指点一下
附件是我根据IDA中的代码写的VB程序和源码以及ProxyCap 1.30,没有具体的整理。但是是正确的。
在这里也贴上代码,代码乱了些,勿怪
Dim a(0 To 255)
Dim b(0 To 6)
Dim c As Variant
Dim r0, r1, r2, r3, r4, r5, r7, r10, lr As Integer
Dim st, t, ser As String
Private Sub Command1_Click()
If Len(Text3.Text) = 14 Then
Text2.Text = ""
ser = ""
st = LCase(Text3.Text)

For i = 1 To 14         '对输入的注册码进行处理
    ch = Asc(Trim(Mid(st, i, 1))) - 48
    If ch > 9 Then ch = Asc(Trim(Mid(st, i, 1))) - 87
    i = i + 1
    ch2 = Asc(Trim(Mid(st, i, 1))) - 48
    If ch2 > 9 Then ch2 = Asc(Trim(Mid(st, i, 1))) - 87
    ch2 = ch2 + ch * 16
    While ch2 > 256
        ch2 = ch2 - 256
    Wend
    b((i \ 2) - 1) = ch2
Next i
    
For i = 1 To 14         '表b,作为计算密文的一个参数
    ch = Asc(Trim(Mid(st, i, 1))) - 48
    If ch > 9 Then ch = Asc(Trim(Mid(st, i, 1))) - 87
    i = i + 1
    ch2 = Asc(Trim(Mid(st, i, 1))) - 48
    If ch2 > 9 Then ch2 = Asc(Trim(Mid(st, i, 1))) - 87
    ch2 = ch2 + ch * 16
    While ch2 > 256
        ch2 = ch2 - 256
    Wend
    b((i \ 2) - 1) = ch2
Next i

r10 = 0
For i = 0 To 255        '表a,计算密文的一个参数
    a(i) = Hex(i)
Next i

For i = 0 To 255        '对表a进行处理
    r2 = HexToDec(a(i))
    r3 = b(i Mod 7)
    r0 = 7
    r3 = r3 + r2
    r2 = r3 + r10
    r3 = r2 \ 256
    r3 = r2 - r3 * (2 ^ 8)
    While r3 > 255
        r3 = r3 - 255
    Wend
    r10 = r3
    r4 = r10
    t = a(i)
    a(i) = a(r10)
    a(r10) = t
Next i

c = Array("99", "14", "d3", "54")       '计算密文的一相关参数
r10 = 0
r2 = 0

For i = 1 To 4          '计算密文
    lr = r11 + 1
    r3 = lr \ (2 ^ 8)
    r3 = lr - r3 * 2 ^ 8
    r7 = r3
    r4 = r7
    lr = HexToDec(a(r4))
    r3 = r10 + 1
    r5 = r10
    r10 = r3 * 2 ^ 16
    r2 = r2 + lr
    r3 = r2 \ (2 ^ 8)
    r3 = r2 - r3 * (2 ^ 8)
    lr = r3
    r3 = HexToDec(a(lr))
    r2 = HexToDec(a(r4))
    r10 = r10 \ (2 ^ 16)
    a(r4) = Hex(r3)
    a(lr) = Hex(r2)
    r2 = r2 And 255
    r3 = r2
    r3 = r3 And 255
    r1 = HexToDec(a(r4))
    r3 = r3 \ (2 ^ 8)
    r3 = r2 - r3 * 2 ^ 8
    r3 = r3 + r1
    r3 = r3 And 255
    r0 = HexToDec(c(r5))
    r3 = HexToDec(a(r3))
    r11 = r7
    r2 = lr
    r3 = r3 Xor r0
    ser = Hex(r3) + ser  'ser即为密文,若最后等于“4C12F0”,明文即为正确的
Next i
If ser = "4C12F0" Then MsgBox "成功逆向!", vbOKOnly
End If

End Sub

Private Function HexToDec(ByVal strHex As String) As Long
On Error GoTo ErrorDo
    Dim Tmp     As Long
    Dim s     As String
    s = "&H" & strHex
    Tmp = Val(s)
    HexToDec = Tmp
    Exit Function
ErrorDo:
    HexToDec = -1
End Function

Private Sub Command2_Click()
End
End Sub

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
没仔细看,感觉代码有点啰嗦
2009-11-2 19:20
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
的确,代码几乎就是照搬IDA的反汇编,跟了两三天,头都大了。就没再去分析整理了,见谅
2009-11-2 19:31
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
WM软件还是SB上的,或是其它手机软件?
2009-11-2 21:02
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
算法俺不会,喜欢暴破。
2009-11-2 21:04
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大哥是IOI的蓝版?
这个东西是WM软件,PPC用的。代理软件,CMWAP上CMNET


爆破也试了,软件的主程序和DLL文件都有注册验证,两个我都修改爆破过。
运行后,显示已注册,也不会在联网时跳注册提示
但是,感觉上软件的代理功能并没有起作用。
尝试了原版,但是原版在我的机器一用他代理联网立马提示注册了,根本没法测,也不知道原版是不是也这样。
所以怀疑其他地方是不是还有验证过程
IDA看了N久,还是找不到,完全没有头绪。只有想说是找到注册码了
2009-11-2 21:13
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
.....获取的信息..
输入的信息...
计算的算法
最后是得出的注册码..
你前面两个.它获取到什么信息.根据什么信息出来的注册码还不知道.那你知道它的算法有用吗?
这个绝对是入门的误区..不是看明白算法就是搞掉注册码的..
2009-11-3 13:01
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
研究了下仿真代码,基本上是废品。
2009-11-3 14:15
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汗,废品么?难道找的地方就这么的没意义啊。吐血ing.......
2009-11-3 15:04
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
整个过程并没有出现真正的注册码,何谓“最后是得出的注册码”?
至于前面的两个参数,他获取的信息很清楚啊,起什么作用也知道啊。
这个算法只是注册码验证,并非算码。
对输入的假码进行算法处理,最后得到一个密文,这个密文与程序内置的密文对比,相等就承认是合法的注册码。而这个密文的算法中需要的参数来自对输入的注册码的处理。
2009-11-3 15:10
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
恩学习了,看看代码
2009-11-3 15:26
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
将反汇编代码贴出来,并附上详细的分析说明。
可能你的VB也不大熟悉,代码问题多多。
                     
2009-11-3 16:40
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
整个反汇编代码很长现在贴出来

主要流程:
.text:0001C14C ; *************** S U B R O U T I N E ***************************************
.text:0001C14C
.text:0001C14C ; Attributes: bp-based frame
.text:0001C14C
.text:0001C14C sub_1C14C                               ; CODE XREF: 000156C8p
.text:0001C14C                                         ; sub_1C268+88p
.text:0001C14C
.text:0001C14C var_20= -0x20
.text:0001C14C var_1C= -0x1C
.text:0001C14C var_18= -0x18
.text:0001C14C oldR4= -0x14
.text:0001C14C oldR5= -0x10
.text:0001C14C oldR11= -0xC
.text:0001C14C oldSP= -8
.text:0001C14C oldLR= -4
.text:0001C14C
.text:0001C14C MOV     R12, SP
.text:0001C150 STMFD   SP!, {R4,R5,R11,R12,LR}
.text:0001C154 ADD     R11, SP, #0x14
.text:0001C158 SUB     SP, SP, #0xC
.text:0001C15C MOV     R4, R1                          ; R4=R1,即R4=输入的注册码
.text:0001C160 MOV     R0, R4                          ; R0=R4
.text:0001C164 BL      wcslen                          ; 获取输入的注册码长度赋给R0
.text:0001C164
.text:0001C168 CMP     R0, #0x12                       ; 输入的注册码长度是否为18,不是则跳走
.text:0001C16C BEQ     loc_1C178                       ; 输入的注册码长度为18则跳至此处
.text:0001C16C                                         ; R0=R4,即R0=输入的注册码
.text:0001C16C
.text:0001C170
.text:0001C170 loc_1C170                               ; CODE XREF: sub_1C14C+38j
.text:0001C170 MOV     R4, #0
.text:0001C174 B       loc_1C22C
.text:0001C174
.text:0001C178 ; ---------------------------------------------------------------------------
.text:0001C178
.text:0001C178 loc_1C178                               ; CODE XREF: sub_1C14C+20j
.text:0001C178 MOV     R0, R4                          ; 输入的注册码长度为18则跳至此处
.text:0001C178                                         ; R0=R4,即R0=输入的注册码
.text:0001C17C BL      sub_16FE8                       ; 使[地址]BL=PC+4,并跳至sub_16FE8
.text:0001C17C
.text:0001C180 MOVS    R5, R0                          ; R5=R0,即R5为WideCharToMultiByte处理后的注册码
.text:0001C184 BEQ     loc_1C170
.text:0001C184
.text:0001C188 STR     R5, [R11,#var_1C]               ; 将R5中的字数据写入以R11-0X1C为地址的存储器中
.text:0001C18C MOV     R0, R5                          ; R0=R5,即R0=处理后的注册码
.text:0001C190 BL      sub_1C054                       ; 使[地址]BL=PC+4,并跳至注册码处理转换过程
.text:0001C190
.text:0001C194 MOVS    R4, R0                          ; R4=R0,即R4=处理后的注册码
.text:0001C198 BNE     loc_1C1AC                       ; 将R4中的字数据写入以R11-0X18为地址的存储器中
.text:0001C198
.text:0001C19C
.text:0001C19C loc_1C19C                               ; CODE XREF: sub_1C14C+88j
.text:0001C19C MOV     R0, R5
.text:0001C1A0 BL      operator delete[](void *)
.text:0001C1A0
.text:0001C1A4 MOV     R4, #0
.text:0001C1A8 B       loc_1C22C
.text:0001C1A8
.text:0001C1AC ; ---------------------------------------------------------------------------
.text:0001C1AC
.text:0001C1AC loc_1C1AC                               ; CODE XREF: sub_1C14C+4Cj
.text:0001C1AC STR     R4, [R11,#var_18]               ; 将R4中的字数据写入以R11-0X18为地址的存储器中
.text:0001C1B0 LDRB    R1, [R4,#7]                     ; R1=R4数据后移7位的值
.text:0001C1B4 LDRB    R2, [R4,#8]                     ; R1=R4数据后移8位的值
.text:0001C1B8 MOVL    R3, 0xBB8                      ;注册码后4位与0XBB8比较
.text:0001C1C0 ORR     R0, R1, R2,LSL#8                ; R0=R1 ORR R2*2^8
.text:0001C1C4 CMP     R0, R3                          ; R0与R3比较
.text:0001C1C8 BLT     loc_1C1D8                       ; 小于则跳至loc_1C1D8
.text:0001C1C8
.text:0001C1CC MOV     R0, R4
.text:0001C1D0 BL      operator delete[](void *)
.text:0001C1D0
.text:0001C1D4 B       loc_1C19C
.text:0001C1D4
.text:0001C1D8 ; ---------------------------------------------------------------------------
.text:0001C1D8
.text:0001C1D8 loc_1C1D8                               ; CODE XREF: sub_1C14C+7Cj
.text:0001C1D8 LDR     R1, =loc_236C0
.text:0001C1DC MOV     R3, #7                          ; R3=7
.text:0001C1E0 MOV     R2, R4                          ; R2=R4
.text:0001C1E4 LDR     LR, [R1,R0,LSL#2]               ; LR=R1+R0*2^2,R1=R1+R0*2^2
.text:0001C1E8 MOV     R1, #4                          ; R1=4
.text:0001C1EC SUB     R0, R11, #0x20                  ; R0=R11-0X20
.text:0001C1F0 STR     LR, [R11,#var_20]
.text:0001C1F4 BL      sub_1E1CC                       ; 进入密文计算过程
.text:0001C1F4
.text:0001C1F8 LDR     R2, =0x4C12F0
.text:0001C1FC LDR     R3, [R11,#var_20]               ; 密文赋给R3
.text:0001C200 CMP     R3, R2                          ; 判断密文是否正确
.text:0001C204 BEQ     loc_1C218
.text:0001C204
.text:0001C208 MOV     R0, R4
.text:0001C20C BL      operator delete[](void *)
.text:0001C20C
.text:0001C210 MOV     R4, #0
.text:0001C214 B       loc_1C224
.text:0001C214
.text:0001C218 ; ---------------------------------------------------------------------------
.text:0001C218
.text:0001C218 loc_1C218                               ; CODE XREF: sub_1C14C+B8j
.text:0001C218 MOV     R0, R4
.text:0001C21C BL      operator delete[](void *)
.text:0001C21C
.text:0001C220 MOV     R4, #1
.text:0001C220
.text:0001C224
.text:0001C224 loc_1C224                               ; CODE XREF: sub_1C14C+C8j
.text:0001C224 MOV     R0, R5
.text:0001C228 BL      operator delete[](void *)
.text:0001C228
.text:0001C22C
.text:0001C22C loc_1C22C                               ; CODE XREF: sub_1C14C+28j
.text:0001C22C                                         ; sub_1C14C+5Cj
.text:0001C22C MOV     R0, R4
.text:0001C230 SUB     SP, R11, #0x14
.text:0001C234 LDMFD   SP, {R4,R5,R11,SP,PC}
.text:0001C234
.text:0001C234 ; End of function sub_1C14C


注册码处理转换过程:
.text:0001C054 ; *************** S U B R O U T I N E ***************************************
.text:0001C054
.text:0001C054
.text:0001C054 sub_1C054                               ; CODE XREF: sub_1C14C+44p
.text:0001C054 STMFD   SP!, {R4-R9,LR}
.text:0001C058 MOV     R8, R0                          ; R8=R0,即R8=处理后的注册码
.text:0001C05C BL      strlen                          ; 使[地址]BL=PC+4,并调用strlen函数。R0=处理后的注册码长度
.text:0001C05C
.text:0001C060 MOV     R5, R0                          ; R5=R0,即R5=处理后的注册码长度
.text:0001C064 ADD     R3, R5, R5,LSR#31               ; R3=R5+(R5 >> 31)=R5
.text:0001C068 MOV     R9, R3,ASR#1                    ; R9=R3 > 1(R3=10010,R3>1=01001)
.text:0001C06C SUBS    R3, R5, R9,LSL#1                ; R3=R5-(R9<<1)
.text:0001C070 MOV     R4, #0                          ; R4=0
.text:0001C074 BNE     loc_1C130
.text:0001C074
.text:0001C078 CMP     R5, #0                          ; R5与0比较
.text:0001C07C BLE     loc_1C0A0                       ; 小于等于则跳至loc_1C0A0
.text:0001C07C
.text:0001C080
.text:0001C080 loc_1C080                               ; CODE XREF: sub_1C054+48j
.text:0001C080 LDRSB   R0, [R8]                        ; 判断输入的注册码各位是否合法
.text:0001C080                                         ; R0=当前数字的ASCII值
.text:0001C084 MOV     R1, #0x80                       ; R1=0X80
.text:0001C088 BL      _isctype                        ; 如果为整数,则R0=R1
.text:0001C088
.text:0001C08C CMP     R0, #0
.text:0001C090 BEQ     loc_1C138
.text:0001C090
.text:0001C094 ADD     R4, R4, #1                      ; R4=R4+1
.text:0001C098 CMP     R4, R5                          ; R4与R5的值比较,即与注册码长度比较
.text:0001C09C BLT     loc_1C080                       ; 小于则跳至loc_1C080
.text:0001C09C
.text:0001C0A0
.text:0001C0A0 loc_1C0A0                               ; CODE XREF: sub_1C054+28j
.text:0001C0A0 MOV     R0, R9                          ; R0=R9
.text:0001C0A4 BL      operator new[](uint)            ; 申请内存
.text:0001C0A4
.text:0001C0A8 MOV     R4, R0                          ; R4=R0
.text:0001C0AC MOV     R7, #0                          ; R7=0
.text:0001C0B0 CMP     R9, #0                          ; R9的值与0比较,再次确认注册码长度有效
.text:0001C0B4 BLE     loc_1C130                       ; 小于等于则跳至loc_1C130
.text:0001C0B4
.text:0001C0B8
.text:0001C0B8 loc_1C0B8                               ; CODE XREF: sub_1C054+D8j
.text:0001C0B8 LDRB    R5, [R8]                        ; 注册码验证
.text:0001C0B8                                         ; 将当前位置注册码的ASCII赋值给R5
.text:0001C0BC MOV     R1, #1                          ; R1=1
.text:0001C0C0 MOV     R0, R5                          ; R0=R5
.text:0001C0C4 BL      _isctype                        ; 判断是否是大写字母,是则R0=R1
.text:0001C0C4
.text:0001C0C8 CMP     R0, #0                          ; R0与0比较
.text:0001C0CC BEQ     loc_1C0DC                       ; 相等则跳至loc_1C0DC
.text:0001C0CC
.text:0001C0D0 MOV     R0, R5
.text:0001C0D4 BL      tolower
.text:0001C0D4
.text:0001C0D8 MOV     R5, R0
.text:0001C0D8
.text:0001C0DC
.text:0001C0DC loc_1C0DC                               ; CODE XREF: sub_1C054+78j
.text:0001C0DC SUB     R6, R5, #0x30                   ; R6=R5-0X30
.text:0001C0E0 CMP     R6, #9                          ; R6的值与9比较
.text:0001C0E4 SUBHI   R6, R5, #0x57                   ; 大于则执行操作R6=R5-0X57
.text:0001C0E8 LDRB    R5, [R8,#1]                     ; R5=当前注册码位置后一位字符的ASCII
.text:0001C0EC MOV     R1, #1                          ; R1=1
.text:0001C0F0 MOV     R0, R5                          ; R0=R5
.text:0001C0F4 BL      _isctype                        ; 判断是否是大写字母,是则R0=R1
.text:0001C0F4
.text:0001C0F8 CMP     R0, #0                          ; R0与0比较
.text:0001C0FC BEQ     loc_1C10C                       ; 相等则跳至loc_1C10C
.text:0001C0FC
.text:0001C100 MOV     R0, R5
.text:0001C104 BL      tolower
.text:0001C104
.text:0001C108 MOV     R5, R0
.text:0001C108
.text:0001C10C
.text:0001C10C loc_1C10C                               ; CODE XREF: sub_1C054+A8j
.text:0001C10C SUB     R3, R5, #0x30                   ; R3=R5-0X30
.text:0001C110 CMP     R3, #9                          ; R3的值与9比较
.text:0001C114 SUBHI   R3, R5, #0x57                   ; 大于则执行操作R3=R5-0X57
.text:0001C118 ADD     R3, R3, R6,LSL#4                ; R3=R3+(R6<<4)
.text:0001C11C STRB    R3, [R7,R4]                     ; 将寄存器R3中的字节数据写入以R7+R4为地址的存储器中
.text:0001C120 ADD     R7, R7, #1                      ; R7=R7+1
.text:0001C124 CMP     R7, R9                          ; R7与R9比较
.text:0001C128 ADD     R8, R8, #2                      ; R8=R8+2
.text:0001C12C BLT     loc_1C0B8                       ; 注册码验证
.text:0001C12C                                         ; 将当前位置注册码的ASCII赋值给R5
.text:0001C12C
.text:0001C130
.text:0001C130 loc_1C130                               ; CODE XREF: sub_1C054+20j
.text:0001C130                                         ; sub_1C054+60j
.text:0001C130 MOV     R0, R4
.text:0001C134 LDMFD   SP!, {R4-R9,PC}
.text:0001C134
.text:0001C138 ; ---------------------------------------------------------------------------
.text:0001C138
.text:0001C138 loc_1C138                               ; CODE XREF: sub_1C054+3Cj
.text:0001C138 MOV     R4, #0
.text:0001C13C MOV     R0, R4
.text:0001C140 LDMFD   SP!, {R4-R9,PC}
.text:0001C140
.text:0001C140 ; End of function sub_1C054


中间过程
.text:0001E1CC sub_1E1CC
.text:0001E1CC
.text:0001E1CC var_114= -0x114
.text:0001E1CC var_10= -0x10
.text:0001E1CC
.text:0001E1CC STMFD   SP!, {R4,R5,LR}
.text:0001E1D0 SUB     SP, SP, #0x108  ; SP=SP-0X100
.text:0001E1D4 MOV     R4, R1          ; R4=R1
.text:0001E1D8 MOV     R5, R0          ; R5=R0
.text:0001E1DC LDR     LR, =loc_236B8
.text:0001E1E0 LDR     LR, [LR]
.text:0001E1E4 STR     LR, [SP,#0x114+var_10]
.text:0001E1E8 MOV     R0, R2          ; R0=R2
.text:0001E1EC ADD     R2, SP, #0x114+var_114
.text:0001E1F0 MOV     R1, R3          ; R1=R3
.text:0001E1F4 BL      sub_1E028    ;密文计算参数表过程
.text:0001E1F8 ADD     R2, SP, #0x114+var_114 ; R2=SP
.text:0001E1FC MOV     R1, R4          ; R1=R4
.text:0001E200 MOV     R0, R5          ; R0=R5
.text:0001E204 BL      sub_1E0F4     ;密文计算过程
.text:0001E208 LDR     R0, [SP,#0x114+var_10]
.text:0001E20C BL      sub_1B710
.text:0001E210 ADD     SP, SP, #0x108
.text:0001E214 LDMFD   SP!, {R4,R5,PC}
.text:0001E214 ; End of function sub_1


密文计算参数表过程,参数表长256
.text:0001E028 ; *************** S U B R O U T I N E ***************************************
.text:0001E028
.text:0001E028
.text:0001E028 sub_1E028                               ; CODE XREF: sub_1E1CC+28p
.text:0001E028
.text:0001E028 var_28= -0x28
.text:0001E028
.text:0001E028 STMFD   SP!, {R4-R11,LR}
.text:0001E02C SUB     SP, SP, #4
.text:0001E030 MOV     R11, R1
.text:0001E034 MOV     R1, R0                          ; R1=R0,即R1=处理后的注册码
.text:0001E038 STR     R1, [SP,#0x28+var_28]           ; SP的值=R1
.text:0001E03C MOV     R7, R2                          ; R7=R2
.text:0001E040 MOV     LR, #0                          ; LR=0
.text:0001E044 MOV     R2, #0                          ; R2=0
.text:0001E044
.text:0001E048
.text:0001E048 loc_1E048                               ; CODE XREF: sub_1E028+38j
.text:0001E048 ADD     R3, R2, #1                      ; R3=R2+1
.text:0001E04C STRB    LR, [R2,R7]                     ; 将寄存器LR中的字节数据写入以R2+R7为地址的存储器中
.text:0001E050 MOV     LR, R3,LSL#16                   ; LR=R3<<16
.text:0001E054 MOV     LR, LR,ASR#16                   ; LR=LR>16
.text:0001E058 MOV     R2, LR                          ; R2=LR
.text:0001E05C CMP     LR, #0x100                      ; LR与0X100比较
.text:0001E060 BLT     loc_1E048                       ; 小于则循环
.text:0001E060
.text:0001E064 MOV     R3, #0
.text:0001E068 LDR     R8, =__rt_sdiv
.text:0001E06C STRB    R3, [R7,#0x100]
.text:0001E070 STRB    R3, [R7,#0x101]
.text:0001E074 MOV     LR, #0                          ; LR=0
.text:0001E078 MOV     R10, #0                         ; R10=0
.text:0001E07C MOV     R9, #0                          ; R9=0
.text:0001E07C
.text:0001E080
.text:0001E080 loc_1E080                               ; CODE XREF: sub_1E028+BCj
.text:0001E080 MOV     R6, R9                          ; R6=R9
.text:0001E084 LDRB    R2, [R6,R7]!                    ; 将存储器地址为R6+R7的字节数据读入寄存器R2,并将R2的高 24 位清零。
.text:0001E088 LDRB    R3, [LR,R1]                     ; 将存储器地址为LR+R1的字节数据读入寄存器R3,并将R3的高 24 位清零。
.text:0001E08C ADD     R1, LR, #1                      ; R1=LR+1
.text:0001E090 MOV     R0, R11                         ; R0=R11
.text:0001E094 ADD     R3, R3, R2                      ; R3=R3+R2
.text:0001E098 ADD     R2, R3, R10                     ; R2=R3+R10
.text:0001E09C MOVS    R3, R2                          ; R3=R2
.text:0001E0A0 ADDMI   R3, R3, #0xFF
.text:0001E0A4 MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E0A8 SUB     R3, R2, R3,LSL#8                ; R3=R2-R3*2^8
.text:0001E0AC AND     R10, R3, #0xFF                  ; R10=R3+0XFF
.text:0001E0B0 MOV     R4, R10                         ; R4=R10
.text:0001E0B4 LDRB    R3, [R4,R7]!                    ; R4=R4+R7;R3=[R4]并将R3高24位清零
.text:0001E0B8 LDRB    R2, [R6]
.text:0001E0BC STRB    R3, [R6]
.text:0001E0C0 STRB    R2, [R4]
.text:0001E0C4 MOV     LR, PC                          ; LR=PC
.text:0001E0C8 LDR     PC, [R8]
.text:0001E0CC ADD     R3, R9, #1                      ; R3=R9+1
.text:0001E0D0 MOV     R9, R3,LSL#16                   ; R9=R3*2^16
.text:0001E0D4 MOV     R9, R9,ASR#16                   ; R9=R9>16
.text:0001E0D8 AND     LR, R1, #0xFF                   ; LR=R1+0XFF
.text:0001E0DC LDR     R1, [SP,#0x28+var_28]
.text:0001E0E0 CMP     R9, #0x100                      ; R9与0X100比较
.text:0001E0E4 BLT     loc_1E080                       ; R6=R9
.text:0001E0E4
.text:0001E0E8 ADD     SP, SP, #4                      ; SP=SP+4
.text:0001E0EC LDMFD   SP!, {R4-R11,PC}
.text:0001E0EC
.text:0001E0EC ; End of function sub_1E028
.text:0001E0EC
.text:0001E0EC ; ---------------------------------------------------------------------------
.text:0001E0F0 off_1E0F0 DCD __rt_sdiv                 ; DATA XREF: sub_1E028+40r
.text:0001E0F4
.text:0001E0F4 ; *************** S U B R O U T I N E ***************************************
.text:0001E0F4
.text:0001E0F4
.text:0001E0F4 sub_1E0F4                               ; CODE XREF: sub_1E1CC+38p
.text:0001E0F4 STMFD   SP!, {R4-R11,LR}
.text:0001E0F8 MOV     R6, R2
.text:0001E0FC MOV     R8, R1
.text:0001E100 MOV     R9, R0
.text:0001E104 LDRB    R7, [R6,#0x100]
.text:0001E108 LDRB    LR, [R6,#0x101]
.text:0001E10C CMP     R8, #0
.text:0001E110 BLE     loc_1E1B8
.text:0001E110
.text:0001E114 MOV     R11, R7
.text:0001E118 MOV     R2, LR
.text:0001E11C MOV     R10, #0
.text:0001E11C
.text:0001E120
.text:0001E120 loc_1E120                               ; CODE XREF: sub_1E0F4+C0j
.text:0001E120 ADD     LR, R11, #1                     ; LR=R11+1
.text:0001E124 MOVS    R3, LR                          ; R3=LR
.text:0001E128 ADDMI   R3, R3, #0xFF
.text:0001E12C MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E130 SUB     R3, LR, R3,LSL#8                ; R3=LR-R3<<8
.text:0001E134 AND     R7, R3, #0xFF
.text:0001E138 MOV     R4, R7                          ; R4=R7
.text:0001E13C LDRB    LR, [R4,R6]!
.text:0001E140 ADD     R3, R10, #1                     ; R3=R10+1
.text:0001E144 MOV     R5, R10                         ; R5=R10
.text:0001E148 MOV     R10, R3,LSL#16                  ; R10=R3<<16
.text:0001E14C ADD     R2, LR, R2                      ; R2=LR+R2
.text:0001E150 MOVS    R3, R2                          ; R3=R2
.text:0001E154 ADDMI   R3, R3, #0xFF
.text:0001E158 MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E15C SUB     R3, R2, R3,LSL#8                ; R3=R2-R3<<8
.text:0001E160 AND     LR, R3, #0xFF
.text:0001E164 LDRB    R3, [LR,R6]
.text:0001E168 LDRB    R2, [R4]
.text:0001E16C MOV     R10, R10,ASR#16                 ; R10=R10>16
.text:0001E170 STRB    R3, [R4]
.text:0001E174 STRB    R2, [LR,R6]
.text:0001E178 AND     R2, R2, #0xFF
.text:0001E17C MOVS    R3, R2                          ; R3=R2
.text:0001E180 ADDMI   R3, R3, #0xFF
.text:0001E184 LDRB    R1, [R4]
.text:0001E188 MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E18C SUB     R3, R2, R3,LSL#8                ; R3=R2-R3<<8
.text:0001E190 ADD     R3, R3, R1                      ; R3=R3+R1
.text:0001E194 LDRB    R0, [R5,R9]!
.text:0001E198 AND     R3, R3, #0xFF
.text:0001E19C LDRB    R3, [R3,R6]
.text:0001E1A0 MOV     R11, R7                         ; R11=R7
.text:0001E1A4 MOV     R2, LR                          ; R2=LR
.text:0001E1A8 EOR     R3, R3, R0                      ; R3=R3 EOR R0
.text:0001E1AC STRB    R3, [R5]
.text:0001E1B0 CMP     R10, R8
.text:0001E1B4 BLT     loc_1E120                       ; LR=R11+1
.text:0001E1B4
.text:0001E1B8
.text:0001E1B8 loc_1E1B8                               ; CODE XREF: sub_1E0F4+1Cj
.text:0001E1B8 STRB    R7, [R6,#0x100]
.text:0001E1BC STRB    LR, [R6,#0x101]
.text:0001E1C0 LDMFD   SP!, {R4-R11,PC}
.text:0001E1C0
.text:0001E1C0 ; End of function sub_1E0F4
.text:0001E1C0
.text:0001E1C0 ; ---------------------------------------------------------------------------
.text:0001E1C4 DCD sub_1D840
.text:0001E1C8 DCD loc_22834
.text:0001E1CC
.text:0001E1CC ; *************** S U B R O U T I N E ***************************************
.text:0001E1CC
.text:0001E1CC
.text:0001E1CC sub_1E1CC                               ; CODE XREF: sub_19A98+39Cp
.text:0001E1CC                                         ; sub_1A4C0+620p
.text:0001E1CC                                         ; sub_1A4C0+6C8p
.text:0001E1CC                                         ; sub_1BB28+48p
.text:0001E1CC                                         ; sub_1BD18+7Cp
.text:0001E1CC                                         ; sub_1BD18+98p ...
.text:0001E1CC
.text:0001E1CC var_114= -0x114
.text:0001E1CC var_10= -0x10
.text:0001E1CC
.text:0001E1CC STMFD   SP!, {R4,R5,LR}
.text:0001E1D0 SUB     SP, SP, #0x108                  ; SP=SP-0X100
.text:0001E1D4 MOV     R4, R1                          ; R4=R1
.text:0001E1D8 MOV     R5, R0                          ; R5=R0
.text:0001E1DC LDR     LR, =loc_236B8
.text:0001E1E0 LDR     LR, [LR]
.text:0001E1E4 STR     LR, [SP,#0x114+var_10]
.text:0001E1E8 MOV     R0, R2                          ; R0=R2
.text:0001E1EC ADD     R2, SP, #0x114+var_114
.text:0001E1F0 MOV     R1, R3                          ; R1=R3
.text:0001E1F4 BL      sub_1E028
.text:0001E1F4
.text:0001E1F8 ADD     R2, SP, #0x114+var_114          ; R2=SP
.text:0001E1FC MOV     R1, R4                          ; R1=R4
.text:0001E200 MOV     R0, R5                          ; R0=R5
.text:0001E204 BL      sub_1E0F4
.text:0001E204
.text:0001E208 LDR     R0, [SP,#0x114+var_10]
.text:0001E20C BL      sub_1B710
.text:0001E20C
.text:0001E210 ADD     SP, SP, #0x108
.text:0001E214 LDMFD   SP!, {R4,R5,PC}
.text:0001E214
.text:0001E214 ; End of function sub_1E1CC
.text:0001E214
.text:0001E214 ; ---------------------------------------------------------------------------
.text:0001E218 off_1E218 DCD loc_236B8                 ; DATA XREF: sub_1E1CC+10r
.text:0001E21C
.text:0001E21C ; *************** S U B R O U T I N E ***************************************
.text:0001E21C
.text:0001E21C
.text:0001E21C sub_1E21C                               ; CODE XREF: 0001DAF4p
.text:0001E21C LDR     R3, =off_22614
.text:0001E220 MOVL    R2, 0xFFFFFFFF
.text:0001E224 MOV     R1, #0
.text:0001E228 STR     R3, [R0]
.text:0001E22C STR     R2, [R0,#4]
.text:0001E230 STR     R1, [R0,#8]
.text:0001E234 RET
.text:0001E234
.text:0001E234 ; End of function sub_1E21C


密文计算过程
.text:0001E0F4 ; *************** S U B R O U T I N E ***************************************
.text:0001E0F4
.text:0001E0F4
.text:0001E0F4 sub_1E0F4                               ; CODE XREF: sub_1E1CC+38p
.text:0001E0F4 STMFD   SP!, {R4-R11,LR}
.text:0001E0F8 MOV     R6, R2
.text:0001E0FC MOV     R8, R1
.text:0001E100 MOV     R9, R0
.text:0001E104 LDRB    R7, [R6,#0x100]
.text:0001E108 LDRB    LR, [R6,#0x101]
.text:0001E10C CMP     R8, #0
.text:0001E110 BLE     loc_1E1B8
.text:0001E110
.text:0001E114 MOV     R11, R7
.text:0001E118 MOV     R2, LR
.text:0001E11C MOV     R10, #0
.text:0001E11C
.text:0001E120
.text:0001E120 loc_1E120                               ; CODE XREF: sub_1E0F4+C0j
.text:0001E120 ADD     LR, R11, #1                     ; LR=R11+1
.text:0001E124 MOVS    R3, LR                          ; R3=LR
.text:0001E128 ADDMI   R3, R3, #0xFF
.text:0001E12C MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E130 SUB     R3, LR, R3,LSL#8                ; R3=LR-R3<<8
.text:0001E134 AND     R7, R3, #0xFF
.text:0001E138 MOV     R4, R7                          ; R4=R7
.text:0001E13C LDRB    LR, [R4,R6]!
.text:0001E140 ADD     R3, R10, #1                     ; R3=R10+1
.text:0001E144 MOV     R5, R10                         ; R5=R10
.text:0001E148 MOV     R10, R3,LSL#16                  ; R10=R3<<16
.text:0001E14C ADD     R2, LR, R2                      ; R2=LR+R2
.text:0001E150 MOVS    R3, R2                          ; R3=R2
.text:0001E154 ADDMI   R3, R3, #0xFF
.text:0001E158 MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E15C SUB     R3, R2, R3,LSL#8                ; R3=R2-R3<<8
.text:0001E160 AND     LR, R3, #0xFF
.text:0001E164 LDRB    R3, [LR,R6]
.text:0001E168 LDRB    R2, [R4]
.text:0001E16C MOV     R10, R10,ASR#16                 ; R10=R10>16
.text:0001E170 STRB    R3, [R4]
.text:0001E174 STRB    R2, [LR,R6]
.text:0001E178 AND     R2, R2, #0xFF
.text:0001E17C MOVS    R3, R2                          ; R3=R2
.text:0001E180 ADDMI   R3, R3, #0xFF
.text:0001E184 LDRB    R1, [R4]
.text:0001E188 MOV     R3, R3,ASR#8                    ; R3=R3>8
.text:0001E18C SUB     R3, R2, R3,LSL#8                ; R3=R2-R3<<8
.text:0001E190 ADD     R3, R3, R1                      ; R3=R3+R1
.text:0001E194 LDRB    R0, [R5,R9]!
.text:0001E198 AND     R3, R3, #0xFF
.text:0001E19C LDRB    R3, [R3,R6]
.text:0001E1A0 MOV     R11, R7                         ; R11=R7
.text:0001E1A4 MOV     R2, LR                          ; R2=LR
.text:0001E1A8 EOR     R3, R3, R0                      ; R3=R3 EOR R0
.text:0001E1AC STRB    R3, [R5]
.text:0001E1B0 CMP     R10, R8
.text:0001E1B4 BLT     loc_1E120                       ; LR=R11+1
.text:0001E1B4
.text:0001E1B8
.text:0001E1B8 loc_1E1B8                               ; CODE XREF: sub_1E0F4+1Cj
.text:0001E1B8 STRB    R7, [R6,#0x100]
.text:0001E1BC STRB    LR, [R6,#0x101]
.text:0001E1C0 LDMFD   SP!, {R4-R11,PC}
.text:0001E1C0
.text:0001E1C0 ; End of function sub_1E0F4
2009-11-3 19:16
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
说明一下,整个注册码长度是18位,不是VB程序里面显示出的14位。
但是程序将由注册码后四位获得一个参数,而这个参数是一个从程序定义的一个表中取得的,而整个表位于.data段,而且很大。所以为了算法能比较清晰,我固定了了一个固定的后四位,从而固定这个参数。
2009-11-3 19:19
0
雪    币: 113
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
孺子不可教.......我无言以对..
2009-11-3 23:14
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
软件不是有15天的试用吗?能全功能试用肯定能爆破的,你先用原版试用,看功能是否正常。
2009-11-4 08:54
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢蓝大指点。原版的我有试过安装,但是刚安装设置后,一联网它就跳注册码提示。
也不知道跳注册提示的时候只是提示还是中断网络连接,反正用原版的我也没能代理成功过
2009-11-4 12:14
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
那个,我承认我是初学者,但是这看雪是一个技术论坛吧?
你提出你的观点,我用我看到的,以及我个人的分析与你进行技术上的辩论,而且个人认为我的用词及语气之上并没有对你有任何的冒犯之意。这样的做法不知道我错在哪里了。
当然,如果你认为我的措辞不当,我道歉。
另外,可以的话,能否抽空详细评价一下我对这个注册码验证过程的分析。先谢谢夫子了
2009-11-4 12:22
0
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
问了论坛的XD,说是原版的似乎也是有问题的。
用自己的分析,破解的1.2版,貌似已经搞定。
但是能够搞明白,学到如何逆向这个算法才是最重要的。目的在于学习,不在破解。

希望得到大家的指点
2009-11-5 20:05
0
游客
登录 | 注册 方可回帖
返回
//