【破文作者】 落魄浪子
【文章题目】 失败的MD5算法
【软件名称】 XXXX网络软件V2.01
【下载地址】 http://mujweb.cz/www/netsoft/
----------------------------------------------------------------------------------------------
【加密方式】 MD5
【破解工具】 FLY大侠的OD1.1
【破解平台】 XP SP2
----------------------------------------------------------------------------------------------
【软件简介】
这个软件具有网络监控和实时检测功能,可以实时监控网络流量信息和连接信息
【文章简介】
软件没有壳,现在这种不加壳的软件真是少,呵呵,我这样的菜菜就喜欢没壳的,不
过有壳也没关系,呵呵。@!#@!##¥@
----------------------------------------------------------------------------------------------
【破解过程】
注册码不对时有出错提示“序列号校验失败,请重新输入序列号”,呵呵,有门,OD载入,查找字符串,找
到两处下断,向上找看看哪里跳过来的然后下断,载入后运行
004A6E99 . E8 46270000 call <jmp.&MFC42.#3097> OD中断在这里
004A6E9E . 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
004A6EA2 . 8379 F8 17 cmp dword ptr ds:[ecx-8],17 比较注册码是否等于17即23位
004A6EA6 . 75 24 jnz short NetWatch.004A6ECC 不对则出错
。。。。。。。。。。。。。。。。。。。。。。。。。
004A6EB6 . E8 BD260000 call <jmp.&MFC42.#3098>
004A6EBB . 8D4424 18 lea eax,dword ptr ss:[esp+18] 注册码入EAX
004A6EBF . 50 push eax
004A6EC0 . E8 2BEEFFFF call NetWatch.004A5CF0 注册算法CALL,进入
004A6EC5 . 83C4 04 add esp,4
004A6EC8 . 85C0 test eax,eax
004A6ECA . 75 1B jnz short NetWatch.004A6EE7 不跳则出错
004A6ECC > 68 00100000 push 1000
004A6ED1 . 68 105B4D00 push NetWatch.004D5B10
004A6ED6 . 68 70B64D00 push NetWatch.004DB670
004A6EDB . 8BCE mov ecx,esi
004A6EDD . E8 00260000 call <jmp.&MFC42.#4224> 出错信息
004A5CF0 /$ 81EC 9C00000>sub esp,9C 进入后来到这里
004A5CF6 |. 83C9 FF or ecx,FFFFFFFF
004A5CF9 |. 33C0 xor eax,eax
004A5CFB |. 56 push esi
004A5CFC |. 8BB424 A4000>mov esi,dword ptr ss:[esp+A4]
004A5D03 |. 57 push edi
004A5D04 |. 8BFE mov edi,esi
004A5D06 |. F2:AE repne scas byte ptr es:[edi]
004A5D08 |. F7D1 not ecx
004A5D0A |. 49 dec ecx
004A5D0B |. 83F9 17 cmp ecx,17
004A5D0E |. 0F85 9201000>jnz NetWatch.004A5EA6 再次比较注册码的位数,不对则出错
004A5D14 |. 8A4E 05 mov cl,byte ptr ds:[esi+5]比较注册码第六位是否等于2D即“-”符号
004A5D17 |. B0 2D mov al,2D
004A5D19 |. 3AC8 cmp cl,al
004A5D1B |. 0F85 8501000>jnz NetWatch.004A5EA6 不对则出错
004A5D21 |. 3846 0B cmp byte ptr ds:[esi+B],al 比较注册码第12位是否等于2D即“-”符号
004A5D24 |. 0F85 7C01000>jnz NetWatch.004A5EA6 不对则出错
004A5D2A |. 3846 11 cmp byte ptr ds:[esi+11],al 比较注册码第18位是否等于2D即“-”符号
004A5D2D |. 0F85 7301000>jnz NetWatch.004A5EA6 不对则出错
004A5D33 |. B9 08000000 mov ecx,8
004A5D38 |. 33C0 xor eax,eax
004A5D3A |. 8D7C24 2C lea edi,dword ptr ss:[esp+2C]
004A5D3E |. 6A 05 push 5 ; /maxlen = 5
004A5D40 |. F3:AB rep stos dword ptr es:[edi] ; |
004A5D42 |. 8D4424 30 lea eax,dword ptr ss:[esp+30] ; |
004A5D46 |. 56 push esi ; |src
004A5D47 |. 50 push eax ; |dest
004A5D48 |. FF15 B85C4B0>call dword ptr ds:[<&MSVCRT.strncpy>] ; \strncpy
004A5D4E |. 8B3D 385C4B0>mov edi,dword ptr ds:[<&MSVCRT.strnca>; msvcrt.strncat
004A5D54 |. 8D4E 06 lea ecx,dword ptr ds:[esi+6]
004A5D57 |. 6A 05 push 5 ; /maxlen = 5
004A5D59 |. 8D5424 3C lea edx,dword ptr ss:[esp+3C] ; |
004A5D5D |. 51 push ecx ; |src
004A5D5E |. 52 push edx ; |dest
004A5D5F |. FFD7 call edi ; \strncat
004A5D61 |. 8D46 0C lea eax,dword ptr ds:[esi+C]
004A5D64 |. 6A 05 push 5
004A5D66 |. 8D4C24 48 lea ecx,dword ptr ss:[esp+48]
004A5D6A |. 50 push eax
004A5D6B |. 51 push ecx
004A5D6C |. FFD7 call edi
004A5D6E |. 83C6 12 add esi,12
004A5D71 |. 6A 05 push 5
004A5D73 |. 8D5424 54 lea edx,dword ptr ss:[esp+54]
004A5D77 |. 56 push esi
004A5D78 |. 52 push edx
004A5D79 |. FFD7 call edi 以上是把注册码的“-”符号去掉后连起来
004A5D7B |. 83C4 30 add esp,30
004A5D7E |. 33C0 xor eax,eax
004A5D80 |> 8A4C04 2C /mov cl,byte ptr ss:[esp+eax+2C]
004A5D84 |. 80F9 41 |cmp cl,41
004A5D87 |. 0F8C 1901000>|jl NetWatch.004A5EA6
004A5D8D |. 80F9 5A |cmp cl,5A
004A5D90 |. 0F8F 1001000>|jg NetWatch.004A5EA6
004A5D96 |. 40 |inc eax
004A5D97 |. 83F8 14 |cmp eax,14
004A5D9A |.^ 7C E4 \jl short NetWatch.004A5D80 查找字符串是否是A~Z的字母,否则出错
004A5D9C |. 8A4424 2C mov al,byte ptr ss:[esp+2C] 第一位注册码入AL 记为N1
004A5DA0 |. 2C 48 sub al,48
004A5DA2 |. 3C 01 cmp al,1
004A5DA4 |. 0F85 FC00000>jnz NetWatch.004A5EA6 比较第一位注册码减48是否等于1,不等则出错
004A5DAA |. 66:0FBE4424 >movsx ax,byte ptr ss:[esp+2D]第2位注册码入AX 记为N2
004A5DB0 |. 66:0FBE5424 >movsx dx,byte ptr ss:[esp+2E]第3位注册码入DX 记为N3
004A5DB6 |. 8D0C80 lea ecx,dword ptr ds:[eax+eax*4] N2+N2*4 结果记为R1
004A5DB9 |. 8D844A 92FCF>lea eax,dword ptr ds:[edx+ecx*2-36E]
004A5DC0 |. 66:3D 0200 cmp ax,2
004A5DC4 |. 0F85 DC00000>jnz NetWatch.004A5EA6 比较 N3+R1*2-36E=2 不等于2则出错
004A5DCA |. 8D4C24 4C lea ecx,dword ptr ss:[esp+4C]
004A5DCE |. 51 push ecx
004A5DCF |. E8 7C29FCFF call NetWatch.00468750 进入
00468750 /$ 8B4424 04 mov eax,dword ptr ss:[esp+4] 进入后来到这里
00468754 |. 33C9 xor ecx,ecx
00468756 |. 8948 14 mov dword ptr ds:[eax+14],ecx
00468759 |. 8948 10 mov dword ptr ds:[eax+10],ecx
0046875C |. C700 0123456>mov dword ptr ds:[eax],67452301
00468762 |. C740 04 89AB>mov dword ptr ds:[eax+4],EFCDAB89
00468769 |. C740 08 FEDC>mov dword ptr ds:[eax+8],98BADCFE
00468770 |. C740 0C 7654>mov dword ptr ds:[eax+C],10325476 呵呵,这不会是MD5的四个变量吧???
00468777 \. C3 retn 返回
004A5DD4 |. 8D5424 30 lea edx,dword ptr ss:[esp+30] 返回到这里,注册码放入EDX
004A5DD8 |. 6A 0C push 0C
004A5DDA |. 8D4424 54 lea eax,dword ptr ss:[esp+54]
004A5DDE |. 52 push edx
004A5DDF |. 50 push eax
004A5DE0 |. E8 9B29FCFF call NetWatch.00468780
004A5DE5 |. 6A 26 push 26
004A5DE7 |. 8D4C24 60 lea ecx,dword ptr ss:[esp+60]
004A5DEB |. 68 F8B44D00 push NetWatch.004DB4F8
004A5DF0 |. 51 push ecx
004A5DF1 |. E8 8A29FCFF call NetWatch.00468780
004A5DF6 |. 8D5424 68 lea edx,dword ptr ss:[esp+68] 四个变量
004A5DFA |. 8D4424 28 lea eax,dword ptr ss:[esp+28]
004A5DFE |. 52 push edx
004A5DFF |. 50 push eax
004A5E00 |. E8 2B2AFCFF call NetWatch.00468830 进入看看
00468830 /$ 83EC 08 sub esp,8 进入后来到这里
00468833 |. 8D4424 00 lea eax,dword ptr ss:[esp]
00468837 |. 56 push esi
00468838 |. 57 push edi
。。。。。。。。。。。。。。。。。。。略过代码
00468871 |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
00468875 |. 6A 08 push 8
00468877 |. 51 push ecx
00468878 |. 57 push edi
00468879 |. E8 02FFFFFF call NetWatch.00468780 进入看看
00468780 /$ 53 push ebx 进入后来到这里
00468781 |. 55 push ebp
00468782 |. 56 push esi
00468783 |. 8B7424 10 mov esi,dword ptr ss:[esp+10]
。。。。。。。。。。。。。。。。。。。略过代码
004687D3 |. 8D4E 18 lea ecx,dword ptr ds:[esi+18] 注册码放入ECX
004687D6 |. 51 push ecx
004687D7 |. 56 push esi
004687D8 |. E8 C3000000 call NetWatch.004688A0 进入看看
004688A0 /$ 83EC 40 sub esp,40 进入后来到这里
004688A3 |. 8B4C24 48 mov ecx,dword ptr ss:[esp+48]
004688A7 |. 53 push ebx
004688A8 |. 55 push ebp
004688A9 |. 56 push esi
004688AA |. 8B7424 50 mov esi,dword ptr ss:[esp+50]
004688AE |. 57 push edi
004688AF |. 6A 40 push 40
004688B1 |. 8D5424 14 lea edx,dword ptr ss:[esp+14]
004688B5 |. 8B06 mov eax,dword ptr ds:[esi]
004688B7 |. 8B7E 04 mov edi,dword ptr ds:[esi+4]
004688BA |. 8B5E 08 mov ebx,dword ptr ds:[esi+8]
004688BD |. 8B6E 0C mov ebp,dword ptr ds:[esi+C] 四个变量
004688C0 |. 51 push ecx
004688C1 |. 52 push edx
004688C2 |. 894424 60 mov dword ptr ss:[esp+60],eax
004688C6 |. E8 75090000 call NetWatch.00469240
*********************************************************************************
004688CB |. 8BC7 mov eax,edi MD5计算开绐
004688CD |. 8B5424 60 mov edx,dword ptr ss:[esp+60]
004688D1 |. F7D0 not eax
004688D3 |. 8BCB mov ecx,ebx
004688D5 |. 23C5 and eax,ebp
004688D7 |. 23CF and ecx,edi
004688D9 |. 0BC1 or eax,ecx
004688DB |. 8B4C24 1C mov ecx,dword ptr ss:[esp+1C] 第一轮
004688DF |. 03C1 add eax,ecx
004688E1 |. 8D8C02 78A46>lea ecx,dword ptr ds:[edx+eax+D76AA478]
。。。。。。。。。。。。。。略过代码 。。。。。。。。。。。。。。。。。
00468BC6 |. 0BFB or edi,ebx
00468BC8 |. 8B5C24 1C mov ebx,dword ptr ss:[esp+1C] 第二轮
00468BCC |. 03FB add edi,ebx
00468BCE |. 8B5C24 60 mov ebx,dword ptr ss:[esp+60]
00468BD2 |. 8D9C3B AAC7B>lea ebx,dword ptr ds:[ebx+edi+E9B6C7AA]
。。。。。。。。。。。。。。略过代码 。。。。。。。。。。。。。。。。。。。
00468ED7 |. 33F9 xor edi,ecx
00468ED9 |. 03FD add edi,ebp
00468EDB |. 8B6C24 1C mov ebp,dword ptr ss:[esp+1C] 第三轮
00468EDF |. 8DBC38 C67E9>lea edi,dword ptr ds:[eax+edi+289B7EC6]
。。。。。。。。。。。。。。略过代码 。。。。。。。。。。。。。。。。。。。
00468FC1 |. 0BCB or ecx,ebx
00468FC3 |. 33CF xor ecx,edi
00468FC5 |. 034C24 1C add ecx,dword ptr ss:[esp+1C] 第四轮
00468FC9 |. 8D8408 44222>lea eax,dword ptr ds:[eax+ecx+F4292244]
。。。。。。。。。。。。。。略过代码 。。。。。。。。。。。。。。。。。。。
004691C0 |. 03DF add ebx,edi
004691C2 |. 8946 04 mov dword ptr ds:[esi+4],eax *A
004691C5 |. 8D4424 24 lea eax,dword ptr ss:[esp+24]
004691C9 |. 50 push eax
004691CA |. 890E mov dword ptr ds:[esi],ecx *B
004691CC |. 896E 08 mov dword ptr ds:[esi+8],ebp *C
004691CF |. 895E 0C mov dword ptr ds:[esi+C],ebx *D
004691D2 |. E8 D9000000 call NetWatch.004692B0
004691D7 |. 83C4 18 add esp,18
004691DA |. 5F pop edi
004691DB |. 5E pop esi
004691DC |. 5D pop ebp
004691DD |. 5B pop ebx
004691DE |. 83C4 40 add esp,40
004691E1 \. C3 retn 返回
以上代码是把注册码的前12位和本软件的名字+991235进行MD5运算 ,
结果记为十六制:AA,BB,CC,DD,EE,FF,GG,HH,JJ,KK,MM,NN,RR,UU,TT,PP
004A5E05 |. 83C4 24 add esp,24 经过几个CALL返回之后来到这里
004A5E08 |. 33C0 xor eax,eax
004A5E0A |> 8A4C04 0C /mov cl,byte ptr ss:[esp+eax+C]
004A5E0E |. 80F1 25 |xor cl,25
004A5E11 |. 884C04 0C |mov byte ptr ss:[esp+eax+C],cl
004A5E15 |. 40 |inc eax
004A5E16 |. 83F8 10 |cmp eax,10
004A5E19 |.^ 7C EF \jl short NetWatch.004A5E0A 取AA~PP与25做异或 连起来记为N4
004A5E1B |. 33C0 xor eax,eax
004A5E1D |> 8A4C04 14 /mov cl,byte ptr ss:[esp+eax+14]
004A5E21 |. 8A5404 0C |mov dl,byte ptr ss:[esp+eax+C]
004A5E25 |. 32CA |xor cl,dl
004A5E27 |. 884C04 08 |mov byte ptr ss:[esp+eax+8],cl
004A5E2B |. 40 |inc eax
004A5E2C |. 83F8 08 |cmp eax,8
004A5E2F |.^ 7C EC \jl short NetWatch.004A5E1D N4分成2组分别进行异或运算,结果记为N5,N5和N4的后3
组连起来记为N6
004A5E31 |. 53 push ebx
004A5E32 |. B9 64000000 mov ecx,64
004A5E37 |> 33C0 /xor eax,eax
004A5E39 |> 8A5404 10 |/mov dl,byte ptr ss:[esp+eax+10]
004A5E3D |. 8A5C04 0C ||mov bl,byte ptr ss:[esp+eax+C]
004A5E41 |. 32DA ||xor bl,dl
004A5E43 |. 885C04 0C ||mov byte ptr ss:[esp+eax+C],bl
004A5E47 |. 40 ||inc eax
004A5E48 |. 83F8 08 ||cmp eax,8
004A5E4B |.^ 7C EC |\jl short NetWatch.004A5E39 N6分成5组,每组8位,取第二组分别与第一组和第三组做
异或运算,结果记为N7,N7和N6的后3组连起来记为N8 这样运算共进行64次 记为N9
004A5E4D |. 49 |dec ecx
004A5E4E |.^ 75 E7 \jnz short NetWatch.004A5E37
004A5E50 |. 33C9 xor ecx,ecx
004A5E52 |. 8D7424 11 lea esi,dword ptr ss:[esp+11] 注册码的最后五位入ESI
004A5E56 |> 8A440C 0C /mov al,byte ptr ss:[esp+ecx+C]
004A5E5A |. 83C6 02 |add esi,2
004A5E5D |. 8AD0 |mov dl,al
004A5E5F |. 24 0F |and al,0F
004A5E61 |. C0EA 04 |shr dl,4
004A5E64 |. 8856 FD |mov byte ptr ds:[esi-3],dl
004A5E67 |. 8846 FE |mov byte ptr ds:[esi-2],al
004A5E6A |. 41 |inc ecx
004A5E6B |. 83F9 08 |cmp ecx,8
004A5E6E |.^ 7C E6 \jl short NetWatch.004A5E56
N9分成5组,取第一组的每两位与0F做与运算和右移4次,结果依次连起来分别替换第二组和第三组记为NN1
NN1分成5组,取第二组的每两位与0F做与运算和右移4次,结果依次连起来分别替换NN1的第四组和第五组记为NN2
004A5E70 |. 33C0 xor eax,eax
004A5E72 |> 8A5C04 10 /mov bl,byte ptr ss:[esp+eax+10]
004A5E76 |. 80C3 44 |add bl,44
004A5E79 |. 885C04 10 |mov byte ptr ss:[esp+eax+10],bl
004A5E7D |. 40 |inc eax
004A5E7E |. 83F8 08 |cmp eax,8
004A5E81 |.^ 7C EF \jl short NetWatch.004A5E72
NN2分成5组,取第二组和第三组的每两位与44相加,结果依次替换第二组和第三组记为NN3
004A5E83 |. B9 02000000 mov ecx,2
004A5E88 |. 8D7C24 3C lea edi,dword ptr ss:[esp+3C] 输入的注册码的最后8位
004A5E8C |. 8D7424 10 lea esi,dword ptr ss:[esp+10] 上面计算的结果NN3
004A5E90 |. 33C0 xor eax,eax
004A5E92 |. C64424 18 00 mov byte ptr ss:[esp+18],0
004A5E97 |. 5B pop ebx
004A5E98 |. F3:A7 repe cmps dword ptr es:[edi],dword ptr ds:[es> 晕,最后竟然进行明码比较
004A5E9A |. 5F pop edi
004A5E9B |. 5E pop esi
004A5E9C |. 0F94C0 sete al 置注册标置位,正确注册AL为1
004A5E9F |. 81C4 9C00000>add esp,9C
004A5EA5 |. C3 retn 返回
004A6EC5 . 83C4 04 add esp,4 来到这里
004A6EC8 . 85C0 test eax,eax
004A6ECA . 75 1B jnz short NetWatch.004A6EE7 不对则出错
004A6ECC > 68 00100000 push 1000
004A6ED1 . 68 105B4D00 push NetWatch.004D5B10
004A6ED6 . 68 70B64D00 push NetWatch.004DB670
004A6EDB . 8BCE mov ecx,esi
004A6EDD . E8 00260000 call <jmp.&MFC42.#4224> 出错
到这里已经全部完成,呵呵,本人文字表达能力差,写的很乱也很臭,以上分组只是我为了好表达
才这样,希望各位能看的明白,不能我就白忙了。。。。。
----------------------------------------------------------------------------------------------
【破解心得】
第一位注册码减48等于1 ,第3位注册码+(第2位注册码+第2位注册码*4)*2-36E等于2,
注册码的前12位和本软件的名字+991235进行MD5运算后的结果再进行一些运算得到最后8位注册码。
这个软件的加密实在是。。。唉,还用什么MD5嘛,最后还进行明码比较,写注册机也非常
容易,网上MD5算法库到处都有。
----------------------------------------------------------------------------------------------
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
----------------------------------------------------------------------------------------------
文章写于2005-12-29 10:09:04
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)