AVI-GIF V1.0.9 汉化版的算法跟踪
软件大小:
619 KB
软件语言: 简体中文
软件类别: 汉化补丁 / 共享版 / 图像转换
应用平台: Win9x/NT/2000/XP
下载页面:
http://www.skycn.com/soft/7228.html
软件介绍:
AVI-GIF 是一套影像转换器,它可以将 AVI转换成GIF.GIF转换成AVI影像格式,您的AVI影片若有好看的片段,但苦无转文件程序转换成GIF的话,AVI-GIF是一个不错的选择。
【作者声明】:本人是个初学者,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【破解工具】:0llydbg_cn
v1.09 TRW2000 V1.22
【过 程】:
这个软件的算法比较简单,但是断点不好下,试了几个常用的API都没有中断.只好用TRW2000跟到这里,然后再用0llydbg继续跟踪.
填好:用户名 fxyang ; 试验码 7894561230123456
跟踪过程如下:
004ACDEB
MOV EAX, DWORD PTR SS:[EBP-1C] ; EAX <== SS:[12FC70]=DF0AD8,(ASCII
"fxyang")
004ACDEE LEA EDX, DWORD PTR SS:[EBP-8]
004ACDF1
CALL AVIGIF0.0040894C ;
处理用户名
004ACDF6 LEA EDX, DWORD PTR SS:[EBP-20]
004ACDF9
MOV EAX, DWORD PTR SS:[EBP-4]
004ACDFC MOV
EAX, DWORD PTR DS:[EAX+390>
; EAX <==DS:[DE2EEC]=00DF0000,(ASCII
"tIH")
004ACE02 CALL AVIGIF0.004382F4
004ACE07
MOV EAX, DWORD PTR SS:[EBP-20] ; EAX <== SS:[12FC6C]=00E053B4,("7894561230123456")
004ACE0A
LEA EDX, DWORD PTR SS:[EBP-C]
004ACE0D CALL
AVIGIF0.0040894C ; 处理试验码的,因为没有看到别的限制,不进了
004ACE12 CMP
DWORD PTR SS:[EBP-8], 0 ; SS:[12FC84]=00DFBFC0,(ASCII"fxyang")
004ACE16
JE AVIGIF0.004ACFC8
004ACE1C LEA
EAX, DWORD PTR SS:[EBP-24]
004ACE1F PUSH EAX
004ACE20
MOV ECX, DWORD PTR SS:[EBP-8] ; ECX<==SS:[12FC84]=00DFBFC0,(ASCII"fxyang")
004ACE23
MOV EDX, 21C6918E
; EDX =21C6918E (赋值)
004ACE28 MOV EAX,
DWORD PTR SS:[EBP-4]
004ACE2B CALL AVIGIF0.004ACC08
; <==计算注册码的CALL***
004ACE30 MOV
EDX, DWORD PTR SS:[EBP-24]
; EDX
<== SS:[EBP-24]=00E053F4,(ASCII "1074552978-1272341746-1843791096")得到的真注册码
004ACE33
MOV EAX, DWORD PTR SS:[EBP-C]
;
EAX <==SS:[12FC80]=00E053D4,(ASCII "7894561230123456")输入的试验码
004ACE36
CALL AVIGIF0.004048F0
; 注册码的比较CALL
004ACE3B JNZ AVIGIF0.004ACF93
; 关键跳转,爆破点
004ACE41
LEA EDX, DWORD PTR SS:[EBP-2C]
004ACE44 XOR
EAX, EAX
======================================
CALL AVIGIF0.004ACC08 ; <==计算注册码的CALL***
--------------------------------------
004ACC08
PUSH EBP
004ACC09 MOV EBP, ESP
004ACC0B
PUSH 0
004ACC0D PUSH 0
004ACC0F PUSH
0
004ACC11 PUSH 0
004ACC13 PUSH
0
004ACC15 PUSH EBX
; 计算部分开始
004ACC16
PUSH ESI
004ACC17 PUSH EDI
004ACC18
MOV [LOCAL.2], ECX ; SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC1B
MOV [LOCAL.1], EDX ; SS:[12FC40]<==EDX
=21C6918E (赋值)
004ACC1E MOV EAX, [LOCAL.2] ;
EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC21 CALL
AVIGIF0.00404994
004ACC26 XOR EAX, EAX
004ACC28
PUSH EBP
004ACC29 PUSH AVIGIF0.004ACD9A
004ACC2E
PUSH DWORD PTR FS:[EAX]
004ACC31 MOV
DWORD PTR FS:[EAX], ESP
004ACC34 LEA EAX, [LOCAL.3]
004ACC37
CALL AVIGIF0.004044F4
004ACC3C XOR ESI,
ESI
004ACC3E CMP [LOCAL.1], 0
004ACC42 JE
AVIGIF0.004ACD74
004ACC48 CMP [LOCAL.2], 0
004ACC4C
JE AVIGIF0.004ACD74
004ACC52 MOV
EAX, [LOCAL.2] ; EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC55
CALL AVIGIF0.004047AC
004ACC5A MOV EBX,
EAX ; EBX=6
004ACC5C
TEST EBX, EBX
004ACC5E JLE SHORT AVIGIF0.004ACC86
004ACC60
MOV EDI, 1
; EDI=1 (赋值) 第一次计算
004ACC65 /MOV
EAX, [LOCAL.2] ; EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC68
|CALL AVIGIF0.004047AC ; 取长度的CALL
004ACC6D
|IMUL [LOCAL.1] ; EAX=EAX*SS:[12FC40]=6*21C6918E=CAA76954
004ACC70
|ADD ESI, EAX
; ESI=ESI+EAX=0+CAA76954
004ACC72 |MOV EAX, [LOCAL.2]
; EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC75
|MOVZX EAX, BYTE PTR DS:[EAX+EDI>; EAX<==DS:[DFBFC0]=66
('f')
004ACC7A |IMUL EAX, EAX, 2CE
; EAX=EAX*2CE=66*2CE=11E14
004ACC80 |ADD
ESI, EAX ; ESI=ESI+EAX=CAA76954+11E14=CAA88768
004ACC82
|INC EDI
004ACC83 |DEC EBX
; 计算的次数
004ACC84
\JNZ SHORT AVIGIF0.004ACC65
; //这段计算是把用户名各位的hex值*2CE+用户名长度平方*21C6918E,得到的值==>ESI
004ACC86
MOV EAX, ESI
; EAX<==ESI=BFF39F6E (上面的值)
004ACC88 CDQ
004ACC89
XOR EAX, EDX
; EAX=EAX XOR EDX=BFF39F6E XOR FFFFFFFF=400C6091
004ACC8B
SUB EAX, EDX
; EAX=EAX SUB EDX=400C6091-FFFFFFFF=400C6091+1=400C6092
004ACC8D
LEA EDX, [LOCAL.3]
004ACC90 CALL AVIGIF0.00408A00
; <==用户名经过第一次计算后的值 MOD A 直到商=0
余数往前排就得到一组新的值
004ACC95 LEA EAX, [LOCAL.3]
004ACC98 PUSH
EAX
004ACC99 MOV EAX, [LOCAL.3] ;
EAX <==SS:[12FC38]=00DFE338,(ASCII "1074552978")
004ACC9C
CALL AVIGIF0.004047AC
004ACCA1 MOV EDX,
EAX ; EDX=A
(1074552978)
004ACCA3 SUB EDX, 0A
004ACCA6 MOV
ECX, 0A
004ACCAB MOV EAX, [LOCAL.3] ;
EAX <==SS:[12FC38]=00DFE338,(ASCII "1074552978")
004ACCAE
CALL AVIGIF0.00404A04
004ACCB3 MOV EAX,
[LOCAL.2] ; EAX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCB6
CALL AVIGIF0.004047AC ;
取用户名长度的CALL
004ACCBB MOV EBX, EAX
004ACCBD TEST
EBX, EBX
004ACCBF JLE SHORT AVIGIF0.004ACCE8
004ACCC1
MOV EDI, 1
; 第二次计算
004ACCC6 /MOV EAX,
[LOCAL.2] ; EAX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCC9
|CALL AVIGIF0.004047AC ;
取用户名长度的CALL
004ACCCE |MOV EDX, [LOCAL.2] ;
EDX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCD1 |MOVZX
EDX, BYTE PTR DS:[EDX+EDI>; 用EDI做指针来取用户名的各位
004ACCD6 |IMUL
EDX, [LOCAL.1] ; EDX=EDX*SS:[12FC40]=66*21C6918E=751DFE94
004ACCDA
|IMUL EDX, EDX, 7BC
; EDX=EDX*7BC=751DFE94*7BC=D3FD00B0
004ACCE0 |ADD
ESI, EDX ; ESI=ESI+EDX=BFF39F6E+D3FD00B0=93F0A01E
004ACCE2
|SUB ESI, EAX
; ESI=ESI-EAX=93F0A01E-6=93F0A018
004ACCE4 |INC
EDI
; EDI++
004ACCE5 |DEC EBX
; EBX--
004ACCE6
\JNZ SHORT AVIGIF0.004ACCC6
; //用户名经过第一次计算后的值+用户名各位hex值*21C6918E*7BC-用户名长度的平方==>ESI
004ACCE8
PUSH [LOCAL.3]
; SS:[12FC38]=00DEE29O,(ASCII "1074552978")
004ACCEB
PUSH AVIGIF0.004ACDB4
004ACCF0 MOV EAX,
ESI ; EAX<==ESI=4BD664F2
004ACCF2
CDQ
004ACCF3 XOR EAX, EDX
004ACCF5 SUB
EAX, EDX
004ACCF7 LEA EDX, [LOCAL.4]
004ACCFA
CALL AVIGIF0.00408A00
; 再一次进行<==用户名经过第2次计算后的值 MOD A 直到商=0 余数往前排就得到一组新的值
004ACCFF PUSH
[LOCAL.4]
; SS:[12FC34]=00DFA848,(ASCII "1272341746")
004ACD02
LEA EAX, [LOCAL.3]
004ACD05 MOV EDX,
3
004ACD0A CALL AVIGIF0.0040486C ; 这个call把上面二次的注册码用"-"连接起来
004ACD0F
MOV EAX, [LOCAL.2] ; EAX <==SS:[12FC3C]=00DFBFC0,(ASCII
"fxyang")
004ACD12 CALL AVIGIF0.004047AC
; 取用户名长度的CALL
004ACD17 MOV
EBX, EAX
; EAX=6
004ACD19 TEST EBX, EBX
004ACD1B JLE
SHORT AVIGIF0.004ACD4A
004ACD1D MOV EDI,
1 ;
第三次计算
004ACD22 /MOV EAX, [LOCAL.2] ; EAX
<==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD25 |CALL
AVIGIF0.004047AC ; 取用户名长度的CALL
004ACD2A
|MOV EDX, [LOCAL.2] ; EDX <==SS:[12FC3C]=00DFBFC0,(ASCII
"fxyang")
004ACD2D |MOVZX EDX, BYTE PTR DS:[EDX+EDI>;
用EDI做指针来取用户名的各位
004ACD32 |IMUL EDX
; EAX=EAX*EDX=6*66=264
004ACD34
|IMUL EAX, EAX, 4C6
; EAX=EAX*4C6=264*4C6=B6958
004ACD3A |ADD ESI,
EAX ; ESI=ESI+EAX=4BD6642F(上次计算的值)+B6958
004ACD3C
|MOV EAX, [LOCAL.2]
;
EAX <==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD3F |CALL
AVIGIF0.004047AC ; 取用户名长度的CALL
004ACD44
|ADD ESI, EAX
; ESI=ESI+EAX=4BE1CE4A+6=4BE1CE50
004ACD46 |INC
EDI
; EDI++
004ACD47 |DEC EBX
; EBX--
004ACD48
\JNZ SHORT AVIGIF0.004ACD22
; //用户名经过第2次计算后的值+用户名各位hex值*用户名的长度*4C6+用户名长度的平方+21C6918E==>ESI
004ACD4A
ADD ESI, [LOCAL.1]
; ESI=ESI+SS:[12FC40]=4C1F736A+21C6918E=6DE604F8
004ACD4D PUSH
[LOCAL.3]
; SS:[12FC38]=00DFA0CO,(ASCII "1074552978-1272341746")
004ACD50
PUSH AVIGIF0.004ACDB4
004ACD55 MOV EAX,
ESI ; EAX
<==ESI=6DE604F8
004ACD57 CDQ
004ACD58 XOR EAX,
EDX
004ACD5A SUB EAX, EDX
004ACD5C LEA
EDX, [LOCAL.5]
004ACD5F CALL AVIGIF0.00408A00
; 再一次进行<==用户名经过第3次计算后的值 MOD A 直到商=0
余数往前排就得到一组新的值,
004ACD64 PUSH [LOCAL.5]
; SS:[12FC30]=00DFFFF0,(ASCII
"1843791096")
004ACD67 LEA EAX, [LOCAL.3]
004ACD6A
MOV EDX, 3
004ACD6F CALL AVIGIF0.0040486C
; 这个CALL 把得到的值用"-"连接起来
004ACD74
MOV EAX, [ARG.1]
; //到此注册码的计算和连接已完成
004ACD77 MOV EDX, [LOCAL.3]
; EDX=SS:[12FC38]=00EC53F4,(ASCII
"1074552978-1272341746-1843791096")
004ACD7A CALL AVIGIF0.00404548
004ACD7F
XOR EAX, EAX
004ACD81 POP EDX
004ACD82
POP ECX
004ACD83 POP ECX
004ACD84
MOV DWORD PTR FS:[EAX], EDX
004ACD87 PUSH
AVIGIF0.004ACDA1
004ACD8C LEA EAX, [LOCAL.5]
004ACD8F
MOV EDX, 4
004ACD94 CALL AVIGIF0.00404518
004ACD99
RETN
====================================================
CALL
AVIGIF0.00408A00
|
|
来到这里: 注册码中间的处理过程
004094B2
MOV ECX, 0A
; ECX<==0A (赋值); Case 55 ('U') of switch
00409486
004094B7 LEA ESI, DWORD PTR SS:[EBP-61]
;
注册码经过第一次计算后在计算并变换
004094BA /XOR EDX, EDX
004094BC
|DIV ECX
; EAX =EAX/ECX=400C6092/A ==>EAX=667A341
EDX=8
004094BE |ADD DL, 30
; DL=DL+30 ,<==就是把DL的值变成hex值得到一个数字
004094C1
|CMP DL, 3A
; 比较值的范围30-39
004094C4 |JB
SHORT AVIGIF0.004094C9
004094C6 |ADD DL, 7
004094C9
|DEC ESI
004094CA |MOV BYTE PTR DS:[ESI],
DL
; 得到的数字放到DS:[ESI]=DS:[12EB7A]处并往前排
004094CC
|OR EAX, EAX
; /DS:[ESI] (ASCII "1074552978")
004094CE
\JNZ SHORT AVIGIF0.004094BA
; //用户名经过第一次计算后的值
MOD A 直到商=0 余数往前排就得到一组新的值
004094D0 LEA ECX, DWORD PTR SS:[EBP-61]
004094D3
SUB ECX, ESI
; ESI=0012EB71,(ASCII "1074552978") ||(ASCII
"1272341746")||(ASCII "1843791096"
004094D5 MOV
EDX, [LOCAL.9] ; EDX<==FFFFFFFFF
004094D8
CMP EDX, 10
004094DB JBE SHORT AVIGIF0.004094DE
004094DD
RETN
*******************************************************************
注册算法的总结:由于试验码的检查中没有关于长度和形式的检查,所以试验码随便.
注册码是由三段数字组成设为: M-N-L
1.M (第一组)的计算方法:
1).把用户名各位的hex值*2CE+用户名长度平方*21C6918E
设为 B0 (长度取八位)
2).把B0 XOR FFFFFFFF 然后+1 设为
C0
3).C0 MOD A(常数) 直到商=0 余数往前排就得到一组新的值=M
2.N (第二组)的计算方法:
1).第一次值C0+用户名各位hex值*21C6918E*7BC-用户名长度的平方 设为 B1 (长度取八位)
2).B1 MOD A(常数) 直到商=0 余数往前排就得到一组新的值=N
3.L (第三组)的计算方法:
1).第2次值B1+用户名各位hex值*用户名的长度*4C6+用户名长度的平方+21C6918E
设为 B2 (长度取八位)
2).B2 MOD A(常数) 直到商=0 余数往前排就得到一组新的值=L
如:
用户名 fxyang
注册码
1074552978-1272341746-1843791096
fxyang
2003.3.5