吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 36720|回复: 77
收起左侧

[原创] 360CM解答

  [复制链接]
我是用户 发表于 2014-5-8 15:07
本帖最后由 我是用户 于 2014-5-9 02:06 编辑

前言:里面unknow的算法是RSA512,感谢H大的解答以及参与这个CM的各位大牛。解答之前发的是PDF,由于不方便,现转为帖子,70多张图片,我已经加到吐了,想看PDF的也可以下载附件,个人认为还是PDF舒服点!

                                                   
    360破解考题CM分析
1 启动流程分析
1.1简述
这个CM利用父子进程启动,即父进程通过CreateMutex创建一个hmily的互斥对象,然后创建子进程,子进程判断是否存在hmily这个互斥对象来识别自身,流程图如下:
1.bmp                               
CreateMutex判断自身是父进程还是子进程
2.bmp

1.2 父进程启动分析
父进程只负责创建子进程,以及接收子进程的调试来判断子进程的初始化情况 ,子进程初始化完毕之后,父进程通过DebugSetProcessKillOnExit与DebugActiveProcessStop这两个API来退出对子进程的调试状态,然后结束自身。
获得自身路径,以DEBUG_PROCESS创建子进程
3.bmp
等待子进程初始化完毕,然后结束自身。
4.bmp

1.3 子进程启动分析
    子进程的初始化函数中分两个部分。
第一部用于Hook ZwWriteFile,极大隐藏了算法。
第二部分用于解密附加数据,然后将其在内存中载入,这个附加数据其实是一个DLL,里面有一个名为LSG的导出函数,这个CM的算法就是在这个函数里。
HookZwWriteFile:
创建一个线程,线程地址为0x401BC0, 这个线程用于Hook ZwWriteFile以及创建下一个线程,用于处理附加数据。
5.bmp
     在线程0x401BC0中,子进程通过GetModuleHandle得到ntdll.dll的句柄,再通过GetProcAddress得到ZwWriteFile的函数地址,将地址保存在0x5B409C中。
6.bmp
先调用了下线程同步函数,然后申请空间保存ZwWriteFile的头5个字节,进行HOOK,然后再创建一个线程地址为0x401B80的线程来处理附加数据。
7.bmp
最后等待父进程结束调试,结束此线程。
9.bmp
解密附加数据:
子进程首先将自身文件读入内存,定位到附加数据起始点,然后对自身PE头进行CRC32效验,利用这个效验值作为3DES的Key来解密附加数据,因此如果被脱壳,这个CRC32的值肯定不对,所以这里我们可以用原值进行PATCH。如果处理失败则恢复原有的Hook。
10.bmp
在LoadDLL这个CALL里,首先通过CreateFile-GetFileSize-ReadFile读入自身程序进缓冲区。
8.bmp
11.bmp
定位附加数据
12.bmp
对PE头进行CRC32计算,这个CRC32效验值后面会作为KEY来解密附加数据,所以我们脱壳后,CRC32效验值失败,这里我们PATCH一下原程序的CRC32值0xDFE963A6。
13.bmp
14.bmp
将CRC32值转换成小写字符串,作为Key对附加数据进行第一次解密
15.bmp
解密采用了微软的加密库Crypto,解密算法是3DES,解密数据是附加数据,大小为0x109B0。
16.bmp
这是第一次解密后的附加数据
17.bmp
解密完之后,申请空间,对附加数据进行第二次解密。
18.bmp
这是二次解密后的数据,可以看到MZ头,这是一个DLL文件,我们后面再说。
19.bmp
二次解密完成后,这个CM就相当于一个PELOADER,将这个DLL载入这个CM的地址空间,完成PE Loader的初始化工作。
20.bmp
首先先判断一下PE格式
21.bmp

然后取随机数,然后申请空间,空间大小是0x33000,作为这个DLL的基址,这就导致每次这个DLL加载的地址都不一样,为了分析,我们也可以Patch这个数值。
22.bmp
复制PE头
23.bmp
复制各个区段
24.bmp
对地址进行重定位
25.bmp
处理IAT(载入DLL)
26.bmp
处理IAT(得到函数地址)
27.bmp
处理IAT(保存API地址)
28.bmp
给区段置入属性
29.bmp
Eax的值为这个DLL的入口点,进入入口点初始化。
30.bmp
DLL初始化其实就是在内存里对这个DLL进行脱壳,这个DLL加了一个UPX的外壳。
31.bmp
我们往下翻,发现,这个DLL的真实入口是0x71A70BAE,减去基址0x71A70000,入口点偏移是10BAE,稍后我们可以把这个DLL提出来。
32.bmp
最后处理导出表
33.bmp
34.bmp
最后很重要的一部,将LSG函数地址存入Hook后的函数中。
35.bmp
这样附加数据就处理完毕了。

2 算法分析
之前所做的所有的一切都是为了隐藏这个函数的算法,现在就让我们来一步步的拨开它的面纱。
算法也分两部分,第一部分纯粹就是用来迷惑我们的,用于第二部分验证的跳板。

2.1算法第一部分分析
36.bmp
对User:360进行MD5加密,得到MD5User
37.bmp
对Key:55……进行MD5加密,得到MD5Key
38.bmp
连接MD5User+MD5Key
39.bmp
通过WideCharToMultiByte将User与Key转换成多字节
40.bmp
用sprintf_s连接User+Key,然后Xor 0x23进行加密
41.bmp
然后创建360.dat文件,将MD5User+MD5Key写入,触发我们之前的Hook ZwWriteFile,跳入执行。
42.bmp
后续就是将Label标志赋值Failed,创建线程假装注册按钮响应,其实,注册成功Label是在失败Lable的底层,我们用资源查看器可以看到,注册成功后ShowWindow。
43.bmp

2.2算法第二部分
44.bmp
WriteFile-ZwWriteFile钩子,直接调用401A40处的函数,这里直接用正确的Key.
User:
360
Key:552b437637727039504c6d75516d6439566d2f7a366c49554b76787a7939333659512b676f423739522b6251417235634b56614a5132726d344259424b346245704c2b7176685845674363624831425264614c537a673d3d
45.bmp
创建线程进行算法验证
46.bmp

这里是调用原来的代码
47.bmp
48.bmp
压入注册信息,调用LSG函数
49.bmp
Xor 23进行解密
50.bmp
用分隔符取注册信息
51.bmp
将Key转成十六进制表示
U+Cv7rp9PLmuQmd9Vm/z6lIUKvxzy936YQ+goB79R+bQAr5cKVaJQ2rm4BYBK4bEpL+qvhXEgCcbH1BRdaLSzg==
52.bmp
Base64解密得
53E0AFEEBA7D3CB9AE42677D566FF3EA52142AFC73CBDDFA610FA0A01EFD47E6D002BE5C295689436AE6E016012B86C4A4BFAABE15C480271B1F505175A2D2CE
53.bmp
对上述再次进行解密,这个算法,应该是RSA或者RC,记为Unknow吧。解密后的数据为:
E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B
54.bmp
对360进行MD5加密,加密后得:
E7B24B11 2A44 FDD9 EE93 BDF9 98C6 CA0E
55.bmp
取奇数位连接,与上述解密结果进行比较
E7B24B11 2A44 FDD9 EE93 BDF9 98C6 CA0E取奇数位为
E74B2AFDEEBD98CA
E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B取前四位,与第6-9位。
E74B2AFDEEBD98CA
两者进行比较
56.bmp
E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B取第9位至最后一位
1D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B进行3DE_112解密,密钥是lingdux
57.bmp
解密后的结果是
58.bmp
然后对Success进行MD5加密
59.bmp
加密后的结果与Success的MD5值比较
60.bmp
验证成功的话则显示成功信息
61.bmp

2.3注册机的编写。
因为有一个算法未知,所以这里只能说下流程。
先将User进行MD5计算,然后 取奇数位连接,再加上
1D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B,这样我们就可以构造Key1,将Key1用Unknow(未知算法)进行加密,然后再进行BASE64加密,将加密后的值转成字符串就得到了Key。

3.Patch注册码

3.1脱壳,修复附加数据
    脱壳用ESP定律,或者直接往下翻就行,这里要注意的是附加数据的处理。用overlay将附加数据复制出来
62.bmp
然后将附加数据用C32追加到到脱壳文件尾中。
63.bmp
处理完之后再作相应的Patch
先Patch父进程
64.bmp
将401C08 Nop掉
65.bmp
再Patch Crc32值
66.bmp
Patch注册信息
67.bmp
我们选取在地址是,Xor 23加密处,我们可以直接提取已加密好的注册信息,然后找一个空白地址,将它保存。
注册信息的地址是0x5832C5
Patch原地址代码
68.bmp
Patch后的地址代码
69.bmp
保存一下,然后输入任意信息都能注册了。
70.bmp
当然也可以Patch DLL生成的地址,使它地址固定,然后写个SMC来PATCH,总之方法多多了。
关于提取DLL要注意时机,不要在他初始化完之后再提取。然后将这个DLL丢到IDA里分析,不然OD不支持MMX指令集,有些代码看起来心烦。

4.结语
基本上这个CM就这些东西了,说个小BUG,在itoa函数转换MD5码时,如果MD5码中有一字节是0A格式的话,转换后会把0省略,不过也不碍事。

                                                                                                                                                                                      
                                                                                                                                                                                By 吾爱破解论坛 ID:我是用户

360CM解答1.zip

539.33 KB, 下载次数: 248, 下载积分: 吾爱币 -1 CB

点评

楼主这么牛,小伙伴们都知道吗?  发表于 2014-5-9 16:09

免费评分

参与人数 16热心值 +16 收起 理由
uuier + 1 厉害
Liu_Amor + 1 我很赞同!
差点死在墙上 + 1 谢谢@Thanks!
sunflover + 1 好文慢慢读,编辑辛苦了
yyjpcx + 1 我什么都没有看到,只看到hmily的影子
axiao + 1 我很赞同!
sdzzb + 1 NB大发了
yunzl + 1 我很赞同!
JoyChou + 1 学习学习。
九零-鑫鑫 + 1 非常感谢 我又学到了很多知识 (๑&a.
MistHill + 1 分析很好!
YsGer + 1 我很赞同!膜拜看了大牛的360网站攻防 然后
雨轩丨灬Arvin + 1 热心回复!
2393234523 + 1 我很赞同!
Shark恒 + 1 我很赞同!
xh5510 + 1 NB

查看全部评分

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

Hmily 发表于 2014-5-8 16:59
@我是用户 SHA512这个不记得有,可能是库里的代码编译进去的,好像没用到,这个@零度x 可以回答下。

最先做这个CrackMe想涉及文件自校验、乱序加密、虚拟机加密、对称和非对称多种加密算法、Anti debug和各种猥琐的小技巧,最后怕太难,乱序和虚拟机都没有添加,还主动给了一组key,当时想不给key估计很多人要说是假的了,难度也降低了很多。

CrackMe设计思路是围绕一个反调试和一个脱壳校验的问题展开,所有异常都不会有任何提示,只会默默的把注册功能干掉而已,我不会告诉你我要退出或者我发现调试器了,小猥琐。

RSA用的是512,海风说圈内有几位还是能跑出来私钥的,但没未见很遗憾,隐藏的彩蛋有一位同学答题提到了,但未解出来,也算不错了。

点评

1. SHA512的初始化代码是跑过的,后面用没有就没管它了。2. 想学学跑私钥的方法 :)。3. 很遗憾没找到彩蛋 :(。  发表于 2014-5-8 17:47
虚拟机加密后难度会增加很多,其他的跟的时间久的话还是可以跟出来的,等下补补RSA算法,感谢H大的思路解答以及各位大牛。  发表于 2014-5-8 17:20
Hmily 发表于 2014-5-8 16:25
这个程序是我和@零度x 同学沟通交流后,由他编写的,部分技术支持由海风、苦力和小胖纸提供,以示感谢,有问题你们来问,@零度x 来回答吧!

Ps:过程直接贴出来就好了,方便阅读!Base64后面是RSA512解密。

点评

为什么我在里面发现了SHA512的痕迹,思路很好,算法影响的很隐秘,赞一个,感谢!  发表于 2014-5-8 16:46
题目很好,感谢各位幕后英雄!  发表于 2014-5-8 16:42
九零-鑫鑫 发表于 2014-5-8 15:35
哈哈 膜拜大牛啊 话说这个CM有点难啊 壳都没见过..
看看您怎么破的 {:1_931:}
Rck红月破夜 发表于 2014-5-8 15:42
关键地方是找到了不知道他咋解密的 账号密码不一样加密的也不一样擦
 楼主| 我是用户 发表于 2014-5-8 15:42
九零-鑫鑫 发表于 2014-5-8 15:35
哈哈 膜拜大牛啊 话说这个CM有点难啊 壳都没见过..
看看您怎么破的

RL的压缩壳
 楼主| 我是用户 发表于 2014-5-8 15:43
Rck红月破夜 发表于 2014-5-8 15:42
关键地方是找到了不知道他咋解密的 账号密码不一样加密的也不一样擦

Hook ZwWriteFile
manbajie 发表于 2014-5-8 15:48
我只是来看看的
Amaya° 发表于 2014-5-8 15:53
膜拜大大 - -  表示完全搞不懂- -
头像被屏蔽
zhang63 发表于 2014-5-8 16:06
围观,坐等结果
雨轩丨灬Arvin 发表于 2014-5-8 16:17
前排支持、膜拜大大、尔等还没学习到这个地步
kaoyange 发表于 2014-5-8 16:17
强势围观
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-26 22:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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