首页
社区
课程
招聘
[原创][KFC]fish's CrackMe逆向记录
发表于: 2011-11-23 15:40 5248

[原创][KFC]fish's CrackMe逆向记录

2011-11-23 15:40
5248
【文章标题】: [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直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
然后算法分析过程就没有了
2011-11-23 16:46
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
光看到楼主在分析保护,就一个自校验...
分析算法的时候居然说了一句简单不重复...
那不知道你这所谓的逆向的重点在哪里?
2011-11-23 16:49
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
算法真的很简单!!!
---------------------------------
00401578   .  8B4E 64       mov     ecx, dword ptr [esi+64]          ;  sn
0040157B   .  33C0          xor     eax, eax
0040157D   >  0FBE1401      movsx   edx, byte ptr [ecx+eax]          ;  edx=sn[eax]
00401581   .  81F2 AA000000 xor     edx, 0AA
00401587   .  03FA          add     edi, edx                         ;  S1=edi+=edx
00401589   .  40            inc     eax
0040158A   .  83F8 09       cmp     eax, 9
0040158D   .^ 7C EE         jl      short 0040157D
---------------------------------
以上为注册码运算保存在S1里,其它就是异或0xAA

-------------------------------------
00401989  |> /0FBE1C10      /movsx   ebx, byte ptr [eax+edx]         ;  ebx=name[eax]
0040198D  |. |03F3          |add     esi, ebx                        ;  esi+=ebx
0040198F  |. |40            |inc     eax
00401990  |. |3BC1          |cmp     eax, ecx
00401992  |.^\7C F5         \jl      short 00401989                  ;  =N1
00401994  |>  33C9          xor     ecx, ecx
00401996  |>  0FBE440C 0C   /movsx   eax, byte ptr [esp+ecx+C]       ;  [esp+c][ecx]  db 'KEY-KANON',05
0040199B  |.  0FAFC6        |imul    eax, esi                        ;  esi=N1
0040199E  |.  99            |cdq
0040199F  |.  BB 1A000000   |mov     ebx, 1A                         ;  1A=26
004019A4  |.  F7FB          |idiv    ebx                             ;  eax=eax/ebx edx=余数
004019A6  |.  83C2 61       |add     edx, 61                         ;  相对于'a'
004019A9  |.  81F2 AA000000 |xor     edx, 0AA
004019AF  |.  03FA          |add     edi, edx                        ;  累加
004019B1  |.  41            |inc     ecx
004019B2  |.  83F9 09       |cmp     ecx, 9
004019B5  |.^ 7C DF         \jl      short 00401996
004019B7  |.  8B4424 2C     mov     eax, dword ptr [esp+2C]
004019BB      C74424 20 FFF>mov     dword ptr [esp+20], -1
004019C3  |.  3BF8          cmp     edi, eax
--------------------------------------
第一个循环是用户名ACSII相加得N1
第二个循环分成两部分看,
1:401996-4019A6
[esp+ecx+C]是数组 [esp+c][ecx]=>str1[ecx],它的每一位乘N1再除26取得余数N2

2:4019A6-4019B5
其它和上面的注册码运算是一样的,也是异或0xAA,所以,第一部分运算出来的9个N2组成的字串就是真注册码

4019C3 是比较
2011-11-23 19:22
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主很强大,虽然看不太懂不过思路还是很明确的
2011-12-19 11:20
0
游客
登录 | 注册 方可回帖
返回
//