【文章标题】: [KFC]fish's CrackMe逆向记录
【文章作者】: 柳州小林
【作者邮箱】: 55713720@qq.com
【作者主页】: QQ主页
【作者QQ号】: 55713720
【软件名称】:
【软件大小】:
【下载地址】:
【加壳方式】: 无
【保护方式】: 11111111
【编写语言】: Microsoft Visual C++ 6.0 [Overlay]
【使用工具】: OD
【操作平台】: WIN7-32
【软件介绍】: CM 有反调试,防改文件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
1:
用PEID打开,Microsoft Visual C++ 6.0 [Overlay],无壳.随便看看它段结构,是标准的VC格式
2:
OD上,可以打开,F9后自动关闭,有反调试.入口向上看,看见好多MFC42.#......,VC的MFC编写的,
调入MFC42.lib,函数一明二白了.
3:
隐藏OD,再次按F9,可以运行了,输入名字和注册码,点OK,有提示窗口,下断.再运行,停在MFC42里,
按ALT+F9,回来自己的空间,停在这里:
004015FA . 6A 00 push 0
004015FC . 6A 00 push 0
004015FE . 50 push eax
004015FF . 8BCE mov ecx, esi
00401601 . E8 0C070000 call <jmp.&MFC42.#CWnd::MessageBoxA_4224>
00401606 . 68 EC404000 push 004040EC
0040160B . 8D4C24 14 lea ecx, dword ptr [esp+14]
向上看就是要找的地方了,在这个函数的最开始下断,运行,又自动关闭了,看来有自校验.
分析:在MFC42里下断没有关闭,但在自己的空间下断就关闭,应该是比较文件大小之类的.而且是隔
一段时间就检查一次.所以找SetTimer这类的函数
4:
在汇编代码窗口按"Ctrl+N"打开当前模块的名称(标签)列表.找到
名称位于 CrackMe, 条目 126
地址=004031F4
区段=.rdata
类型=输入 (已知)
名称=USER32.SetTimer
选中,按回车
参考位于 CrackMe:.text 到 USER32.SetTimer, 条目 0
地址=00401316
反汇编=call dword ptr [<&USER32.SetTimer>]
注释=USER32.SetTimer
双击它来到:
00401300 . 56 push esi
00401301 . 57 push edi
00401302 . 8BF1 mov esi, ecx
00401304 . E8 F1090000 call <jmp.&MFC42.#CDialog::OnInitDialog_4710>
00401309 . 8B46 20 mov eax, dword ptr [esi+20]
0040130C . 6A 00 push 0
; /Timerproc = NULL
0040130E 68 F4010000 push 1F4
00401313 . 6A 02 push 2
; |TimerID = 2
00401315 . 50 push eax
; |hWnd
00401316 . FF15 F4314000 call dword ptr [<&USER32.SetTimer>]
; \SetTimer
0040131C . 8B4E 6C mov ecx, dword ptr [esi+6C]
0040131F . 8B56 20 mov edx, dword ptr [esi+20]
00401322 . 8B3D FC314000 mov edi, dword ptr [<&USER32.SendMessageA>]
; USER32.SendMessageA
00401328 . 51 push ecx
; /lParam
00401329 . 6A 01 push 1
; |wParam = 1
0040132B . 68 80000000 push 80
; |Message = WM_SETICON
00401330 . 52 push edx
; |hWnd
00401331 . 8946 68 mov dword ptr [esi+68], eax
; |
00401334 . FFD7 call edi
; \SendMessageA
看到上面的"CDialog::OnInitDialog"了吧,初始化时就开启了定时器,用NOP代替它.再次载
入,F9,下个断点试试,OK
5:
回到提示窗口的出口,向上看,慢慢分析,算法简单,不再重复
注册函数:
这里的密匙key="KEY-KANON"
char* en(char *name,char *key)
{
int namelen=strlen(name);
int keylen=strlen(key);
char *sn=new char[keylen];
int i=0,j=0,k=0;
for (i=0;i<namelen;i++)
{
j+=name[i];
}
for (i=0;i<keylen;i++)
{
k=j*key[i];
k=k%26;
sn[i]=k+0x61;
}
return sn;
}
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2011年11月23日 13:49:27
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课