ShowDep 4.0 beta 1 注册算法分析
【软件功能】:不详
【软件主页】:http://www.sowdep.com/
【功能限制】:没发现
【破解工具】:OllyDbg、系统自带计算器
【本文作者】:好好学习(恨浩)
【整理时间】:2005.1.28
【破解原因】:无聊
【目标下载】:附件:ShowDep.rar
1. 运行ShowDep
2. 用鼠标单击ShowDep菜单->“Help”, 然后再单击“About”
3. 待弹出对话框后请再单击“Register”按钮
输入:name:h
number:1-2-3-87654321
提示:“Invalid registration number”
4、运行OllyDbg加载ShowDep,搜索ASCII,找到“Invalid registration number”
5、代码向上看,找到可疑的地方:0041F1E1 E8 0AF9FFFF call chap70x6.0041EAF0
6、在0041F1E1处下断。
关键call:
①call chap70x6.0041EBD0
②call chap70x6.00421970
③call chap70x6.00421C10
④call chap70x6.00421BE0
=============================================================================================================================
0041F1E1 |. E8 0AF9FFFF call chap70x6.0041EAF0 ; \chap70x6.0041EAF0 //与注册码有关的call可以跟进去看看,把注册码1-2-3-87654321转换成0x1-2-3-87654321,后8位参与比较,前面的1-2-3参与计算。
0041F1E6 |. 83C4 08 add esp,8
0041F1E9 |. 85C0 test eax,eax //注册码为空就跳去出错,注册码应该是xxxx-xxxx-xxxx-xxxxxxxx的形式,如果不是这种形式在以后的比较中,比较地址内的值始终为0
0041F1EB |. 74 1D je short chap70x6.0041F20A
0041F1ED |. 8B95 F0FEFFFF mov edx,dword ptr ss:[ebp-110]
0041F1F3 |. 81C2 04010000 add edx,104
0041F1F9 |. 52 push edx ; /Arg2
0041F1FA |. 8B45 FC mov eax,dword ptr ss:[ebp-4] ; |
0041F1FD |. 50 push eax ; |Arg1
0041F1FE |. E8 CDF9FFFF call chap70x6.0041EBD0 ; \chap70x6.0041EBD0 //①跟进去,算法和比较都在里面
0041F203 |. 83C4 08 add esp,8
0041F206 |. 85C0 test eax,eax //测试eax
0041F208 75 1C jnz short chap70x6.0041F226 //为0就送你上西天
=============================================================================================================================
①call chap70x6.0041EBD0:
0041EBD0 55 push ebp
0041EBD1 8BEC mov ebp,esp
0041EBD3 83EC 0C sub esp,0C
0041EBD6 C745 F4 78563412 mov dword ptr ss:[ebp-C],12345678
0041EBDD |. C745 F8 89674523 mov dword ptr ss:[ebp-8],23456789
0041EBE4 |. C745 FC 90785634 mov dword ptr ss:[ebp-4],34567890
0041EBEB |. 8D45 F4 lea eax,dword ptr ss:[ebp-C]
0041EBEE |. 50 push eax
0041EBEF |. 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
0041EBF2 |. 51 push ecx
0041EBF3 |. E8 48300000 call chap70x6.00421C40
0041EBF8 |. 83C4 04 add esp,4
0041EBFB |. 50 push eax ; |Arg2
0041EBFC |. 8B55 08 mov edx,dword ptr ss:[ebp+8] ; |
0041EBFF |. 52 push edx ; |Arg1
0041EC00 |. E8 6B2D0000 call chap70x6.00421970 ; \chap70x6.00421970 //②用户名的计算,跟进去
0041EC05 |. 83C4 0C add esp,0C
0041EC08 |. 8D45 F4 lea eax,dword ptr ss:[ebp-C]
0041EC0B |. 50 push eax ; /Arg3
0041EC0C |. 6A 0C push 0C ; |Arg2 = 0000000C
0041EC0E |. 8B4D 0C mov ecx,dword ptr ss:[ebp+C] ; |
0041EC11 |. 51 push ecx ; |Arg1
0041EC12 |. E8 592D0000 call chap70x6.00421970 ; \chap70x6.00421970 //②注册码的计算,跟进去
0041EC17 |. 83C4 0C add esp,0C
0041EC1A |. 8B55 0C mov edx,dword ptr ss:[ebp+C]
0041EC1D |. 8B45 FC mov eax,dword ptr ss:[ebp-4]
0041EC20 |. 3B42 0C cmp eax,dword ptr ds:[edx+C] //关键比较,eax里的值是上面计算的结果,[edx+c]是我输入的假码。其实在eax里看到的就是明码了,用它直接替换我的假码87654321,就注册成功了,哈哈!
0041EC23 75 07 jnz short chap70x6.0041EC2C //不相同就跳走,注册失败!(一般爆破点,7507-〉9090,每次运行都要重新注册)
0041EC25 |. B8 01000000 mov eax,1 //将1放入eax
0041EC2A |. EB 02 jmp short chap70x6.0041EC2E //无条件跳转
0041EC2C |> 33C0 xor eax,eax //eax与eax异或运算,就是eax清零
0041EC2E |> 8BE5 mov esp,ebp
0041EC30 |. 5D pop ebp
0041EC31 \. C3 retn //返回到:0041F203
=============================================================================================================================
②call chap70x6.00421970
00421970 /$ 55 push ebp
00421971 |. 8BEC mov ebp,esp
00421973 |. 83EC 10 sub esp,10
00421976 |. 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
00421979 |. 53 push ebx
0042197A |. 56 push esi
0042197B |. 57 push edi
0042197C |. 85C9 test ecx,ecx
0042197E |. C745 FC 00000000 mov dword ptr ss:[ebp-4],0
00421985 |. 0F84 83000000 je chap70x6.00421A0E
0042198B |. 8B7D 10 mov edi,dword ptr ss:[ebp+10]
0042198E |. 85FF test edi,edi
00421990 |. 74 7C je short chap70x6.00421A0E
00421992 |. 8B45 0C mov eax,dword ptr ss:[ebp+C]
00421995 |. 85C0 test eax,eax
00421997 |. 75 07 jnz short chap70x6.004219A0
00421999 |. 5F pop edi
0042199A |. 5E pop esi
0042199B |. 5B pop ebx
0042199C |. 8BE5 mov esp,ebp
0042199E |. 5D pop ebp
0042199F |. C3 retn
004219A0 |> 8B35 78C14200 mov esi,dword ptr ds:[<&KERNEL32.IsBadR>; kernel32.IsBadReadPtr
004219A6 |. 50 push eax ; /DataSize
004219A7 |. 51 push ecx ; |DataAddress
004219A8 |. FFD6 call esi ; \IsBadReadPtr
004219AA |. 85C0 test eax,eax
004219AC |. 75 4F jnz short chap70x6.004219FD
004219AE |. 6A 0C push 0C ; /DataSize = C (12.)
004219B0 |. 57 push edi ; |DataAddress
004219B1 |. FFD6 call esi ; \IsBadReadPtr
004219B3 |. 85C0 test eax,eax
004219B5 |. 75 46 jnz short chap70x6.004219FD
004219B7 |. 8B07 mov eax,dword ptr ds:[edi]
004219B9 |. 8945 F0 mov dword ptr ss:[ebp-10],eax
004219BC |. 8B4F 04 mov ecx,dword ptr ds:[edi+4]
004219BF |. 894D F4 mov dword ptr ss:[ebp-C],ecx
004219C2 |. 8B57 08 mov edx,dword ptr ds:[edi+8]
004219C5 |. 8955 F8 mov dword ptr ss:[ebp-8],edx
004219C8 |. 60 pushad
004219C9 |. FC cld
004219CA |. 8B4D 0C mov ecx,dword ptr ss:[ebp+C]
004219CD |. 8DBD F0FFFFFF lea edi,dword ptr ss:[ebp-10]
004219D3 |. 8B75 08 mov esi,dword ptr ss:[ebp+8]
004219D6 |> AC /lods byte ptr ds:[esi] //取字符串元素,关循环,你的用户名有几位就循环几次,我偷懒,只输入了一位数,呵呵~~~
004219D7 |. E8 34020000 |call chap70x6.00421C10 //③核心计算部分,跟进!
004219DC |.^ E2 F8 \loopd short chap70x6.004219D6 //按字符元素循环
004219DE |. 61 popad
004219DF |. 8B45 10 mov eax,dword ptr ss:[ebp+10]
004219E2 |. 8B4D F0 mov ecx,dword ptr ss:[ebp-10]
004219E5 |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
004219E8 |. 8908 mov dword ptr ds:[eax],ecx
004219EA |. 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
004219ED |. 8950 04 mov dword ptr ds:[eax+4],edx
004219F0 |. 8948 08 mov dword ptr ds:[eax+8],ecx
004219F3 |. 8B45 FC mov eax,dword ptr ss:[ebp-4]
004219F6 |. 5F pop edi
004219F7 |. 5E pop esi
004219F8 |. 5B pop ebx
004219F9 |. 8BE5 mov esp,ebp
004219FB |. 5D pop ebp
004219FC |. C3 retn //返回到:0041EC05
=============================================================================================================================
③call chap70x6.00421C10:
00421C10 /$ 8B1F mov ebx,dword ptr ds:[edi] //ebx=ebi所指向地址内的值
00421C12 |. E8 C9FFFFFF call chap70x6.00421BE0 //④计算,跟进去
00421C17 |. 8907 mov dword ptr ds:[edi],eax //将eax内的计算结果放到edi所指向的地址内
00421C19 |. 25 FF000000 and eax,0FF
00421C1E |. 0347 04 add eax,dword ptr ds:[edi+4] //eax=eax+[edi+4]所指向地址内的值
00421C21 |. 8947 04 mov dword ptr ds:[edi+4],eax //[edi+4]所指向地址内的值=eax
00421C24 |. BA 05840808 mov edx,8088405 //edx=8088405
00421C29 |. F7E2 mul edx //edx=edx乘以eax,结果的前8位放到edx,后8位放到eax里
00421C2B |. 40 inc eax //eax=eax+1
00421C2C |. 8947 04 mov dword ptr ds:[edi+4],eax //[edi+4]所指向地址内的值=eax
00421C2F |. C1E8 18 shr eax,18 //eax逻辑右移
00421C32 |. 8B5F 08 mov ebx,dword ptr ds:[edi+8] //ebx=eax+[edi+8]所指向地址内的值
00421C35 |. E8 A6FFFFFF call chap70x6.00421BE0 //④计算,跟进去
00421C3A |. 8947 08 mov dword ptr ds:[edi+8],eax //[edi+8]所指向地址内的值=eax
00421C3D \. C3 retn //返回到004219DC
=============================================================================================================================
④all chap70x6.00421BE0
00421BE0 /$ 8BD3 mov edx,ebx //edx=ebx
00421BE2 |. C1EA 08 shr edx,8 //edx逻辑右移
00421BE5 |. 32D8 xor bl,al //bl与al进行异或运算
00421BE7 |. 81E3 FF000000 and ebx,0FF
00421BED |. 8B049D 286E4300 mov eax,dword ptr ds:[ebx*4+436E28] //eax=[ebx*4+436E28]所指向地址内的值
00421BF4 |. 33C2 xor eax,edx //eax与edx进行异或运算
00421BF6 \. C3 retn //返回到00421C17
程序计算比较过程代码完!
=============================================================================================================================
完美爆破点:
00401559 /$ 55 push ebp
0040155A |. 8BEC mov ebp,esp
0040155C |. 81EC 00010000 sub esp,100
00401562 |. 833D D4D34700 00 cmp dword ptr ds:[47D3D4],0
00401569 |. 74 5D je short chap70x6.004015C8 //745D-〉9090,运行程序已不需要注册!~~~啊哈哈哈!强奸的感觉好像比诱奸更爽!
0040156B |. 68 68F14200 push chap70x6.0042F168 ; ASCII "Registered to: "
00401570 |. 8D85 00FFFFFF lea eax,dword ptr ss:[ebp-100]
00401576 |. 50 push eax
00401577 |. E8 44070200 call chap70x6.00421CC0
0040157C |. 83C4 08 add esp,8
0040157F |. 68 C4D24700 push chap70x6.0047D2C4
00401584 |. 8D8D 00FFFFFF lea ecx,dword ptr ss:[ebp-100]
0040158A |. 51 push ecx
0040158B |. E8 40070200 call chap70x6.00421CD0
00401590 |. 83C4 08 add esp,8
00401593 |. 8D95 00FFFFFF lea edx,dword ptr ss:[ebp-100]
00401599 |. 52 push edx ; /Text
0040159A |. 68 00040000 push 400 ; |/ControlID = 400 (1024.)
0040159F |. 8B45 08 mov eax,dword ptr ss:[ebp+8] ; ||
004015A2 |. 50 push eax ; ||hWnd
004015A3 |. FF15 D4C24200 call dword ptr ds:[<&USER32.GetDlgItem>>; |\GetDlgItem
004015A9 |. 50 push eax ; |hWnd
004015AA |. FF15 B8C24200 call dword ptr ds:[<&USER32.SetWindowTe>; \SetWindowTextA
004015B0 |. 6A 00 push 0 ; /ShowState = SW_HIDE
004015B2 |. 68 FF030000 push 3FF ; |/ControlID = 3FF (1023.)
004015B7 |. 8B4D 08 mov ecx,dword ptr ss:[ebp+8] ; ||
004015BA |. 51 push ecx ; ||hWnd
004015BB |. FF15 D4C24200 call dword ptr ds:[<&USER32.GetDlgItem>>; |\GetDlgItem
004015C1 |. 50 push eax ; |hWnd
004015C2 |. FF15 8CC34200 call dword ptr ds:[<&USER32.ShowWindow>>; \ShowWindow
004015C8 |> 8BE5 mov esp,ebp
004015CA |. 5D pop ebp
004015CB \. C3 retn
*****************************************************************************************************************************
计算过程:
用户名进行计算:h=68
68 xor 78(取12345678的后两位,程序给出的12345678)=10
10*4+436E28=436E68地址内的值等于=1DB71064
1DB71064 xor (12345678 shr 8)=1DB71064 xor 00123456=1DA52432
1DA52432 and ff = 32
32+(程序给出的23456789)=234567BB
234567BB*8088405(固定值)=11B5799 8FAF72A7 (11B5799放到edx)(8FAF72A7放到eax进行下面的计算,以下都是如此)
8FAF72A7+1=8FAF72A8
8FAF72A8 shr 18 =8F
8F xor 90(取程序给出的34567890的后两位)=1F
1F*4+436E28(固定地址)=00436EA4地址内的值等于=8D080DF5
8D080DF5 xor (34567890 shr 8)=8D080DF5 xor 00345678=8D3C5B8D
注册码进行计算:注册码形式为xxxx-xxxx-xxxx-xxxxxxxx,这里的计算只取前面的xxxx-xxxx-xxxx,我输入的是1-2-3,那就是对1 0 0 0 2 0 0 0 3 0 0 0进行计算,总共12次循环计算。
1=01
01 xor 32(1DA52432取的后两位)=33
33*4+436E28=00436EF4地址内的值等于=BFD06116
BFD06116 xor (1DA52432 shr 8)= BFD06116 xor 001DA524=BFCDC432
BFCDC432 and ff = 32
32+8FAF72A8=8FAF72DA
8FAF72DA*8088405=482432B AC75A642
AC75A642+1=AC75A643
AC75A643 shr 18 =AC
AC xor 8D(8D3C5B8D取的后两位)=21
21*4+436E28=00436EAC地址内的值等于=4C69105E
4C69105E xor(8D3C5B8D shr 8)= 4C69105E xor 008D3C5B= 4CE42C05
0=00
00 xor 32(BFCDC432取的后两位)=32
32*4+436E28=00436EF0地址内的值等于=C8D75180
C8D75180 xor (BFCDC432 shr 8)= C8D75180 xor BFCDC4 = C8689C44
C8689C44 and ff = 44
44+AC75A643=AC75A687
AC75A687*8088405=56969D1 7461DCA3
7461DCA3+1=7461DCA4
7461DCA4 shr 18 = 74
74 xor 05(4CE42C05取的后两位)=71
71*4+436E28=00436FEC地址内的值等于=270241AA
270241AA xor(4CE42C05 shr 8)= 270241AA xor 004CE42C= 274EA586
0=00......以下计算略
0=00......
2=02......
0=00......
0=00......
0=00......
3=03......
0=00......
0=00......
0=00......
最后的计算结果是:1CFA6E16
替换我假码的后8位,注册成功
地址00436E28---00437020的内容如下:
00436E20 1B DF 05 5A 8D EF 02 2D 00 00 00 00 96 30 07 77
00436E30 2C 61 0E EE BA 51 09 99 19 C4 6D 07 8F F4 6A 70
00436E40 35 A5 63 E9 A3 95 64 9E 32 88 DB 0E A4 B8 DC 79
00436E50 1E E9 D5 E0 88 D9 D2 97 2B 4C B6 09 BD 7C B1 7E
00436E60 07 2D B8 E7 91 1D BF 90 64 10 B7 1D F2 20 B0 6A
00436E70 48 71 B9 F3 DE 41 BE 84 7D D4 DA 1A EB E4 DD 6D
00436E80 51 B5 D4 F4 C7 85 D3 83 56 98 6C 13 C0 A8 6B 64
00436E90 7A F9 62 FD EC C9 65 8A 4F 5C 01 14 D9 6C 06 63
00436EA0 63 3D 0F FA F5 0D 08 8D C8 20 6E 3B 5E 10 69 4C
00436EB0 E4 41 60 D5 72 71 67 A2 D1 E4 03 3C 47 D4 04 4B
00436EC0 FD 85 0D D2 6B B5 0A A5 FA A8 B5 35 6C 98 B2 42
00436ED0 D6 C9 BB DB 40 F9 BC AC E3 6C D8 32 75 5C DF 45
00436EE0 CF 0D D6 DC 59 3D D1 AB AC 30 D9 26 3A 00 DE 51
00436EF0 80 51 D7 C8 16 61 D0 BF B5 F4 B4 21 23 C4 B3 56
00436F00 99 95 BA CF 0F A5 BD B8 9E B8 02 28 08 88 05 5F
00436F10 B2 D9 0C C6 24 E9 0B B1 87 7C 6F 2F 11 4C 68 58
00436F20 AB 1D 61 C1 3D 2D 66 B6 90 41 DC 76 06 71 DB 01
00436F30 BC 20 D2 98 2A 10 D5 EF 89 85 B1 71 1F B5 B6 06
00436F40 A5 E4 BF 9F 33 D4 B8 E8 A2 C9 07 78 34 F9 00 0F
00436F50 8E A8 09 96 18 98 0E E1 BB 0D 6A 7F 2D 3D 6D 08
00436F60 97 6C 64 91 01 5C 63 E6 F4 51 6B 6B 62 61 6C 1C
00436F70 D8 30 65 85 4E 00 62 F2 ED 95 06 6C 7B A5 01 1B
00436F80 C1 F4 08 82 57 C4 0F F5 C6 D9 B0 65 50 E9 B7 12
00436F90 EA B8 BE 8B 7C 88 B9 FC DF 1D DD 62 49 2D DA 15
00436FA0 F3 7C D3 8C 65 4C D4 FB 58 61 B2 4D CE 51 B5 3A
00436FB0 74 00 BC A3 E2 30 BB D4 41 A5 DF 4A D7 95 D8 3D
00436FC0 6D C4 D1 A4 FB F4 D6 D3 6A E9 69 43 FC D9 6E 34
00436FD0 46 88 67 AD D0 B8 60 DA 73 2D 04 44 E5 1D 03 33
00436FE0 5F 4C 0A AA C9 7C 0D DD 3C 71 05 50 AA 41 02 27
00436FF0 10 10 0B BE 86 20 0C C9 25 B5 68 57 B3 85 6F 20
00437000 09 D4 66 B9 9F E4 61 CE 0E F9 DE 5E 98 C9 D9 29
00437010 22 98 D0 B0 B4 A8 D7 C7 17 3D B3 59 81 0D B4 2E
00437020 3B 5C BD B7 AD 6C BA C0 20 83 B8 ED B6 B3 BF 9A
=============================================================================================================================
用户名:h
注册码:1-2-3-1CFA6E16
用户名:henhao
注册码:6568-6866-6461-1776406D
=============================================================================================================================
用户名注册码保存在注册表HKEY_CURRENT_USER\Software\Sergey Sorokin\ShowDep\2.00
RegName:h
RegNumber:01 00 00 00 02 00 00 00 03 00 00 00 16 6e fa 1c
删除可以重新注册
不过程序在注册成功后,重新启动程序就无法运行了,不知道是程序本身的bug还是best版本来就这样,有兴趣的兄弟可以看看!
*****************************************************************************************************************************
好了最后解决注册成功后不能运行的问题,先分析一下,没有注册成功的时候能正常运行,注册后却不能了,为什么呢?注册信息放在注册表里,就是说每次运行的时候程序先就要读注册表,但是我不知道读注册表用OD该怎么下断(那位兄弟告诉我一下),那就用最笨的方法来搞,用od加载程序,从程序开始的时候用F8一直向下走,走到让程序飞掉的call,就在那里下断,F9断在那个call,然后F8继续,最后来到这里:
00412E61 E8 F2190000 call chap706-.00414858
00412E66 |. 8B4D 8C mov ecx,dword ptr ss:[ebp-74]
00412E69 E8 311A0000 call chap706-.0041489F
00412E6E |. 8B4D 8C mov ecx,dword ptr ss:[ebp-74]
00412E71 E8 1B1B0000 call chap706-.00414991
00412E76 |. 6A 00 push 0 ; /Arg1 = 00000000
00412E78 |. 8B4D 8C mov ecx,dword ptr ss:[ebp-74] ; |
00412E7B E8 30210000 call chap706-.00414FB0 ; \chap706-.00414FB0
00412E80 |. 8B4D 8C mov ecx,dword ptr ss:[ebp-74]
00412E83 E8 0C380000 call chap706-.00416694
00412E88 |. 8B55 8C mov edx,dword ptr ss:[ebp-74]
00412E8B |. 8B42 5C mov eax,dword ptr ds:[edx+5C]
00412E8E |. 50 push eax ; /hWnd
00412E8F |. FF15 D8C24200 call dword ptr ds:[<&USER32.SetFocus>] ; \SetFocus
00412E95 |. 5E pop esi
00412E96 |. 8BE5 mov esp,ebp
00412E98 |. 5D pop ebp
00412E99 \. C3 retn
把这四个call全nop(90)掉,噢也~~~程序OK。。。。正常启动运行!!!
00412E61 E8 F2190000 call chap706-.00414858
00412E69 E8 311A0000 call chap706-.0041489F
00412E71 E8 1B1B0000 call chap706-.00414991
00412E7B E8 30210000 call chap706-.00414FB0
=============================================================================================================================
好好学习(恨浩)
2005.1.28.19:00