|
发表于 2020-5-9 18:35:35
|
显示全部楼层
本帖最后由 thxlp 于 2020-5-9 19:21 编辑
这个是这样的。
xilinx用的加密方法是按照标准来的。
以aes-128-cbc为例(大部分都是这个加密方式),
加密的时候先生成一个16字节的session key和一个initialization vector(可以随机生成),用这个session key和initialization vector加密需要被加密的代码(代码需要用pkcs1补齐到16位),
然后再把initialization vector和加密后的结果拼接到一起,做base6 4编码,最终生成的就是data_block的部分。
所以我们能直接从data_block部分提取到initialization vector, 这一步未知的部分就是这个session key。
接下来把这个session key用xilinx自己的rsa密钥的public key加密(也是使用的pkcs1 padding)(这个public key是公开的),加密后的结果一样经过base6 4编码得到的就是key_block部分的数据。
所以我们想要解密的话就是两步走,
1.找到xilinx的private key用它解密key_block,得到session key。
2.再用session key解密data_block得到未加密的原始代码。
======================理论就是这些==============
然而不幸的时候,xilinx不知道从哪个版本开始不再使用openssl的rsa库了,不能直接提取到他的private key究竟是什么了。
我大概的分析了一下,xilinx可能是使用了一个white-box的rsa算法(所谓white-box就是把key集成到算法里面,让人没有办法从内存里面抓到key是什么),
幸运的时候,虽然xilinx加密解密的那个dll文件加了壳,但是壳很简单,虽然那个dll使用了各种反跟踪反调试的手段,但是手段都比较初期直接,
最重要的时候,他的加密解密的关键函数完全没有使用花指令也没有插入反跟踪反调试一类的代码,干干净净的。
目前我就是直接把他的加密解密函数照着实现了一遍。
=========================
如果想手动做一次的话,那就安装下面的步骤来就行。
xilinx的加密函数解密函数都在libisl_iostreams.dll这个文件里面。
首先给他脱个壳(也不需要脱完壳之后还能再运行),所以直接用个内存dump工具dump一份出来就行了。
然后分析他,找到关键的rsa加密解密的函数,然后上调试器(我习惯用windbg)。
上调试器之前要对付一下他的反调试手段,
xilinx大概的反调试手段有这么几个(这个在dump出来那个dll里面很容易就能发现),都是同一个套路,
int 3,int 2d,illegal instruction, invalid handle, access violation这些让调速器直接忽略就行。
剩下三个分别是,
用setthreadcontext来清除硬件断点,用ntqueryinformationprocess来判断debugobject,用peb->BeingDebugged来判断是否有debugger,
前面两个都到对应的win32 api上放条件断点跳执行,直接返回,最后一个一次性修改peb就行了。
剩下的就很直接了。。找到他的算法和他这个算法使用的数据照着实现一份。 |
|