【文章标题】: 第一次分析cm (适合新手)
【文章作者】: 思远软件
【作者邮箱】: c_s_y@126.com
【作者QQ号】: 495544622
【软件名称】: Crack me之 zugo.exe
【软件大小】: 28.0 KB
【下载地址】: http://bbs.pediy.com/showthread.php?t=58867
【加壳方式】: 无
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD
【操作平台】: windows xp
【软件介绍】: 很简单的cm
【作者声明】: 很简单的cm 第一次写,写的不好请大家多多指教。
--------------------------------------------------------------------------------
【详细过程】
学习破解3年了 这是我第一次写cm,写的不好,请大家多多指点。(前人已经分析过 呵呵)
打开cm,查找asicc ,可以很容易找到 good boy!和bad boy ,点击进入!
然后在004010F9下段 运行程序 输入 exekill 123456789 断下
到了这里
0040107C |. 8B35 08404000 mov esi, dword ptr [<&KERNEL32.Globa>; kernel32.GlobalAlloc
00401082 |. 8D43 01 lea eax, dword ptr [ebx+1]
00401085 |. 50 push eax ; /MemSize
00401086 |. 6A 40 push 40 ; |Flags = GPTR
00401088 |. C745 0C 08190>mov dword ptr [ebp+C], 1908 ; a1=1908
0040108F |. FFD6 call esi ; \GlobalAlloc
00401091 |. 8945 10 mov dword ptr [ebp+10], eax
00401094 |. 8B45 14 mov eax, dword ptr [ebp+14]
00401097 |. 40 inc eax
00401098 |. 50 push eax ; /MemSize
00401099 |. 6A 40 push 40 ; |Flags = GPTR
0040109B |. 8945 FC mov dword ptr [ebp-4], eax ; |
0040109E |. FFD6 call esi ; \GlobalAlloc
004010A0 |. 8945 14 mov dword ptr [ebp+14], eax
004010A3 |. 8D43 01 lea eax, dword ptr [ebx+1]
004010A6 |. 50 push eax ; /Count
004010A7 |. 8B35 A8404000 mov esi, dword ptr [<&USER32.GetDlgI>; |USER32.GetDlgItemTextA
004010AD |. FF75 10 push dword ptr [ebp+10] ; |Buffer
004010B0 |. 68 E8030000 push 3E8 ; |ControlID = 3E8 (1000.)
004010B5 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004010B8 |. FFD6 call esi ; \GetDlgItemTextA
004010BA |. FF75 FC push dword ptr [ebp-4] ; /Count = A (10.)
004010BD |. FF75 14 push dword ptr [ebp+14] ; |Buffer
004010C0 |. 57 push edi ; |ControlID => 3EA (1002.)
004010C1 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004010C4 |. FFD6 call esi ; \GetDlgItemTextA
004010C4 |. FFD6 call esi ; \GetDlgItemTextA
004010C6 |. 33C0 xor eax, eax
004010C8 |. 85DB test ebx, ebx
004010CA |. 7E 17 jle short 004010E3
004010CC |> 8B4D 10 /mov ecx, dword ptr [ebp+10]
004010CF |. 8B55 0C |mov edx, dword ptr [ebp+C] ; a1=1908 这里取an
004010D2 |. 03D3 |add edx, ebx ; a+用户名长度
004010D4 |. 0FBE0C08 |movsx ecx, byte ptr [eax+ecx] ; 第n个用户名的asicc码
004010D8 |. 0FAFCA |imul ecx, edx ; (a+用户名长度)*那个数的asicc码
004010DB |. 40 |inc eax ; 指向下一个数
004010DC |. 894D 0C |mov dword ptr [ebp+C], ecx ; 算出来的数值存储
004010DF |. 3BC3 |cmp eax, ebx ; 比较是否计算完所有用户名
004010E1 |.^ 7C E9 \jl short 004010CC ; 没有计算完就返回
004010E3 |> FF75 14 push dword ptr [ebp+14]
004010E6 |. E8 8D010000 call 00401278
004010EB |. 59 pop ecx
004010EC |. 8B4D 0C mov ecx, dword ptr [ebp+C]
004010EF |. 6A 00 push 0
004010F1 |. 81F1 FAF9A900 xor ecx, 0A9F9FA ; 算出来的和 0A9f9fa 异或
004010F7 |. 3BC8 cmp ecx, eax
004010F9 |. 75 0C jnz short 00401107
004010FB |. 68 98504000 push 00405098 ; good boy!
00401100 |. 68 7C504000 push 0040507C ; terima kasih kerana mencuba
00401105 |. EB 0A jmp short 00401111
00401107 |> 68 70504000 push 00405070 ; bad boy!
0040110C |. 68 4C504000 push 0040504C ; tidak tepat, sila cuba sekali lagi
这里是关键算法以及我的分析,
#include<stdio.h>
#include "string.h"
#include "windows.h"
void main()
{
char s[100];
long a=0x1908,i,l;
char *p = s;
printf("请输入用户名");
gets(s);
l=strlen(s);
for(i=1;i<=l;i++)
{
a=a+l;
a=a*(int)(*p);
p++;
}
a=a^0xA9F9FA;
printf("注册码为%d",a);
system("pause");
}
--------------------------------------------------------------------------------
【经验总结】
1 要想破解学好 必须要细心 要有耐心
2 必须有一定的编程功底,我c不是很好,写注册机用了很长时间
3 要会猜测
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年09月09日 13:38:48
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)