吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 36881|回复: 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这个互斥对象来识别自身,流程图如下:
                              
CreateMutex判断自身是父进程还是子进程

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

等待子进程初始化完毕,然后结束自身。


1.3 子进程启动分析
    子进程的初始化函数中分两个部分。
第一部用于Hook ZwWriteFile,极大隐藏了算法。
第二部分用于解密附加数据,然后将其在内存中载入,这个附加数据其实是一个DLL,里面有一个名为LSG的导出函数,这个CM的算法就是在这个函数里。
HookZwWriteFile:
创建一个线程,线程地址为0x401BC0, 这个线程用于Hook ZwWriteFile以及创建下一个线程,用于处理附加数据。
     在线程0x401BC0中,子进程通过GetModuleHandle得到ntdll.dll的句柄,再通过GetProcAddress得到ZwWriteFile的函数地址,将地址保存在0x5B409C中。

先调用了下线程同步函数,然后申请空间保存ZwWriteFile的头5个字节,进行HOOK,然后再创建一个线程地址为0x401B80的线程来处理附加数据。

最后等待父进程结束调试,结束此线程。

解密附加数据:
子进程首先将自身文件读入内存,定位到附加数据起始点,然后对自身PE头进行CRC32效验,利用这个效验值作为3DES的Key来解密附加数据,因此如果被脱壳,这个CRC32的值肯定不对,所以这里我们可以用原值进行PATCH。如果处理失败则恢复原有的Hook。

在LoadDLL这个CALL里,首先通过CreateFile-GetFileSize-ReadFile读入自身程序进缓冲区。


定位附加数据

对PE头进行CRC32计算,这个CRC32效验值后面会作为KEY来解密附加数据,所以我们脱壳后,CRC32效验值失败,这里我们PATCH一下原程序的CRC32值0xDFE963A6。


将CRC32值转换成小写字符串,作为Key对附加数据进行第一次解密

解密采用了微软的加密库Crypto,解密算法是3DES,解密数据是附加数据,大小为0x109B0。

这是第一次解密后的附加数据

解密完之后,申请空间,对附加数据进行第二次解密。

这是二次解密后的数据,可以看到MZ头,这是一个DLL文件,我们后面再说。

二次解密完成后,这个CM就相当于一个PELOADER,将这个DLL载入这个CM的地址空间,完成PE Loader的初始化工作。

首先先判断一下PE格式


然后取随机数,然后申请空间,空间大小是0x33000,作为这个DLL的基址,这就导致每次这个DLL加载的地址都不一样,为了分析,我们也可以Patch这个数值。

复制PE头

复制各个区段

对地址进行重定位

处理IAT(载入DLL)

处理IAT(得到函数地址)

处理IAT(保存API地址)

给区段置入属性

Eax的值为这个DLL的入口点,进入入口点初始化。

DLL初始化其实就是在内存里对这个DLL进行脱壳,这个DLL加了一个UPX的外壳。

我们往下翻,发现,这个DLL的真实入口是0x71A70BAE,减去基址0x71A70000,入口点偏移是10BAE,稍后我们可以把这个DLL提出来。

最后处理导出表


最后很重要的一部,将LSG函数地址存入Hook后的函数中。

这样附加数据就处理完毕了。

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

2.1算法第一部分分析

对User:360进行MD5加密,得到MD5User

对Key:55……进行MD5加密,得到MD5Key

连接MD5User+MD5Key

通过WideCharToMultiByte将User与Key转换成多字节

用sprintf_s连接User+Key,然后Xor 0x23进行加密

然后创建360.dat文件,将MD5User+MD5Key写入,触发我们之前的Hook ZwWriteFile,跳入执行。

后续就是将Label标志赋值Failed,创建线程假装注册按钮响应,其实,注册成功Label是在失败Lable的底层,我们用资源查看器可以看到,注册成功后ShowWindow。


2.2算法第二部分
WriteFile-ZwWriteFile钩子,直接调用401A40处的函数,这里直接用正确的Key.
User:
360
Key:552b437637727039504c6d75516d6439566d2f7a366c49554b76787a7939333659512b676f423739522b6251417235634b56614a5132726d344259424b346245704c2b7176685845674363624831425264614c537a673d3d

创建线程进行算法验证


这里是调用原来的代码

压入注册信息,调用LSG函数

Xor 23进行解密

用分隔符取注册信息

将Key转成十六进制表示
U+Cv7rp9PLmuQmd9Vm/z6lIUKvxzy936YQ+goB79R+bQAr5cKVaJQ2rm4BYBK4bEpL+qvhXEgCcbH1BRdaLSzg==

Base64解密得
53E0AFEEBA7D3CB9AE42677D566FF3EA52142AFC73CBDDFA610FA0A01EFD47E6D002BE5C295689436AE6E016012B86C4A4BFAABE15C480271B1F505175A2D2CE

对上述再次进行解密,这个算法,应该是RSA或者RC,记为Unknow吧。解密后的数据为:
E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B

对360进行MD5加密,加密后得:
E7B24B11 2A44 FDD9 EE93 BDF9 98C6 CA0E

取奇数位连接,与上述解密结果进行比较
E7B24B11 2A44 FDD9 EE93 BDF9 98C6 CA0E取奇数位为
E74B2AFDEEBD98CA
E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B取前四位,与第6-9位。
E74B2AFDEEBD98CA
两者进行比较

E74B2AFD58EEBD98CA661D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B取第9位至最后一位
1D55F56FED567B9533643A387D13D91FA80C08B11F73AF80820D5C5E91216546EBCB368D08EEA3691B进行3DE_112解密,密钥是lingdux

解密后的结果是

然后对Success进行MD5加密

加密后的结果与Success的MD5值比较

验证成功的话则显示成功信息


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

3.Patch注册码

3.1脱壳,修复附加数据
    脱壳用ESP定律,或者直接往下翻就行,这里要注意的是附加数据的处理。用overlay将附加数据复制出来

然后将附加数据用C32追加到到脱壳文件尾中。

处理完之后再作相应的Patch
先Patch父进程

将401C08 Nop掉

再Patch Crc32值

Patch注册信息

我们选取在地址是,Xor 23加密处,我们可以直接提取已加密好的注册信息,然后找一个空白地址,将它保存。
注册信息的地址是0x5832C5
Patch原地址代码

Patch后的地址代码

保存一下,然后输入任意信息都能注册了。

当然也可以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, 下载次数: 254, 下载积分: 吾爱币 -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:}
3#
Rck红月破夜 发表于 2014-5-8 15:42
关键地方是找到了不知道他咋解密的 账号密码不一样加密的也不一样擦
4#
 楼主| 我是用户 发表于 2014-5-8 15:42 |楼主
九零-鑫鑫 发表于 2014-5-8 15:35
哈哈 膜拜大牛啊 话说这个CM有点难啊 壳都没见过..
看看您怎么破的

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

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

本版积分规则

返回列表

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

GMT+8, 2025-3-31 01:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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