吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

[Android 原创] Android hwp加密文件密码解密初探

  [复制链接]
xinlin 发表于 2020-5-15 23:04
        近期有幸接识了一个国外的某办公软件app,文档是hwp格式,类似于word,也能用密码加密文档,对其加密作了初步探索,分享重在解密心得过程,不在于取得推算密码。
        初看之下发现是一个典型的C++代码,应该是windows代码移置到移动app中的,虚函数比较多,因此流程的查看比较麻烦,先是动态调试,有一定的反调试功能,但都比较弱,很容易解决,后面跟踪发觉这个office文档中元素种类很多,读写文件操作也都封装在VTable中,跟踪有点让人眼花。通过断点fopen找到了hwp文件打开的位置:
        0036C68C:openHwp()   
p1.jpg
        可以看出,初始就构造了3个C++对象。

        继续下去,跟踪了一下其文件结构,大致结构是一个Head,然后后面有多个body,每个body的偏移计算都不一样,有的偏移计算要好几个偏移寻址才能得到真实的偏移,看来如果要完整理清其格式真是一个体力活。同时可以看出多数body都没有使用加密,偿试从此开始跟踪查看加密数据块,但2天后没有结果,其偏移计算太多且各种的不一样。幸好我目标不在文件结构,这种解决方式退出。
        第一条路比较麻烦,随之开始主要转静态逆向看看,想看看路径上的C++对象有多少,便开始一个一个的还原C++对象,又搞了2天C++对象的标注,在调用路径上的对象越来越多,分支不可控,有点头大了,这条路也退出。
        看看吧,类似的C++对象很多:
p2.jpg
        第3种方案重打包注入一个能hook的so,再看hook能提供有价值的线索不,调试之中已经看到其密码是使用的是window下的wchar(2个byte表示一个字符)形式,libc中的str之类hook就没多少意义,hook看起来好象能提供的价值也不大,这也是我最初没有重视使用hook的原因。经过反复hook测试,在使用正确密码和错误密码过程中考虑到hook log的不同,从这里入手也许可行,重点是看fread的log,这log里面最关键有一点,需要把当前文件读位置也打印出来,这样更好看,这是同一文件2次操作的log对比:
p3.jpg

        很惊人的线索出来了,前面部分完全一样,从hwp文件0x13c0开始是连续读文件(其前面肯定是计算这个body的偏移,不用理会),可以猜想这块10*0x40+0x10=0x290的数据应该是加密块,fread在0x0037f137被调用,断点在最后一块数据读完后,稍微跟踪这个数据块,就来到这里:

        002DCB5E:createZipData()
        文件偏移0x13C0开始0x290个数据即需要在此进行第一步解密,解密没有成功或失败的结论,是否成功依靠后面解压来确定。
p4.jpg
        然后再对解密数据作解压,crc32校验处理:
        0033CC10:inflateZipData()
p5.jpg
        inflate是不是很熟悉,到此hwp中加密块解密处理结束,解压或校验失败会抛出异常。到此遗憾的是还没有看到密码的使用,再看具体的解密函数。
       
        createZipData(ZStream *obj, HncStream *key, int *buf, signed int buf_len)
        key是一个C++对象,其中已经没有直接的密码字符了,可以肯定密码已经处理变换成一张表了,进入到里面的关键函数:
        0034B050:decryptDataBy8Byte()
p6.jpg
        明显while循环中有重要信息,再进去看看:
        0034ACA0 :decryptMy1_sub2()
p7.jpg
        这是解密最里面的算法了,似乎在引用一张表,而且不是传入的密码表,经过调试发现它是一张随密码而更新的表,这个是一个全局变量保存的,用X查看引用关系找到一个未曾逆向过的函数,还在向里面写:
        0034B100:encryptKey_sub6()
p8.jpg
        只需要向上找一级调用, 调试一下调用参数,很明显这就是我们要找的密码表生成函数,其中生成了2张表,一张表放到C++对象中,一张放到全局变量保存,解密时这两张表都要使用。
       
        0034B408:getEncryptKey(const wchar_t *pwd, int mode)
p9.jpg
        同时也看到第2个参数在控制使用哪种加密方式,不过到此我收到的这个hwp文件解密过程就全部找到了,初步目的也达到了,写了一个简单的验证app,对提取的相关代码作了测试,初步证明代码能生成正确的密码表,并解密hwp文件加密块,不过我也偷懒了一下没有将相关inflate加入测试app中。hwp文件及相关测试代码一并献上,只是代码没有规范整理,期望看了的朋友别骂我,目的达到就不想多花时间了,以后有时间再分析文件结构,分析密码看看是否可直接找回,暴力破密只能是最后选择。
        最后,谢谢参观,这个因为是业余搞的,不是很认真可能有误,第一次在破解发贴,请指正!
        吐槽一下,怎么没有预览功能,都不知有没有错误之笔!

HwpTest.zip (104.07 KB, 下载次数: 52)

免费评分

参与人数 8威望 +2 吾爱币 +107 热心值 +6 收起 理由
19936040638 + 1 我很赞同!
kernel2020 + 1 + 1 热心回复!
leonqp1030 + 1 用心讨论,共获提升!
縈默A + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gaosld + 1 + 1 热心回复!
qtfreet00 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dreamlivemeng + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

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

chenjingyes 发表于 2020-5-19 15:08
写的很好,图有点模糊
xixicoco 发表于 2020-5-20 00:04
Light紫星 发表于 2020-5-21 11:18
乳酸菌 发表于 2020-5-21 16:09
顶上!论坛有你更精彩!
boyblacker1111 发表于 2020-6-2 14:44
绝对优秀文章!向楼主学习!
 楼主| xinlin 发表于 2020-6-9 10:15
图片模糊应该是论坛后台压缩加工后的结果,我们都理解一下。
abc6868 发表于 2020-6-9 13:30
楼主写的文章非常优秀,值得学习,收藏了哈
ministart 发表于 2020-7-11 15:13
楼主写的文章非常优秀,值得学习,收藏了哈
0海阔天空0 发表于 2020-7-26 19:19
楼主优秀,值得学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-28 11:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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