xinlin 发表于 2020-5-15 23:04

Android hwp加密文件密码解密初探

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

        可以看出,初始就构造了3个C++对象。

        继续下去,跟踪了一下其文件结构,大致结构是一个Head,然后后面有多个body,每个body的偏移计算都不一样,有的偏移计算要好几个偏移寻址才能得到真实的偏移,看来如果要完整理清其格式真是一个体力活。同时可以看出多数body都没有使用加密,偿试从此开始跟踪查看加密数据块,但2天后没有结果,其偏移计算太多且各种的不一样。幸好我目标不在文件结构,这种解决方式退出。
        第一条路比较麻烦,随之开始主要转静态逆向看看,想看看路径上的C++对象有多少,便开始一个一个的还原C++对象,又搞了2天C++对象的标注,在调用路径上的对象越来越多,分支不可控,有点头大了,这条路也退出。
        看看吧,类似的C++对象很多:

        第3种方案重打包注入一个能hook的so,再看hook能提供有价值的线索不,调试之中已经看到其密码是使用的是window下的wchar(2个byte表示一个字符)形式,libc中的str之类hook就没多少意义,hook看起来好象能提供的价值也不大,这也是我最初没有重视使用hook的原因。经过反复hook测试,在使用正确密码和错误密码过程中考虑到hook log的不同,从这里入手也许可行,重点是看fread的log,这log里面最关键有一点,需要把当前文件读位置也打印出来,这样更好看,这是同一文件2次操作的log对比:


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

        002DCB5E:createZipData()
        文件偏移0x13C0开始0x290个数据即需要在此进行第一步解密,解密没有成功或失败的结论,是否成功依靠后面解压来确定。

        然后再对解密数据作解压,crc32校验处理:
        0033CC10:inflateZipData()

        inflate是不是很熟悉,到此hwp中加密块解密处理结束,解压或校验失败会抛出异常。到此遗憾的是还没有看到密码的使用,再看具体的解密函数。
       
        createZipData(ZStream *obj, HncStream *key, int *buf, signed int buf_len)
        key是一个C++对象,其中已经没有直接的密码字符了,可以肯定密码已经处理变换成一张表了,进入到里面的关键函数:
        0034B050:decryptDataBy8Byte()

        明显while循环中有重要信息,再进去看看:
        0034ACA0 :decryptMy1_sub2()

        这是解密最里面的算法了,似乎在引用一张表,而且不是传入的密码表,经过调试发现它是一张随密码而更新的表,这个是一个全局变量保存的,用X查看引用关系找到一个未曾逆向过的函数,还在向里面写:
        0034B100:encryptKey_sub6()

        只需要向上找一级调用, 调试一下调用参数,很明显这就是我们要找的密码表生成函数,其中生成了2张表,一张表放到C++对象中,一张放到全局变量保存,解密时这两张表都要使用。
       
        0034B408:getEncryptKey(const wchar_t *pwd, int mode)

        同时也看到第2个参数在控制使用哪种加密方式,不过到此我收到的这个hwp文件解密过程就全部找到了,初步目的也达到了,写了一个简单的验证app,对提取的相关代码作了测试,初步证明代码能生成正确的密码表,并解密hwp文件加密块,不过我也偷懒了一下没有将相关inflate加入测试app中。hwp文件及相关测试代码一并献上,只是代码没有规范整理,期望看了的朋友别骂我,目的达到就不想多花时间了,以后有时间再分析文件结构,分析密码看看是否可直接找回,暴力破密只能是最后选择。
        最后,谢谢参观,这个因为是业余搞的,不是很认真可能有误,第一次在破解发贴,请指正!
        吐槽一下,怎么没有预览功能,都不知有没有错误之笔!


chenjingyes 发表于 2020-5-19 15:08

写的很好,图有点模糊:lol

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

楼主优秀,值得学习学习
页: [1] 2
查看完整版本: Android hwp加密文件密码解密初探