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窗口看一下这个方法的部分截图,如下:
途中看到了有一个函数是printBytes,应该就是打印日志的那个函数了。所以现在我们的问题就是让这个函数不要输出日志。双击printBytes跳转到此函数处,如下图:
从图中可以看出printBytes函数最终是通过指令:
0000248A BLX __android_log_print 来输出日志的。通过F5功能看一下这个函数里面都做什么了吧。用鼠标选中printBytes然后按F5键(注意这个版本的IDA 64位没有F5功能,所以要用32位程序打开so文件),这个时候IDA会自动反汇编此函数,来看一下它反汇编之后的结果:
从代码看起来除了调用Android的输出日志函数也没做别的事情嘛,那么简单的做法是把这个函数的中调用输入日志的指令(BLX __android_log_print)去掉(不会,知道的大佬请不吝赐教)或者改掉(瞎改改试呗),先改成和上一条指令一样(相当于重复做了一遍上一条指令干的事情,这种做法应该是可行的),这里遇到个小问题,直接在IDA 的Hex View-1窗口中修改二进制字节数数后不知道怎么保存修改,所以用了另外一个编辑二进制的工具(wxMEdit)去修改0000248A处的二进制值,先修改成和00002488处相同的值,看一下修改之前的二进制信息截图:
双击修改 FF F7 为 06 20,然后保存文件。要知道能不能正常运行还是得把项目中老的so文件用新修改的替换掉之后运行的验证一下才行。OK,下面去验证。第一次修改允许验证结果:
啊,显示不是预期效果,调用此函数(被修改过的)直接崩溃了。那么为什么呢?这里暂时不去深究了(没能力深究才是重点),指令执行的前后都是有关联的,简单的改一个指令可能导致其他指令的执行有异常,那先看看printBytes函数的全部汇编代码,如图:
由图可以看出此函数的第一条汇编指令是PUSH,最后一条是POP,中间一大堆指令在一起就做一件事情:打印日志。这里不去研究和分析没条指令的含义,我们将第二条指令之后到POP之间的指令都改成和第二条指令相同,修改方法和前面一样,同样是打开wxMEdit修改,修改之后的汇编代码如下:
那再次去验证一下行不行,幸运的是这次是可以的,而且也达到了目的:去除打印日志的功能。当然使用的方法简单粗暴了点,当然是有更优雅的方式去做这件事情,但是目前对于arm指令完全不懂,要去挨个分析指令还有点困难,这里只是尝试换个思路解决问题,顺便学习一下IDA的用法,仅此而已。
一个ARM指令学习入门的blog,未经博主同意擅自引用了一下,如果有侵权嫌疑,我会立马删除。
参考手册
- IDA 6.8 使用水文-1
- 水文
- 水文
- 水文
- ida使用
- [水文]生成模型1-PixelRNN
- 工具使用 - IDA使用
- IDA使用 gdb使用
- IDA使用初探-1.启动IDA
- IDA使用经验
- IDA PRO使用
- IDA 使用小技巧
- IDA个人使用笔记
- ida 使用 问题总结
- IDA 使用笔记
- 学习 IDA 使用
- IDA 使用技巧
- IDA Pro的使用(1)反汇编
- windows上安装tensorflow遇到的关键坑
- 字符串转码String.getBytes(String decode)和new String()
- Milking Cows(线段区间问题)
- 第二章 SQL参考命令-CHECKPOINT
- Linux守护进程的编写与使用方法
- IDA 6.8 使用水文-1
- php根据日期获取到时星期几
- 使用C# EmguCV来撷取D-Link DCS-930 IP Cam的影像范例
- HDU
- shell脚本和浅谈C
- 源文件字符集,编译器内部字符集,执行字符集,控制台乱码问题,Qt中文问题
- 作业.1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
- Swift UIMenuController的简单运用和简单自定义
- Codeforces Round #369 (Div. 2)