安卓应用程序的开发语言是java,但是由于java层的代码很容易被反编译,而反编译c/c++程序的难度比较大,所以现在很多安卓应用程序的核心部分都使用NDK进行开发。关于NDK的开发知识点,请看这篇博客:Android之NDK开发。

关于NDK环境搭建的知识点,请看这篇博客:Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)

使用NDK开发能够编译c/c++程序,最终生成so文件。而so文件是一个二进制文件,我们是无法直接分析so文件的,所以这里需要用到一个反编译工具IDA Pro。IDA Pro能够对so文件进行反汇编,从而将二进制代码转化为汇编语言,利用IDA Pro神奇的F5功能还能将汇编语言反编译成c/c++程序。这里使用的IDA Pro的版本为6.5版本。下面就介绍一下如何利用IDA Pro静态分析so文件的步骤:

(0) 打开IDA Pro,将libTestJniSo.so直接拖入到IDA Pro中,在弹出的”load a new file”窗口中,

选择”ELF for ARM(Shared object)[elf.ldw]”选项,然后再点击ok按钮。如图1所示:

等待一段时间后,我们就能看到反汇编libTestJniSo.so文件所得到的汇编代码了。

(1) 这里我们主要介绍几个主要窗口,其中IDA View-A窗口显示汇编代码;Hex View-A窗口显示机器码(16进制格式);Function window窗口中保存着各个函数的名字,找到对应函数名字,再双击即可定位到对应函数的汇编代码。

例如我们想要查看Java_com_example_testjniso_MainActivity_helloFromJni函数的汇编代码,

只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函数再双击即可。如图2所示:

如果想要查看某条指令的16进制代码,只需要单击该指令,再切换到Hex View-A窗口即可。
    (2)如果IDA Pro带有F5插件,那么我们可以按键盘上的F5,就可以将汇编代码转换为C代码。例如我们想要查看forTest0函数的C代码,我们只需要定位到forTest0函数的汇编代码后,再按F5就会生成一个Pseudocode窗口,该窗口就会显示forTest0函数的C代码,如图3所示:

(3)我们一般是在Text View模式中查看汇编代码,这样很难看出程序的设计流程。另外IDA Pro还提供了一个Graph View,能够帮助我们更好地查看代码的设计流程。只需要在对应的函数处右击再点击”Graph View”即可切换到Graph View模式,forTest0函数的Graph View如图4所示:

等待一段时间后,我们就能看到反汇编libTestJniSo.so文件所得到的汇编代码了。

(1) 这里我们主要介绍几个主要窗口,其中IDA View-A窗口显示汇编代码;Hex View-A窗口显示机器码(16进制格式);Function window窗口中保存着各个函数的名字,找到对应函数名字,再双击即可定位到对应函数的汇编代码。

例如我们想要查看Java_com_example_testjniso_MainActivity_helloFromJni函数的汇编代码,

只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函数再双击即可。如图2所示:

如果想要查看某条指令的16进制代码,只需要单击该指令,再切换到Hex View-A窗口即可。
    (2)如果IDA Pro带有F5插件,那么我们可以按键盘上的F5,就可以将汇编代码转换为C代码。例如我们想要查看forTest0函数的C代码,我们只需要定位到forTest0函数的汇编代码后,再按F5就会生成一个Pseudocode窗口,该窗口就会显示forTest0函数的C代码,如图3所示:

从图4可以看出,BLE loc_E42这条语句后面跟了两个箭头,其中绿色箭头表示当 BLE loc_E42 条件成立后所跳转到的地方,红色箭头表示当条件不成立后所跳转到的地方。如果想要切换到Text View模式,则只需在对应函数处右击再点击“Text View”即可。

本文简单介绍了如何通过IDA Pro静态分析so文件,从而查看对应的汇编代码。另外需要注意的是IDA Pro只能查看汇编代码,不能修改汇编指令对应的机器码。如果想要修改so文件,需要使用UltraEdit等二进制编辑软件。逆向分析so文件,需要熟练掌握ARM汇编语言。这里有一篇介绍ARM汇编语言的博客ARM汇编编程基础(一) -- ARM CPU寄存器,有兴趣的同学可以看看。
       本文资源下载地址:安卓逆向学习笔记(3)

等待一段时间后,我们就能看到反汇编libTestJniSo.so文件所得到的汇编代码了。

(1) 这里我们主要介绍几个主要窗口,其中IDA View-A窗口显示汇编代码;Hex View-A窗口显示机器码(16进制格式);Function window窗口中保存着各个函数的名字,找到对应函数名字,再双击即可定位到对应函数的汇编代码。

例如我们想要查看Java_com_example_testjniso_MainActivity_helloFromJni函数的汇编代码,

只需在Function window窗口中找到Java_com_example_testjniso_MainActivity_helloFromJni函数再双击即可。如图2所示:

       如果想要查看某条指令的16进制代码,只需要单击该指令,再切换到Hex View-A窗口即可。
    (2)如果IDA Pro带有F5插件,那么我们可以按键盘上的F5,就可以将汇编代码转换为C代码。例如我们想要查看forTest0函数的C代码,我们只需要定位到forTest0函数的汇编代码后,再按F5就会生成一个Pseudocode窗口,该窗口就会显示forTest0函数的C代码,如图3所示:

Android之使用IDA Pro静态分析so文件相关推荐

  1. [免费专栏] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  2. Android逆向笔记-IDA Pro动态调试Android程序(真机)

    这里的安卓版本是: Android 5.1.1(Lollipop, API 22) LGE Google Nexus 5 arm 使用的IDA为:IDA Pro 6.8 将android_server ...

  3. IDA pro与x64dbg地址对齐

    在使用IDA pro静态分析32位和64位程序时候,起始地址都是标准的从00400000.0000000140000000开始,这种基地址也是标准的地址. 然而在使用x64dbg的动态调试的时候,它的 ...

  4. [系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  5. x64dbg和IDA pro 配置PDB 符号文件symbols

    PDB 作用 PDB(Program Debugging Database)就是在生成EXE 和 DLL 文件的过程中生成的这个文件,可以帮助进行调试. 为什么x64dbg 没有将PDB 文件集成到软 ...

  6. 路由器逆向分析------在Linux上安装IDA Pro

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69665905 01.在Linux系统上安装Linux版本的IDA Pro Linu ...

  7. IDA Pro动态调试Android so文件

    网上的教程坑太多,记录一下 使用apktool或者Android Killer反编译apk,在androidmanifest.xml添加以下代码将程序设置为可调试模式 <application ...

  8. 安卓逆向_16 --- ARM 静态分析( 使用 IDA Pro 分析 ARM 汇编【java_ 和 JNI_OnLoad】 )

    菜鸟总结 so 分析,arm 汇编,IDA 静态分析:https://www.52pojie.cn/thread-695063-1-1.html JNI 静态注册 so 和 IDA 导入的 JNI.h ...

  9. 使用IDA Pro动态调试SO文件

    (1)在IDA的安装路径中找到android_server文件. (2)将android_server拷贝到手机的/data/local/tmp目录下面. (3) 将手机插上电脑,打开命令提示符,  ...

最新文章

  1. 边缘加速创新和AI应用,Xilinx推出Kria自适应系统模块产品组合
  2. 迪米特法则 java_java设计模式--迪米特法则
  3. sql和泛型方法返回泛型_基于泛型编程的序列化实现方法
  4. phaiapi数据库重写类
  5. 如何学习oracle
  6. .net core 调用c dll_工具:搭建Camp;C,一睹模样
  7. 微信端上传图片方式1
  8. 无法激活安全认证服务
  9. pandas apply()函数传参,与解决TypeError: xxxx() takes 2 positional arguments but 3 were given报错
  10. 计算机系统-x86架构下的寄存器与寻址
  11. java服务器代码_简单java服务器
  12. Python基础篇:Python 程序流程控制,让你的代码有理有据
  13. 【JavaScript应用篇】--实现文字的特效
  14. 100%概率与任意好友获取QQ幸运字符的方法
  15. ctfshow-菜狗杯-抽老婆
  16. mac 怎么抓取 iphone 手机 日志
  17. 【PDF】《操盘手》
  18. 什么是restful?怎样用通俗的语言解释restful?
  19. 联合线程(案例顾客买蛋糕 :使用join()方法)
  20. dns服务器经赏要修复,十要诀帮你修复DNS域名解析服务故障

热门文章

  1. ABP vnext模块化架构的最佳实践的实现
  2. .NET Core中间件与依赖注入的一些思考
  3. 微服务框架Demo.MicroServer运行手册
  4. C#中你想象的Task,很简单?
  5. 怎样实现WPF Prism Module的国际化和本地化?
  6. 【实战 Ids4】║ 认证中心之内部加权
  7. .NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记...
  8. 如何编写高性能的C#代码(二)
  9. 微软Cloud+AI本地化社区贡献指南
  10. OIDC在 ASP.NET Core中的应用