标 题: AVI-GIF V1.0.9 汉化版的算法跟踪
发信人:fxyang
时 间:2003/03/06 09:39pm
详细信息:
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 余数往前排就得到一组新的值=N3.L (第三组)的计算方法:
1).第2次值B1+用户名各位hex值*用户名的长度*4C6+用户名长度的平方+21C6918E 设为 B2 (长度取八位)
2).B2 MOD A(常数) 直到商=0 余数往前排就得到一组新的值=L
如:
用户名 fxyang
注册码 1074552978-1272341746-1843791096
fxyang
2003.3.5
| | |||
|