从零打造简单的SODUMP工具
Author: ThomasKing
最近翻看之前的帖子,发现基于linker init_array加密的SO文件的静态分析稍微麻烦。虽然原理很清楚,但是需要dump之后再进行section修复才能放入ida。可以看到,上述两步骤其实很机械。那么应该可以实现一个自动化工具,帮助我们解决上述问题,让我们可以精力专注于其他地方,提高效率。实现上述工具需要解决两个问题:1> 应对各种加密算法 2> section重建。Section 重建在
http://bbs.pediy.com/showthread.php?t=192874
已经讨论,就不再赘述,仅仅改进一些不足之处。
一、应对各种加密算法策略
在
http://bbs.pediy.com/showthread.php?t=192020&viewgoodnees=1&prefixid
= 等帖子中提到的SO文件都基于init_array实现。为了静态分析,不得不分析出算法,并实现对SO解密,以便静态分析。而且,不同的SO采用不同的加密算法。这个步骤时间的花费,取决于分析人员对各种常用的加密算法RC4、TED等了解程度,这是比较纠结的事情。
那如何应对各种加密算法,成为工具实现的关键。直接实现各种算法,这个显然是不行的。那只能通过某种方法来绕过。想了很久,也没有很好的解决策略。不过有一点,熟悉SO机制的读者都知道,linker可是应对自如!那看来只能借linker之手,来帮助我们实现。
Linker除了在程序运行初加载外,还有就是通过dl函数会调用,即dlopen、dlsym、dlerr和dlclose。啰嗦下dlopen和dlsym函数原型:
void *dlopen( const char *
pathname
, int
mode
);
void*dlsym(void*handle,constchar*symbol);
通常,使用dlopen打开加载某SO后,会返回一个handle对象,然后根据handle对象调用dlsym查找某函数符号,实现