【文章标题】: griefwolf Crackme 2.0的简单分析
【文章作者】: samisgod
【作者邮箱】: 21gh#163.com
【作者主页】: bysfl.cn
【作者QQ号】: 598620772
【下载地址】: 附件
【保护方式】: 注册码
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
废话不多说,载入OD后通过字符串参考很快可以定位关键点
00401C80 /> \55 push ebp
00401C81 |. 8BEC mov ebp, esp
00401C83 |. 81EC B4000000 sub esp, 0B4
00401C89 |. 53 push ebx
00401C8A |. 56 push esi
00401C8B |. 57 push edi
00401C8C |. 51 push ecx
00401C8D |. 8DBD 4CFFFFFF lea edi, [local.45]
00401C93 |. B9 2D000000 mov ecx, 2D
00401C98 |. B8 CCCCCCCC mov eax, CCCCCCCC
00401C9D |. F3:AB rep stos dword ptr es:[edi]
00401C9F |. 59 pop ecx
00401CA0 |. 894D FC mov [local.1], ecx
00401CA3 |. A1 40544100 mov eax, dword ptr [415440]
00401CA8 |. 8945 B4 mov [local.19], eax
00401CAB |. 8B0D 44544100 mov ecx, dword ptr [415444]
00401CB1 |. 894D B8 mov [local.18], ecx
00401CB4 |. 66:8B15 48544>mov dx, word ptr [415448]
00401CBB |. 66:8955 BC mov word ptr [ebp-44], dx
00401CBF |. A0 4A544100 mov al, byte ptr [41544A]
00401CC4 |. 8845 BE mov byte ptr [ebp-42], al
00401CC7 |. B9 09000000 mov ecx, 9
00401CCC |. BE 14544100 mov esi, 00415414 ; 这里是"1234567890abcdefghijklmnopqrstuvwxyz"
00401CD1 |. 8D7D 8C lea edi, [local.29]
00401CD4 |. F3:A5 rep movs dword ptr es:[edi], dwor>
00401CD6 |. A4 movs byte ptr es:[edi], byte ptr [>
00401CD7 |. 6A 32 push 32
00401CD9 |. 8D4D DC lea ecx, [local.9]
00401CDC |. 51 push ecx
00401CDD |. 68 E8030000 push 3E8
00401CE2 |. 8B4D FC mov ecx, [local.1]
00401CE5 |. E8 48040000 call <jmp.&MFC42D.#2439_CWnd::GetD>
00401CEA |. 6A 32 push 32
00401CEC |. 8D55 C4 lea edx, [local.15]
00401CEF |. 52 push edx
00401CF0 |. 68 E9030000 push 3E9
00401CF5 |. 8B4D FC mov ecx, [local.1]
00401CF8 |. E8 35040000 call <jmp.&MFC42D.#2439_CWnd::GetD>
00401CFD |. 8D45 DC lea eax, [local.9]
00401D00 |. 50 push eax ; /s
00401D01 |. E8 A0040000 call <jmp.&MSVCRTD.strlen> ; \strlen
00401D06 |. 83C4 04 add esp, 4 ;这里取用户名长度
00401D09 |. 85C0 test eax, eax
00401D0B |. 75 22 jnz short 00401D2F ;不为空就跳
00401D0D |. 6A 00 push 0
00401D0F |. 6A 00 push 0
00401D11 |. 68 00544100 push 00415400 ; 用户名不能为空!
00401D16 |. 8B4D FC mov ecx, [local.1]
00401D19 |. E8 0E040000 call <jmp.&MFC42D.#3517_CWnd::Mess>
00401D1E |. 8BF4 mov esi, esp
00401D20 |. 6A 00 push 0 ; /status = 0
00401D22 |. FF15 A4764100 call dword ptr [<&MSVCRTD.exit>] ; \exit
00401D28 |. 3BF4 cmp esi, esp
00401D2A |. E8 09040000 call <jmp.&MSVCRTD._chkesp>
00401D2F |> C745 C0 00000>mov [local.16], 0
00401D36 |. EB 09 jmp short 00401D41
00401D38 |> 8B4D C0 /mov ecx, [local.16] ; local.16为循环计数器
00401D3B |. 83C1 01 |add ecx, 1 ; 每循环一次计数器+1
00401D3E |. 894D C0 |mov [local.16], ecx ; 保存计数器
00401D41 |> 837D C0 0A cmp [local.16], 0A ; 已循环次数与0xA对比
00401D45 |. 7D 3B |jge short 00401D82 ; 循环结束,跳出循环
00401D47 |. 8B55 C0 |mov edx, [local.16]
00401D4A |. 0FBE7415 B4 |movsx esi, byte ptr [ebp+edx-4C] ; 这里出现"EBOOKMAKER"
00401D4F |. 8D45 DC |lea eax, [local.9] ;
00401D52 |. 50 |push eax ; /s
00401D53 |. E8 4E040000 |call <jmp.&MSVCRTD.strlen> ; \strlen
00401D58 |. 83C4 04 |add esp, 4 ; 取用户名长度
00401D5B |. 8BC8 |mov ecx, eax
00401D5D |. 8B45 C0 |mov eax, [local.16] ;
00401D60 |. 33D2 |xor edx, edx
00401D62 |. F7F1 |div ecx
00401D64 |. 0FBE5415 DC |movsx edx, byte ptr [ebp+edx-24] ; 以上做了用户名不足10位时的循环操作
00401D69 |. 03F2 |add esi, edx ; 把EBOOKMAKER和用户名ASC依位相加
00401D6B |. 8BC6 |mov eax, esi
00401D6D |. 99 |cdq
00401D6E |. B9 24000000 |mov ecx, 24 ; ecx=0x24
00401D73 |. F7F9 |idiv ecx ; ASC/0x24
00401D75 |. 8B45 C0 |mov eax, [local.16] ; edx为余数
00401D78 |. 8A4C15 8C |mov cl, byte ptr [ebp+edx-74] ; ebp-74指向1234567890abcdefghijklmnopqrstuvwxyz
00401D7C |. 884C05 D0 |mov byte ptr [ebp+eax-30], cl ; 再加上edx这个指针进行查表,然后保存
00401D80 |.^ EB B6 \jmp short 00401D38 ;继续循环
00401D82 |> C645 DA 00 mov byte ptr [ebp-26], 0
00401D86 |. 8D55 C4 lea edx, [local.15]
00401D89 |. 52 push edx ; /s
00401D8A |. E8 17040000 call <jmp.&MSVCRTD.strlen> ; \strlen
00401D8F |. 83C4 04 add esp, 4
00401D92 |. 8BF0 mov esi, eax
00401D94 |. 8D45 D0 lea eax, [local.12]
00401D97 |. 50 push eax ; /s
00401D98 |. E8 09040000 call <jmp.&MSVCRTD.strlen> ; \strlen
00401D9D |. 83C4 04 add esp, 4
至此,注册码的生成操作已经很明了了
通过把用户名ASC与EBOOKMAKER依位相加,分别除以0x24
余数作为指针对1234567890abcdefghijklmnopqrstuvwxyz查表
连接后即得注册码了
正在试用VC9,写个keygen
本人编程很垃圾,不要笑啊....
在VC9绿色版下编译通过
// keygen001.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "keygen001.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
start:
char key1[]="EBOOKMAKER";
char key2[]="1234567890abcdefghijklmnopqrstuvwxyz";
char user[50];
char rs;
cout<<"请输入用户名"<<endl;
cin>>user;
int len=strlen(user),rlen,aasc,ssi;
cout<<"你的注册码是"<<endl;
for (ssi=0;ssi<10;ssi++)
{
rlen=ssi;
if (len<10)
{
rlen=ssi%len;
}
aasc=key1[ssi]+user[rlen];
aasc%=0x24;
rs=key2[aasc];
cout<<rs;
}
cout<<endl<<endl;
goto start;
}
return nRetCode;
}
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年08月18日 9:57:58
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)