-
-
[原创]某中文繁简转换工具算法分析-菜鸟学习篇
-
2006-9-27 13:27
6422
-
【文章作者】: tzl
【作者邮箱】: 无
【软件名称】: 某中文繁简转换工具1.2
【软件大小】: 1352KB
【下载地址】: http://www.newhua.com/soft/49685.htm
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++ 1999
【使用工具】: OD PEID
【操作平台】: XP SP2
【软件介绍】: 小巧简繁互转工具。支持文本文件的GBK到BIG5、BIG5到GBK、GBK繁体到简体、GBK简体到繁体、BIG5到GBK简体的批量转换。
软件大小:1352KB
软件语言:简体中文
软件类别:国产软件/共享版/中文平台
运行环境:Win9x/Me/NT/2000/XP/2003
加入时间:2006-9-26 16:20:30
今天花了点时间,运气还算不错,比较简单的算法,是给菜鸟学习的好教材。
一、查壳,无壳。
二、运行程序注册提示“注册失败”,查看字符串相关信息,我们在这里下断开始分析。
试练码:123456789012,为什么是12位,在分析中有讲解。
00408F56 53
push ebx
00408F57 8955 B4
mov dword ptr ss:[
ebp-4C],
edx
00408F5A 8945 B8
mov dword ptr ss:[
ebp-48],
eax
00408F5D B8 D8E04900
mov eax,ScTc.0049E0D8
00408F62 E8 CD1A0900
call ScTc.0049AA34
00408F67 66:C745 CC 08>
mov word ptr ss:[
ebp-34],8
00408F6D 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00408F70 E8 3F8AFFFF
call ScTc.004019B4
00408F75 8BD0
mov edx,
eax
00408F77 FF45 D8
inc dword ptr ss:[
ebp-28]
00408F7A 8B4D B8
mov ecx,
dword ptr ss:[
ebp-48]
00408F7D 8B81 1C030000
mov eax,
dword ptr ds:[
ecx+31C]
00408F83 E8 301C0700
call ScTc.0047ABB8
00408F88 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00408F8B E8 888FFFFF
call ScTc.00401F18
00408F90 83F8 0C
cmp eax,0C
; 试练码位数与OC(12)比较,注册码由12位数字组成
00408F93 0F95C2
setne dl
00408F96 83E2 01
and edx,1
; edx与1进行and运算
00408F99 52
push edx ; edx=1
00408F9A FF4D D8
dec dword ptr ss:[
ebp-28]
00408F9D 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
; eax=试练码位数
00408FA0 BA 02000000
mov edx,2
; 2送edx
00408FA5 E8 1A1C0900
call ScTc.0049ABC4
00408FAA 59
pop ecx
00408FAB 84C9
test cl,
cl
00408FAD 74 6E
je short ScTc.0040901D 关键跳转,注册码为12位时正常跳转,这就是为什么试练码为12位
00408FAF 6A 10
push 10
00408FB1 66:C745 CC 14>
mov word ptr ss:[
ebp-34],14
00408FB7 8D45 F8
lea eax,
dword ptr ss:[
ebp-8]
00408FBA E8 F589FFFF
call ScTc.004019B4
00408FBF 8BD0
mov edx,
eax
00408FC1 FF45 D8
inc dword ptr ss:[
ebp-28]
00408FC4 8B0D D44A4A00
mov ecx,
dword ptr ds:[4A4AD4]
; ScTc.004A5AE0
00408FCA 8B01
mov eax,
dword ptr ds:[
ecx]
00408FCC E8 976C0600
call ScTc.0046FC68
00408FD1 8D45 F8
lea eax,
dword ptr ss:[
ebp-8]
00408FD4 E8 638FFFFF
call ScTc.00401F3C
00408FD9 50
push eax
00408FDA 68 A9DF4900
push ScTc.0049DFA9
00408FDF 8B45 B8
mov eax,
dword ptr ss:[
ebp-48]
00408FE2 E8 E1820700
call ScTc.004812C8
00408FE7 50
push eax
00408FE8 E8 41270900
call <jmp.&USER32.MessageBoxA>
00408FED FF4D D8
dec dword ptr ss:[
ebp-28]
00408FF0 8D45 F8
lea eax,
dword ptr ss:[
ebp-8]
00408FF3 BA 02000000
mov edx,2
00408FF8 E8 C71B0900
call ScTc.0049ABC4
00408FFD 8B4D B8
mov ecx,
dword ptr ss:[
ebp-48]
00409000 8B81 1C030000
mov eax,
dword ptr ds:[
ecx+31C]
00409006 8B10
mov edx,
dword ptr ds:[
eax]
00409008 FF92 C0000000
call dword ptr ds:[
edx+C0]
0040900E 8B4D BC
mov ecx,
dword ptr ss:[
ebp-44]
00409011 64:890D 00000>
mov dword ptr fs:[0],
ecx
00409018 E9 AE010000
jmp ScTc.004091CB
0040901D 66:C745 CC 20>
mov word ptr ss:[
ebp-34],20 若为12位试练码则跳转到此
00409023 8D45 F4
lea eax,
dword ptr ss:[
ebp-C]
00409026 E8 8989FFFF
call ScTc.004019B4
;
0040902B 8BD0
mov edx,
eax
0040902D FF45 D8
inc dword ptr ss:[
ebp-28]
00409030 8B4D B8
mov ecx,
dword ptr ss:[
ebp-48]
00409033 8B81 1C030000
mov eax,
dword ptr ds:[
ecx+31C]
00409039 E8 7A1B0700
call ScTc.0047ABB8
;
0040903E 8D55 F4
lea edx,
dword ptr ss:[
ebp-C]
00409041 8B12
mov edx,
dword ptr ds:[
edx]
; 试练码送edx
00409043 A1 30484A00
mov eax,
dword ptr ds:[4A4830]
; OC(12)送eax
00409048 8B00
mov eax,
dword ptr ds:[
eax]
0040904A E8 F18DFFFF
call ScTc.00401E40
; 算法分析call(1)
0040904F 50
push eax
00409050 FF4D D8
dec dword ptr ss:[
ebp-28]
00409053 8D45 F4
lea eax,
dword ptr ss:[
ebp-C]
00409056 BA 02000000
mov edx,2
0040905B E8 641B0900
call ScTc.0049ABC4
00409060 59
pop ecx
00409061 84C9
test cl,
cl
00409063 0F84 F9000000
je ScTc.00409162 关键跳转
00409069 C605 E04C4A00>
mov byte ptr ds:[4A4CE0],1
00409070 8D45 E8
lea eax,
dword ptr ss:[
ebp-18]
00409073 E8 3C89FFFF
call ScTc.004019B4
00409078 8BD0
mov edx,
eax
0040907A FF45 D8
inc dword ptr ss:[
ebp-28]
0040907D 8B4D B8
mov ecx,
dword ptr ss:[
ebp-48]
00409080 8B81 1C030000
mov eax,
dword ptr ds:[
ecx+31C]
00409086 E8 2D1B0700
call ScTc.0047ABB8
0040908B 8D55 E8
lea edx,
dword ptr ss:[
ebp-18]
0040908E FF32
push dword ptr ds:[
edx]
00409090 BA BEDF4900
mov edx,ScTc.0049DFBE
; ASCII "KEY"
00409095 8D45 EC
lea eax,
dword ptr ss:[
ebp-14]
00409098 E8 671A0900
call ScTc.0049AB04
0040909D FF45 D8
inc dword ptr ss:[
ebp-28]
004090A0 FF30
push dword ptr ds:[
eax]
004090A2 66:C745 CC 2C>
mov word ptr ss:[
ebp-34],2C
004090A8 BA B6DF4900
mov edx,ScTc.0049DFB6
; ASCII "REGCODE"
004090AD 8D45 F0
lea eax,
dword ptr ss:[
ebp-10]
004090B0 E8 4F1A0900
call ScTc.0049AB04
004090B5 FF45 D8
inc dword ptr ss:[
ebp-28]
004090B8 8B10
mov edx,
dword ptr ds:[
eax]
004090BA A1 E84C4A00
mov eax,
dword ptr ds:[4A4CE8]
004090BF 59
pop ecx
004090C0 8B18
mov ebx,
dword ptr ds:[
eax]
004090C2 FF53 04
call dword ptr ds:[
ebx+4]
004090C5 FF4D D8
dec dword ptr ss:[
ebp-28]
004090C8 8D45 E8
lea eax,
dword ptr ss:[
ebp-18]
004090CB BA 02000000
mov edx,2
004090D0 E8 EF1A0900
call ScTc.0049ABC4
004090D5 FF4D D8
dec dword ptr ss:[
ebp-28]
004090D8 8D45 EC
lea eax,
dword ptr ss:[
ebp-14]
004090DB BA 02000000
mov edx,2
004090E0 E8 DF1A0900
call ScTc.0049ABC4
004090E5 FF4D D8
dec dword ptr ss:[
ebp-28]
004090E8 8D45 F0
lea eax,
dword ptr ss:[
ebp-10]
004090EB BA 02000000
mov edx,2
004090F0 E8 CF1A0900
call ScTc.0049ABC4
004090F5 6A 40
push 40
004090F7 66:C745 CC 38>
mov word ptr ss:[
ebp-34],38
004090FD 8D45 E4
lea eax,
dword ptr ss:[
ebp-1C]
00409100 E8 AF88FFFF
call ScTc.004019B4
00409105 8BD0
mov edx,
eax
00409107 FF45 D8
inc dword ptr ss:[
ebp-28]
0040910A 8B0D D44A4A00
mov ecx,
dword ptr ds:[4A4AD4]
; ScTc.004A5AE0
00409110 8B01
mov eax,
dword ptr ds:[
ecx]
00409112 E8 516B0600
call ScTc.0046FC68
00409117 8D45 E4
lea eax,
dword ptr ss:[
ebp-1C]
0040911A E8 1D8EFFFF
call ScTc.00401F3C
0040911F 50
push eax
00409120 68 C2DF4900
push ScTc.0049DFC2
00409125 8B45 B8
mov eax,
dword ptr ss:[
ebp-48]
00409128 E8 9B810700
call ScTc.004812C8
0040912D 50
push eax
0040912E E8 FB250900
call <jmp.&USER32.MessageBoxA>
; 注册成功提示处
********************************************************************************
跟进算法
call(1)
00401E40 55
push ebp
00401E41 8BEC
mov ebp,
esp
00401E43 83C4 D0
add esp,-30
00401E46 53
push ebx
00401E47 8955 FC
mov dword ptr ss:[
ebp-4],
edx ; edx=试练码
00401E4A 8945 D4
mov dword ptr ss:[
ebp-2C],
eax
00401E4D B8 10C54900
mov eax,ScTc.0049C510
00401E52 E8 DD8B0900
call ScTc.0049AA34
00401E57 C745 F4 01000>
mov dword ptr ss:[
ebp-C],1
; 1=ebp-c
00401E5E 8D55 FC
lea edx,
dword ptr ss:[
ebp-4]
; edx=试练码
00401E61 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401E64 E8 D38C0900
call ScTc.0049AB3C
00401E69 FF45 F4
inc dword ptr ss:[
ebp-C]
; 1+1
00401E6C 66:C745 E8 08>
mov word ptr ss:[
ebp-18],8
; 8=ebp-18
00401E72 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401E75 E8 9E000000
call ScTc.00401F18
00401E7A 83F8 0C
cmp eax,0C
00401E7D 75 76
jnz short ScTc.00401EF5
00401E7F 33D2
xor edx,
edx ; edx清零
00401E81 8955 D0
mov dword ptr ss:[
ebp-30],
edx ; 0=ebp-30
00401E84 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
; ebp-4=OC
00401E87 E8 B0000000
call ScTc.00401F3C
00401E8C 8B55 D0
mov edx,
dword ptr ss:[
ebp-30]
; eax=试练码
00401E8F 8A0C10
mov cl,
byte ptr ds:[
eax+
edx]
; cl=E4
00401E92 51
push ecx ; 12F032
00401E93 E8 3CFFFFFF
call ScTc.00401DD4
; 算法分析call(2)
00401E98 59
pop ecx
00401E99 8BD8
mov ebx,
eax ; 由call(2)得出,eax=36
00401E9B 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401E9E E8 99000000
call ScTc.00401F3C
00401EA3 8B55 D0
mov edx,
dword ptr ss:[
ebp-30]
; eax=试练码
00401EA6 3A5C10 06
cmp bl,
byte ptr ds:[
eax+
edx+6]
; 试练码第7位与“6”比较,相等则注册成功
00401EAA 74 20
je short ScTc.00401ECC
00401EAC 33C0
xor eax,
eax
00401EAE 50
push eax
00401EAF FF4D F4
dec dword ptr ss:[
ebp-C]
00401EB2 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401EB5 BA 02000000
mov edx,2
00401EBA E8 058D0900
call ScTc.0049ABC4
00401EBF 58
pop eax
00401EC0 8B55 D8
mov edx,
dword ptr ss:[
ebp-28]
00401EC3 64:8915 00000>
mov dword ptr fs:[0],
edx
00401ECA EB 47
jmp short ScTc.00401F13
00401ECC B0 01
mov al,1
; al置1
00401ECE 50
push eax
00401ECF FF4D F4
dec dword ptr ss:[
ebp-C]
00401ED2 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401ED5 BA 02000000
mov edx,2
00401EDA E8 E58C0900
call ScTc.0049ABC4
00401EDF 58
pop eax
00401EE0 8B55 D8
mov edx,
dword ptr ss:[
ebp-28]
; 试练码送edx
00401EE3 64:8915 00000>
mov dword ptr fs:[0],
edx
00401EEA EB 27
jmp short ScTc.00401F13
00401EEC FF45 D0
inc dword ptr ss:[
ebp-30]
00401EEF 837D D0 06
cmp dword ptr ss:[
ebp-30],6
00401EF3 ^ 7C 8F
jl short ScTc.00401E84
00401EF5 33C0
xor eax,
eax
00401EF7 50
push eax
00401EF8 FF4D F4
dec dword ptr ss:[
ebp-C]
00401EFB 8D45 FC
lea eax,
dword ptr ss:[
ebp-4]
00401EFE BA 02000000
mov edx,2
00401F03 E8 BC8C0900
call ScTc.0049ABC4
00401F08 58
pop eax
00401F09 8B55 D8
mov edx,
dword ptr ss:[
ebp-28]
00401F0C 64:8915 00000>
mov dword ptr fs:[0],
edx
00401F13 5B
pop ebx
00401F14 8BE5
mov esp,
ebp
00401F16 5D
pop ebp
00401F17 C3
retn
**********************************************************************************
跟进算法
call(2)
00401DD4 55
push ebp
00401DD5 8BEC
mov ebp,
esp
00401DD7 0FBE45 08
movsx eax,
byte ptr ss:[
ebp+8]
; ebp+8=1,eax=试练码
00401DDB 83C0 D0
add eax,-30
; 31与-30进行add运算
00401DDE 83F8 09
cmp eax,9
eax=1,与9比较
00401DE1 77 57
ja short ScTc.00401E3A 错误判断处,即注册码第一位只能为数字
00401DE3 FF2485 EA1D40>
jmp dword ptr ds:[
eax*4+401DEA] 正常跳转,我们的试练码第一位为1,则跳转到00401E16处
00401DEA 121E
adc bl,
byte ptr ds:[
esi]
00401DEC 40
inc eax
00401DED 0016
add byte ptr ds:[
esi],
dl
00401DEF 1E
push ds
00401DF0 40
inc eax
00401DF1 001A
add byte ptr ds:[
edx],
bl
00401DF3 1E
push ds
00401DF4 40
inc eax
00401DF5 001E
add byte ptr ds:[
esi],
bl
00401DF7 1E
push ds
00401DF8 40
inc eax
00401DF9 0022
add byte ptr ds:[
edx],
ah
00401DFB 1E
push ds
00401DFC 40
inc eax
00401DFD 0026
add byte ptr ds:[
esi],
ah
00401DFF 1E
push ds
00401E00 40
inc eax
00401E01 002A
add byte ptr ds:[
edx],
ch
00401E03 1E
push ds
00401E04 40
inc eax
00401E05 002E
add byte ptr ds:[
esi],
ch
00401E07 1E
push ds
00401E08 40
inc eax
00401E09 0032
add byte ptr ds:[
edx],
dh
00401E0B 1E
push ds
00401E0C 40
inc eax
00401E0D 0036
add byte ptr ds:[
esi],
dh
00401E0F 1E
push ds
00401E10 40
inc eax
00401E12 B0 38
mov al,38 试练码第一位若为0的跳转处
00401E14 5D
pop ebp
00401E15 C3
retn
00401E16 B0 36
mov al,36 ;
al=1 试练码第一位若为1的跳转处,我们的试练码运行后跳转到该处
00401E18 5D
pop ebp ;
eax=36
00401E19 C3
retn
00401E1A B0 34
mov al,34 试练码第一位若为2的跳转处
00401E1C 5D
pop ebp
00401E1D C3
retn
00401E1E B0 30
mov al,30 试练码第一位若为3的跳转处
00401E20 5D
pop ebp
00401E21 C3
retn
00401E22 B0 35
mov al,35 试练码第一位若为4的跳转处
00401E24 5D
pop ebp
00401E25 C3
retn
00401E26 B0 32
mov al,32 试练码第一位若为5的跳转处
00401E28 5D
pop ebp
00401E29 C3
retn
00401E2A B0 39
mov al,39 试练码第一位若为6的跳转处
00401E2C 5D
pop ebp
00401E2D C3
retn
00401E2E B0 31
mov al,31 试练码第一位若为7的跳转处
00401E30 5D
pop ebp
00401E31 C3
retn
00401E32 B0 33
mov al,33 试练码第一位若为8的跳转处
00401E34 5D
pop ebp
00401E35 C3
retn
00401E36 B0 37
mov al,37 试练码第一位若为9的跳转处
00401E38 5D
pop ebp
00401E39 C3
retn
00401E3A 33C0
xor eax,
eax
00401E3C 5D
pop ebp
00401E3D C3
retn**********************************************************************************
算法总结:这又是一个菜鸟学习的好文,算法很简单,注册码只与位数、试练码的第一位及第七位有关,其余位数随意。具体分析如下:
1.注册码位数一定要12位,并且第一位必须为0-9的数字,不能为字母及其他符号;
2.若第一位数字为0,则注册码的第7位必须为8;
若第一位数字为1,则注册码的第7位必须为6;
若第一位数字为2,则注册码的第7位必须为4;
若第一位数字为3,则注册码的第7位必须为0;
若第一位数字为4,则注册码的第7位必须为5;
若第一位数字为5,则注册码的第7位必须为2;
若第一位数字为6,则注册码的第7位必须为9;
若第一位数字为7,则注册码的第7位必须为1;
若第一位数字为8,则注册码的第7位必须为3;
若第一位数字为9,则注册码的第7位必须为7;
这样组合起来的12位注册码便为真正的注册码,如123456689012等。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界