IDA 6.8 使用水文-1

来源:互联网 发布:小电影下载软件 编辑:程序博客网 时间:2024/06/04 18:02

项目里用的so里一直打印日志,想去掉,但是没有源码,于是开始此文。

对ARM指令一无所知的我要修改一个so文件,有点搞笑。

首先用IDA(关于IDA的下载,可以去看雪论坛下载)打开这个so文件,已经知道的是:加密和解密的时候会打印日志。所以先找到加密方法:

Java_com_view_askey_api_ASKeyWrapper_NativeEncryptData

加密方法
然后在IDA中的IDA View-A窗口看一下这个方法的部分截图,如下:
IDA View-A中方法截图
途中看到了有一个函数是printBytes,应该就是打印日志的那个函数了。所以现在我们的问题就是让这个函数不要输出日志。双击printBytes跳转到此函数处,如下图:
printBytes函数的指令
从图中可以看出printBytes函数最终是通过指令:
0000248A BLX __android_log_print 来输出日志的。通过F5功能看一下这个函数里面都做什么了吧。用鼠标选中printBytes然后按F5键(注意这个版本的IDA 64位没有F5功能,所以要用32位程序打开so文件),这个时候IDA会自动反汇编此函数,来看一下它反汇编之后的结果:
printBytes函数反汇编的结果
从代码看起来除了调用Android的输出日志函数也没做别的事情嘛,那么简单的做法是把这个函数的中调用输入日志的指令(BLX __android_log_print)去掉(不会,知道的大佬请不吝赐教)或者改掉(瞎改改试呗),先改成和上一条指令一样(相当于重复做了一遍上一条指令干的事情,这种做法应该是可行的),这里遇到个小问题,直接在IDA 的Hex View-1窗口中修改二进制字节数数后不知道怎么保存修改,所以用了另外一个编辑二进制的工具(wxMEdit)去修改0000248A处的二进制值,先修改成和00002488处相同的值,看一下修改之前的二进制信息截图:
这里写图片描述
双击修改 FF F7 为 06 20,然后保存文件。要知道能不能正常运行还是得把项目中老的so文件用新修改的替换掉之后运行的验证一下才行。OK,下面去验证。第一次修改允许验证结果:
这里写图片描述
啊,显示不是预期效果,调用此函数(被修改过的)直接崩溃了。那么为什么呢?这里暂时不去深究了(没能力深究才是重点),指令执行的前后都是有关联的,简单的改一个指令可能导致其他指令的执行有异常,那先看看printBytes函数的全部汇编代码,如图:
printBytes函数汇编
由图可以看出此函数的第一条汇编指令是PUSH,最后一条是POP,中间一大堆指令在一起就做一件事情:打印日志。这里不去研究和分析没条指令的含义,我们将第二条指令之后到POP之间的指令都改成和第二条指令相同,修改方法和前面一样,同样是打开wxMEdit修改,修改之后的汇编代码如下:
printBytes函数的指令
那再次去验证一下行不行,幸运的是这次是可以的,而且也达到了目的:去除打印日志的功能。当然使用的方法简单粗暴了点,当然是有更优雅的方式去做这件事情,但是目前对于arm指令完全不懂,要去挨个分析指令还有点困难,这里只是尝试换个思路解决问题,顺便学习一下IDA的用法,仅此而已。

一个ARM指令学习入门的blog,未经博主同意擅自引用了一下,如果有侵权嫌疑,我会立马删除。
参考手册

原创粉丝点击