吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3875|回复: 12
收起左侧

[CrackMe] 【吾爱2013CM大赛解答】xjunCM2013 --xjun爆破

[复制链接]
BugManEvilY 发表于 2013-12-15 01:05
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 BugManEvilY 于 2013-12-15 15:26 编辑

【文章标题】: 【吾爱2013CM大赛解答】xjunCM2013 --xjun爆破
【文章作者】: bUgmAny
【作者主页】: 无
【软件名称】: Easy CrackMe.exe
【下载地址】: http://www.52pojie.cn/thread-228499-1-1.html
【操作平台】: win xp
【工具】 OD IDA
--------------------------------------------------------------------------------
【详细过程】
老菜鸟一个。这个CrackMe的保护方式就在于多线程。弄了一下午加一晚上。整个下午都在主线程里找来找去,没有任何收获。到了晚上,看了题目帖,有了点收获,开始从辅助线程入手,bp CreateThread,根据辅助线程起始地址,进一步分析,发现程序释放了c:\windows\msvcstd.dlll。把这个dll放进ida分析,看dllmain,貌似没做什么实质性的行为。就看线程函数,发现这就是关键的Check位置。

xjun:1000125F 89 65 DC                                        mov     [ebp+RealKey], esp
xjun:10001262 FF 75 F0                                         push    [ebp+InputKey]  ; lParam
xjun:10001265 68 20 00 00 00                               push    20h             ; wParam
xjun:1000126A 68 0D 00 00 00                               push    WM_GETTEXT      ; Msg  
xjun:1000126F FF 75 F4                                          push    [ebp+hEdit]     ; hWnd
xjun:10001272 FF 15 10 A1 00 10                            call    ds:SendMessageA                     //给Edit发消息获取输入内容

                                       .......
xjun:1000128E 68 01 01 00 A0                               push    0A0000101h
xjun:10001293 6A 00                                             push    0
xjun:10001295 68 52 B2 00 10                                push    offset word_1000B252
xjun:1000129A 68 01 00 00 00                                push    1
xjun:1000129F BB 68 01 00 00                                mov     ebx, 168h
xjun:100012A4 E8 C7 05 00 00                                call    sub_10001870         //获得真码的函数
xjun:100012A9 83 C4 10                                        add     esp, 10h


xjun:100012AC 89 45 DC                                      mov     [ebp+RealKey], eax
xjun:100012AF 8B 45 DC                                      mov     eax, [ebp+RealKey]
xjun:100012B2 50                                               push    eax
xjun:100012B3 FF 75 F0                                       push    [ebp+InputKey]
xjun:100012B6 E8 A6 FD FF FF                              call    Check   //检查Key是否正确
xjun:100012BB 83 C4 08                                      add     esp, 8
xjun:100012BE 83 F8 00                                      cmp     eax, 0
xjun:100012C1 B8 00 00 00 00                             mov     eax, 0
xjun:100012C6 0F 94 C0                                      setz    al
xjun:100012C9 89 45 D8                                      mov     [ebp+IsOk], eax ;
                                                     ......
C 83 7D D8 00                                                    cmp     [ebp+IsOk], 0
xjun:100012E0 0F 84 B4 00 00 00                         jz      loc_1000139A   //这就是那个关键跳
                                                                          .... //下面就是连续几个WriteProcessMemory  改写弹出的消息

这个dll文件的作为变量存在与主程序中。dll文件内容进行了非常简单的混淆,就是把MZ标志抹去了,其他部分没变。在写入文件之前,会把开头的两个字节改成MZ。写入了c:\windows\msvcstd.dll 。老菜鸟表示。验证过程,好长好长我还没分析。先来个爆破。

通过bp CreateFile WriteFile得到写入的内容。往前追代码,得到写入的内容的来源,中间转移了位置几次,每次都是先RtlAllocateHeap申请一段内存,然后rep movs [edi],[esi],把内容复制过去。
追溯到最前面,来源是0x00469cbe地址处。
接下来就改代码爆破了。改jz跳转(nop 掉)或者改setz al(让修改后的al恒等1)那个区域都行。我改了setz al 之前的cmp eax,0 和mov eax,0 为 xor eax,0剩下nop掉了。在ida中找到偏移0x100012bb。计算出od位置 0x00469cbe + 0x100012bb - 0x10000000。(这里还因为代码节是PE的第一个节。基本上代码节以前的内容roffset和voffset相同,地址算的比较省事。要不然是要根据节表算roffset的)。
下面是函数sub_10001870也就是获得真码的函数(后面我叫它GetRealKey函数)的简单的原理。
这个函数的参数2(也就是offset word_1000B252) 是一个保存真码的数据结构,我根据分析函数代码猜测,数据结构是这样的
DWORD  lenCount;
DWORD Len;
char       strKey[];
然后有个函数专门计算字符串根据lenCount 和后面的len来计算Key数据的长度
xjun:10002160                               sub_10002160    proc near               ; CODE XREF: sub_10001800+Cp
xjun:10002160                                                                       ; sub_10002360+16p
xjun:10002160
xjun:10002160                               pRealKey        = dword ptr  4
xjun:10002160                               pdwLenOut       = dword ptr  8
xjun:10002160
xjun:10002160 8B 44 24 04                                   mov     eax, [esp+pRealKey]
xjun:10002164 B9 01 00 00 00                              mov     ecx, 1
xjun:10002169 8B 10                                             mov     edx, [eax]
xjun:1000216B 83 C0 04                                       add     eax, 4
xjun:1000216E 85 D2                                            test    edx, edx
xjun:10002170 7E 14                                            jle     short loc_10002186
xjun:10002172 56                                                 push    esi
xjun:10002173
xjun:10002173                               loc_10002173:                           ; CODE XREF: sub_10002160+1Cj
xjun:10002173 8B 30                                           mov     esi, [eax]
xjun:10002175 83 C0 04                                      add     eax, 4
xjun:10002178 0F AF CE                                      imul    ecx, esi
xjun:1000217B 4A                                                dec     edx
xjun:1000217C 75 F5                                           jnz     short loc_10002173
xjun:1000217E 8B 54 24 0C                                mov     edx, [esp+4+pdwLenOut]
xjun:10002182 5E                                               pop     esi
xjun:10002183 89 0A                                          mov     [edx], ecx
xjun:10002185 C3                                              retn
xjun:10002186                               ; ---------------------------------------------------------------------------
xjun:10002186
xjun:10002186                               loc_10002186:                           ; CODE XREF: sub_10002160+10j
xjun:10002186 8B 54 24 08                               mov     edx, [esp+pdwLenOut]
xjun:1000218A 89 0A                                         mov     [edx], ecx
xjun:1000218C C3                                             retn
xjun:1000218C                               sub_10002160    endp
大概看了一下。好像是把dwLenCount个len乘在一起吧。
目前程序中的数据是
+0 0x1
+4 0xe
+8  "www.52pojie.cn"
没用到这个函数的一些高端的地方。
然后校验一下Key数据的长度和保存的是否相同,(应该是防直接篡改明文的Key数据)。
然后申请一段内存把KeyData拷贝过去,将其返回了。
这就是用来对比的真码了。

附件2是我把成功key改成我得id  bugmany了。输入bugmany会提示成功。

另外。。上次编辑时。。帖子中的存放dll的常量的地址写错了。。有两个位数据写反了。。应该是0x00469cbe才对。。这次修改已经修正。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 2热心值 +2 收起 理由
Chief + 1 吾爱破解2013CM大赛,有你更精彩!
xjun + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

misszzy 发表于 2013-12-15 02:11
黄金广告位置出租~~

卖包子咯!!刚出炉的热包子咯!!!


呵呵,分析值得我等新手学习!
wqh198762 发表于 2013-12-15 02:18
絕戀Dι宇 发表于 2013-12-15 03:29
20120427 发表于 2013-12-15 08:01

不知道为什么,我的电脑就是运行不起来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
 楼主| BugManEvilY 发表于 2013-12-15 12:24
20120427 发表于 2013-12-15 08:01
不知道为什么,我的电脑就是运行不起来

你的电脑运行没爆破之前的原版程序能不能运行起来??

点评

不能  发表于 2013-12-15 12:26
 楼主| BugManEvilY 发表于 2013-12-15 12:30
20120427 发表于 2013-12-15 08:01
不知道为什么,我的电脑就是运行不起来

你看看你那个..c:\windows\目录下。。有没有那个它会释放的dll文件。。没有估计就会出问题。要是没有估计就跟杀毒软件什么的拦截有关系。我觉得。
20120427 发表于 2013-12-15 12:33
杀毒软件关掉了,系统目录有msvcstd.dll ,但还是运行不起来
a070458 发表于 2013-12-15 20:06
我的电脑也运行不起来
 楼主| BugManEvilY 发表于 2013-12-15 20:41
a070458 发表于 2013-12-15 20:06
我的电脑也运行不起来

我凌乱了。。原版的也运行不起来??还是只有我爆破之后的运行不起来??是不是。。我没考虑清楚。。就是。。看了点重点。。没深入分析细节。。

点评

此CM[10001000]地址不能被其他进程占用,否则CM报错。如QQ拼音输入法会和此CM产生冲突  发表于 2013-12-16 11:42
我说的是原版  发表于 2013-12-15 22:49
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表