首页
社区
课程
招聘
[原创]Directory Opus 13.2 逆向分析
发表于: 2024-2-18 20:10 22228

[原创]Directory Opus 13.2 逆向分析

2024-2-18 20:10
22228

文章仅供学习使用,切勿用于非法用途。如有造成侵权,请及时联系作者处理。

DIrectory Opus是一款非常优秀的Windows 文件多功能资源管理器,下面是来自官网的一个简单介绍:

“Windows 系统自带的资源管理器固然好用,但是对于需求很多的用户来说它就远远不够,因此专业且强大的文件管理器成为很多用户心目中的选择,而 Directory Opus 就可以完美的替代系统默认的资源管理器,成为你管理资源中更好的帮助。与系统自带的相比它有更高度自由的界面定制,1000位使用者中有 1000 种喜爱,而它 100% 自定义性可以完美的满足每一位使用者,让大家都可以使用的满意。与系统自带的相比它使用起来更简单,不需要学习任何复杂的脚本或者是技术就可以上手使用,运作方式与 Explorer 或许有些相似,人人都可以快速的使用它。与系统自带的相比它还有更多出色的功能,如计算文件大小、切换格式、模式选择、FTP 链接、预览功能、备份与恢复等等,这些功能可以使操作文件变得更加轻而易举,不管是需要功能强大还是简单易用,它都可以成为大家心目中的首选。”

但是有朋友指出再其早期版本存在资源占用高的问题,提到“资源占用”的问题也是瞬间激起了笔者对其最新版本进行逆向分析兴趣。所以有了这篇文章。

网络上并没有对DIrectory Opus进行逆向分析的一些较为详细的文章,比较早的是cntrump前辈对DIrectory opus 9 版本的一些证书提取的思路。

[原创]偷出 Directory Opus 9 的授权证书 -- 另类提取被 Thinapp 打包的文件-软件逆向-看雪-安全社区|安全招聘|kanxue.com

此文章并没有生成注册机,而是使用其12版本注册码进行注册。文章不提供下载,读者如果有需求可与笔者进行交流学习。笔者水平有限,如果文章内容有错误或者读者有更好的思路,还请不吝赐教。

笔者在之前使用的12.3版本的DO使用的是 文件替换+证书验证 的方式,推测可能使用了类似RSA公钥替换攻击,我们可以沿用这一方法。这里笔者从网上下载了之前公布的一些破解版。

image-20240218093328518

可以看到对原始的几个文件进行了替换。其中LanguageViewers文件夹从名字上就容易猜到不是我们主要进行逆向的目标,而dopuslib.dll可以推测其提供一些库函数供其他逻辑调用,根据文件大小可以猜测程序主要逻辑在dopus.exe

这里一个思路是:使用12.33版本的源文件与被patch后的文件进行bindiff比对,但因为大版本的更新,需要将12.33两个版本进行比对,然后移植到13.2版本上,不敢说这样一定会减少逆向的工作量,所以bindiff比对这里只作为一种参考辅助。

首先这里笔者想关闭dopuslib.dlldopus.exe的ASLR时很快就遇到了完整性校验问题。

image-20240218095907162

可以猜测进行完整性校验时可能会使用CreateFilew,使用xdbg对其下日志断点,记录打开的文件

image-20240218102128035

将<a name="CreateFileW调用日志">CreateFileW调用日志</a>导出,可以发现其并没有打开dopus.exe或者dopuslib.dll,如下,推测其可能不是使用CRC的方式计算完整性。但是留意到程序多次打开了dopus.cert文件,推测是证书的存根。读者可以记录试用时的证书,与下文注册成功的dopus.cert进行对比。

image-20240218102043623

这里联想到另一种使用WIndows受信组件验证方式,其核心API:WinVerifyTrust,一个简单介绍:

【windows + 证书验证】 验证数字签名的方法 - mooooonlight - 博客园 (cnblogs.com)

同样,在其PE结构中也有相应字段暗示:

image-20240218194807456

WinVerifyTrust下日志断点,记录感兴趣的返回地址以及验证的文件。

image-20240218123030718

断点被触发,简单整理

image-20240218125003356

两个位于dopuslib.dll一个位于dopus.exe,转到相应位置

dopus.exe中 VA—>0x140967A93

image-20240218111025214

可以看到调用方式为间接调用,这里记录

dopuslib.dll中VA—>0x180035AE7 & 0x180035BDB同样可以看到对其调用方式为GetProcAddress间接调用

image-20240218111825394

image-20240218112019298

可以看到字符串进行了简单的拼接加密,简单解密脚本如下:

可以看到解密出很多敏感字符串

image-20240218121839290

dopus.exe中 VA—>0x140CC19C0 & 0x140CC1A5E

image-20240218130704539

可以看到同样有一些字符串加密,其实是一个简单的Base64换表以及一个异或,这里不多赘述。

接下来将patch后的文件替换会原文件,并对五个检查位置下断点,获取WinVerifyTrust的返回值。读者可能觉得多次一举,因为WinVerifyTrust验证成功返回0,其余值都是不授信的。

image-20240218134205815

收集到的信息以及简单的patch如下:

image-20240218140929354

image-20240218141846244

可以看到对于0x140967A93处的patch需要多加小心在第一调用时,返回0x800B0100但在第二次时返回成功。这里笔者对这一处的处理是在patch掉0000000140967A8A使其eax值为0x800B0100并禁用掉第二次的调用,简单对这个位置下断点,可以找到第二次调用位置0x00140966DFE

将如下所指区域的调用全部nop掉即可。

image-20240218141646574

patche之后运行一段时间会发下,程序虽然没有退出,但是出现了异常:

image-20240218144836248

会发现日志里多了一条WinVerifyTrust的调用,同样patch返回值为0即可。

image-20240218144422333

程序不在出现异常。

对于证书存放的位置,这里读者使用的方法是对使用对GetWindowsTextW下断

image-20240218152240191

进行栈回溯,比较简单就可以定位到0000000140CEEB76,函数sub_140CEAF50为证书验证逻辑。

image-20240218152427014

跟进0000000140CEEB76,进行一些逆向分析可以发现函数sub_140CE6EC0的第三个参数为key

image-20240218152839383

猜测其可能是使用一个全局变量来存储证书内容,对qword_1418BF450下写入断点,可以定位到位置0000000140CCE331,整个函数在完成初始化操作,在这里对a1 + 0xDC0下写入断点

image-20240218170906521

定位到写入位置0000000140CCE7A1

image-20240218171129996

可见0xDC0位置数据来自于dopuslib.dll,跟进dopuslib_23

image-20240218171323915

这里出现了比较熟悉的字符串,跟进dopuslib_10可以发现其加载名为RSA的资源,秘钥存放在资源里,我们可以用12.33版本中的RSA公钥进行替换。看起来DO有两种的验证方式,而证书验证默认使用的是不是RSA,我们可以patch为使用RSA

image-20240218171613411

替换的公钥:

image-20240218172543063

再次运行后发生了栈溢出

image-20240218172755176

定位到发生溢出的位置0018003CAD4,可以推测是加载语言的dll时出现了问题,如下:

image-20240218173953006

跟进sub_18003CD00

image-20240218174132430

为了让程序正常运行,需要patch dopuslib_14返回1,dopuslib_14似乎整个程序只是用于验证dll的合法性,所以直接patchdopuslib_14,patch内容以及位置如下

重新运行,可见程序正常运行,并输入替换公钥对应的注册码

image-20240218181314109

但是重启程序后依然会弹出未授权的提示。这里联想到在上方的CreateFileW日志中,程序大量使用CreateFileW打开opus.cert。通过对比可以发现opus.cert在我们注册完成之后已经发生了变化。所以我们的注册逻辑是成功的,证书已经成功被写入了存根,而在此打开提示未授权的原因大概率出在对存根证书的验证逻辑上。

同样在CreateFileW下条件断点

image-20240218183809734

整理得到如下调用:

image-20240218184207910

0x1401E3197位置所在的函数是一个公共函数,其有很多的引用。这里的话只能硬着头皮去分析了,8个调用工作量也不算太大。

对函数CreateFileW所在的函数sub_1401E30F0下断点。

image-20240218185002845

最终定位VA0000000140CE721A中的如下位置:

image-20240218185303483

经过上面的分析我们知道qword_1418BF450 + 0xDC0所在的内存区域,这里对公钥进行了哈希,与程序内置的一串哈希进行比对,这里肯定是会失败的。所以我们强跳在这个检测就可以。

重新运行后进入主程序,但是马上就出现了完整性校验失败,我们可以排除WinVerifyTrust校验问题

image-20240218190958860

前面我们分析到程序大概率没有使用CRC对自身完整性进行校验,但是可能会对证书进行校验呢,事实上证实如此,我们可以在dopus.exe的函数窗口搜索CRC,如下,可以看到虽然没有对CalcCRC32的直接引用,但是对其中的函数sub_1412A4960有些许引用。这里我们可以对此函数下断,根据传入的数据跟我们已知的内容(比如证书存根或者我们替换的publickey)进行比对,来找到可疑位置。

image-20240218192720752

因为考虑到对CRC函数进行下断分析工作可能会非常繁重,所以这里笔者通过bindiff比对的方式,将原12.33版本的opus.exe与网上公布的同版本破解版进行比对,发现其大体的修复思路相同。我们注意到如下位置:

image-20240218193406997

一个简单的分析结果如下

image-20240218194020498

所以我们使用正常的程序拿到一个正常的哈希值来替换这个结果即可。patch如下

最终结果:

image-20240218194418592

总的来说,整个程序的反逆向工程结构如下

比较有意思的是,程序维护一个区域0x00000001801C0230并将检测结果维护其中,其中的某些字段会引起程序的异常行为而导致逆向成本的增加,对产品安全性有一定的提升。
2024年3月5日更新
在docs.dll RVA:EC72 中新增一处过完整性校验Patch,Patch为jmp即可,在调试过程中出现出现一些域名信息,可能系网络验证,找到这个点的思路同样是对WinverifuTrust下断记录即可,出于时间原因不再进一步逆向,有兴趣的朋友可以深入研究。
图片描述
2024年3月29日更新
dopus.exe RVA:0xcc7a0f出触发了一些文件完整性校验
图片描述
定位方法使用比较简单的对检测弹出的窗口进行附加查看窗口启动的命令行信息:/BADSHOW1,然后对CreateProcessW下断,以命令行特征为断点,很快可以定位到线程函数,向上回溯就可。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-3-29 10:16 被Sw1ndler编辑 ,原因: 遗漏一处完整性校验。
收藏
免费 15
支持
分享
最新回复 (42)
雪    币: 2948
活跃值: (30846)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-2-18 20:43
2
雪    币: 35602
活跃值: (7155)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢分享,编得不错,求对应版本的下载链接,仅为练手。软件太大,我用tc。
2024-2-19 07:33
0
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
ninebell 感谢分享,编得不错,求对应版本的下载链接,仅为练手。软件太大,我用tc。
好的
2024-2-19 08:15
0
雪    币: 35602
活跃值: (7155)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
https://www.gpsoft.com.au/download/release 下载不动,被天国狗畜生和谐了。。
2024-2-19 10:26
0
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
ninebell https://www.gpsoft.com.au/download/release 下载不动,被天国狗畜生和谐了。。
发你看雪私信了
2024-2-19 10:33
0
雪    币: 35602
活跃值: (7155)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
编得不错,超级佩服。。。特别是几次对条件断点的灵活运用。。。16进制编辑器似乎用的是010editor ,插件用的是IDA对比的那款。要我的话肯定派二进制忍者上场了。

收到了,感谢!我拿到软件的第一件事就是照着楼主的思路再来一遍。看看自己能不能说得明白,做得明白,心里明白=彻底明白
2024-2-19 10:40
0
雪    币: 5278
活跃值: (4753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
牛皮~~~~
2024-2-19 21:53
0
雪    币: 224
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
高手啊,感谢分享!
2024-2-21 00:22
0
雪    币: 0
活跃值: (142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大侠能否提您供调试的版本,想按照您的思路再现,遇到无法解决的可以参考您的下断点,谢谢!
2024-2-21 09:24
0
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
zoujingqi 大侠能否提您供调试的版本,想按照您的思路再现,遇到无法解决的可以参考您的下断点,谢谢!
私信你了
2024-2-21 09:48
0
雪    币: 319
活跃值: (2439)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
12
Sw1ndler 好的
分析思路很清晰,也求目标程序练手
2024-2-21 09:49
0
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13

1

最后于 2024-2-21 10:43 被Sw1ndler编辑 ,原因:
2024-2-21 10:41
0
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14

1

最后于 2024-2-21 10:44 被Sw1ndler编辑 ,原因:
2024-2-21 10:43
0
雪    币: 319
活跃值: (2439)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
15
Sw1ndler 1
感谢!!!
2024-2-22 08:49
0
雪    币: 5278
活跃值: (4753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
为何对其 WinVerifyTrust下断没反应?
2024-2-24 11:38
2
雪    币: 1216
活跃值: (2816)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
~时光荏苒 为何对其 WinVerifyTrust下断没反应?
有些对WinVerifyTrust的调用是用的线程的方式,可能需要等一段时间,我记得也有启动时的检测,对WinverifyTrust是一定会调用的,如果没有的话就把断点下深一点试试看。
2024-2-25 15:14
0
雪    币: 4571
活跃值: (2797)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看这软件界面难受啊
又小又黑
真受不了黑暗模式
伤眼睛
2024-2-27 19:09
0
雪    币: 5167
活跃值: (2810)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错,支持一下。
2024-2-28 12:11
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
求破解好的文件,感谢
2024-2-28 13:28
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
大佬  能发一份吗  谢谢
2024-2-29 11:50
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
已关注大佬
2024-2-29 12:26
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
它貌似还有联网完整性验证,所以网上找到的破解版还有改别的地方
2024-2-29 20:40
0
雪    币: 234
活跃值: (1659)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
24
感谢楼主分享,透过现象看到本质
2024-3-1 16:23
0
雪    币: 9529
活跃值: (3317)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
拜读大作,十分佩服!
2024-3-3 17:32
0
游客
登录 | 注册 方可回帖
返回
//