【文章作者】: 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等。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)