- 帖子
- 77
- 积分
- 301
- 威望
- 408
- 金钱
- 206
- 在线时间
- 29 小时
|
自己做得语音教程,不是太好,还请见谅了。
以下是密码:
www.3ast.com.cn
希望大家多支持下我们的站。
★★★★★★★★★★★★★★★★★
破 解 系 列
3AST
WWW.3AST.COM.CN
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
【文章标题】: 内存注册机的编写
【文章作者】: DoubleW
【使用工具】: PEID,OllyDBG,Keymaker
【软件信息】: 73,728 字节,MD5:6f672b8f5e63439835f6655ca60b46b0
【下载地址】: CrackMe,已打包。
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【保护方式】: 用户名+注册码。
【编写语言】: Microsoft Visual C++ 6.0
【操作平台】: WinXP SP3
【录制环境】:1280*800
【作者声明】: 仅供技术交流……
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【详细过程】
这是一个CrackMe,是用户名+注册码的验证方式。
首先,我们现查下壳,加的是ASPack 2.12 -> Alexey Solodovnikov的压缩壳,这个壳很好脱,用以前的方法,很快就可以脱掉,为了复习一下以前的内容,我们手动脱壳。
首先用OD载入,代码停在如下位置:
00413001 > 60 pushad // 载入时停的位置
00413002 E8 03000000 call 0041300A //这里要用 F7 过
00413007 - E9 EB045D45 jmp 459E34F7
0041300C 55 push ebp
0041300D C3 retn
0041300E E8 01000000 call 00413014
00413013 EB 5D jmp short 00413072
00413015 BB EDFFFFFF mov ebx, -13
0041301A 03DD add ebx, ebp
0041301C 81EB 00300100 sub ebx, 13000
00413022 83BD 22040000 0>cmp dword ptr [ebp+422], 0
00413029 899D 22040000 mov dword ptr [ebp+422], ebx
0041302F 0F85 65030000 jnz 0041339A
然后往下一直是用F8过,遇到往上的跳转就跳过,继续往下执行,直到运行到如下位置:
0041339A B8 763A0000 mov eax, 3A76
0041339F 50 push eax
004133A0 0385 22040000 add eax, dword ptr [ebp+422]
004133A6 59 pop ecx
004133A7 0BC9 or ecx, ecx
004133A9 8985 A8030000 mov dword ptr [ebp+3A8], eax
004133AF 61 popad
004133B0 75 08 jnz short 004133BA
004133B2 B8 01000000 mov eax, 1
004133B7 C2 0C00 retn 0C
004133BA 68 763A4000 push 00403A76
004133BF C3 retn //这里跳到的地方就是OEP了。
跳到了这里:
00403A76 55 push ebp // 这里就是OEP了。
00403A77 8BEC mov ebp, esp
00403A79 6A FF push -1
00403A7B 68 50B24000 push 0040B250
00403A80 68 40764000 push 00407640
00403A85 64:A1 00000000 mov eax, dword ptr fs:[0]
00403A8B 50 push eax
00403A8C 64:8925 0000000>mov dword ptr fs:[0], esp
我们就在这里脱壳。
运行一下,可以。
脱壳后的程序可以看到是用 Microsoft Visual C++ 6.0写得,我们再用Loader.exe为程序减减肥。
程序的体积小了不少。
下面我们进入本节课的正题,最注册码,写注册机。
首先运行程序,填写用户名,注册码,注册,有错误提示。
然后我们OD载入后停在这:
00403A76 >/$ 55 push ebp ; (初始 cpu 选择)
00403A77 |. 8BEC mov ebp, esp
00403A79 |. 6A FF push -1
00403A7B |. 68 50B24000 push 0040B250
00403A80 |. 68 40764000 push 00407640 ; SE 处理程序安装
查找字符串:
地址 反汇编 文本字串
004018F0 mov edi, 0040D0A8 filedigest error: in cmd5::adddata(), data length should be >= 0!
00401929 mov esi, 0040D0A8 filedigest error: in cmd5::adddata(), data length should be >= 0!
00401ACC mov edi, 0040D0EC filedigest error: in cmd5::finaldigest(), no data added before call!
00401B06 mov esi, 0040D0EC filedigest error: in cmd5::finaldigest(), no data added before call!
0040288A push 0040D1A4 注册提示
0040288F push 0040D18C 用户名不能为空请输入!
004028CE push 0040D1A4 注册提示
004028D3 push 0040D174 注册码不能为空请输入!
0040291C push 0040D1A4 注册提示
00402923 push 0040D160 恭喜你,注册码正确!注册码不能为空请输入!
0040293B push 0040D148 注册码错误,继续加油!
00402D35 mov esi, 0040B158 invalid string position
0040306D mov eax, 0040B214 unknown exception
00403A76 push ebp (初始 cpu 选择)
我们随便选个注册提示的地方双击进去看看。
以下是程序的主要部分。
00402857 . 8B2D D0B04000 mov ebp, dword ptr [<&user32.GetDlgI>; user32.GetDlgItemTextA //我们在这里下断
0040285D . 8D8C24 0C0100>lea ecx, dword ptr [esp+10C]
00402864 . 68 00010000 push 100 ; /Count = 100 (256.)
00402869 . 51 push ecx ; |Buffer
0040286A . 68 E8030000 push 3E8 ; |ControlID = 3E8 (1000.)
0040286F . 56 push esi ; |hWnd
00402870 . FFD5 call ebp ; \GetDlgItemTextA
00402872 . 8DBC24 0C0100>lea edi, dword ptr [esp+10C]
00402879 . 83C9 FF or ecx, FFFFFFFF
0040287C . 33C0 xor eax, eax
0040287E . F2:AE repne scas byte ptr es:[edi]
00402880 . F7D1 not ecx
00402882 . 49 dec ecx
00402883 . 83F9 01 cmp ecx, 1
00402886 . 73 1F jnb short 004028A7
00402888 . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040288A . 68 A4D14000 push 0040D1A4 ; |注册提示
0040288F . 68 8CD14000 push 0040D18C ; |用户名不能为空请输入!
00402894 . 56 push esi ; |hOwner
00402895 . FF15 D4B04000 call dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
0040289B . 5F pop edi
0040289C . 5E pop esi
0040289D . 33C0 xor eax, eax
0040289F . 5D pop ebp
004028A0 . 81C4 00030000 add esp, 300
004028A6 . C3 retn
004028A7 > 8D5424 0C lea edx, dword ptr [esp+C]
004028AB . 68 00010000 push 100
004028B0 . 52 push edx
004028B1 . 68 07040000 push 407
004028B6 . 56 push esi
004028B7 . FFD5 call ebp
004028B9 . 8D7C24 0C lea edi, dword ptr [esp+C]
004028BD . 83C9 FF or ecx, FFFFFFFF
004028C0 . 33C0 xor eax, eax
004028C2 . F2:AE repne scas byte ptr es:[edi]
004028C4 . F7D1 not ecx
004028C6 . 49 dec ecx
004028C7 . 83F9 01 cmp ecx, 1
004028CA . 73 1F jnb short 004028EB
004028CC . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004028CE . 68 A4D14000 push 0040D1A4 ; |注册提示
004028D3 . 68 74D14000 push 0040D174 ; |注册码不能为空请输入!
004028D8 . 56 push esi ; |hOwner
004028D9 . FF15 D4B04000 call dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
004028DF . 5F pop edi
004028E0 . 5E pop esi
004028E1 . 33C0 xor eax, eax
004028E3 . 5D pop ebp
004028E4 . 81C4 00030000 add esp, 300
004028EA . C3 retn
004028EB > 8D8424 0C0200>lea eax, dword ptr [esp+20C]
004028F2 . 6A 00 push 0
004028F4 . 8D8C24 100100>lea ecx, dword ptr [esp+110]
004028FB . 50 push eax
004028FC . 51 push ecx ; 将注册名放到了ECX寄存器中
004028FD . E8 FEFCFFFF call 00402600 ; 这里的call是将我们的注册名进行运算
00402902 . 8D9424 180200>lea edx, dword ptr [esp+218] ; 注册码出现,也就预示着我们做注册机时机的到来。
00402909 . 8D4424 18 lea eax, dword ptr [esp+18]
0040290D . 52 push edx ; 将EDX寄存器中真的注册码入栈
0040290E . 50 push eax ; 将EAX中我们输入的假注册码压入栈中
0040290F . E8 CCFDFFFF call 004026E0
00402914 . 83C4 14 add esp, 14
00402917 . 83F8 01 cmp eax, 1
0040291A . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040291C . 68 A4D14000 push 0040D1A4 ; |注册提示
00402921 . 75 18 jnz short 0040293B ; |
00402923 . 68 60D14000 push 0040D160 ; |恭喜你,注册码正确!
00402928 . 56 push esi ; |hOwner
00402929 . FF15 D4B04000 call dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
0040292F . 5F pop edi
00402930 . 5E pop esi
00402931 . 33C0 xor eax, eax
00402933 . 5D pop ebp
00402934 . 81C4 00030000 add esp, 300
0040293A . C3 retn
0040293B > 68 48D14000 push 0040D148 ; |注册码错误,继续加油!
00402940 . 56 push esi ; |hOwner
00402941 . FF15 D4B04000 call dword ptr [<&user32.MessageBoxA>>; \MessageBoxA
注册机:
中断地址:00402902
中断次数:1
第一字节:8D
指令长度:7
内存方式:EAX
00402902 . 8D9424 18020000 lea edx, dword ptr [esp+218] ; 注册码出现,也就是我们写注册机的好时候。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【经验总结】
断点下的要准,写内存注册机找的位置要准。。。。。。。。。。
如果还有什么不太明白的地方,可以到
www.3ast.com.cn
来找我,我们一起探讨。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【版权声明】: 转载请注明出处,并保证文章的完整性!
[ 本帖最后由 chowfaye 于 2008-9-29 10:09 编辑 ] |
|