SO文件反汇编实践

SO文件反汇编实践本文是老本行系列,Android相关的文章(以前的藏文),以后不定期地会发出老本行系列。 IDA pro全名为交互式反汇编器专业版(Interactive Disassembler Professional),简称为IDA。就本质而言,IDA是一种递归下降反汇编器。为了克服递归…

引言

本文是老本行系列,Android相关的文章(以前的藏文),以后不定期地会发出老本行系列。

IDA pro简介

IDA pro全名为交互式反汇编器专业版(Interactive Disassembler Professional),简称为IDA。就本质而言,IDA是一种递归下降反汇编器。为了克服递归下降的缺点,IDA在区分数据与代码的同时,还设法确定这些数据的类型。通过IDA pro对dll、so等文件进行反编译后,用户通常看到的是经过数据类型区分的汇编语言形式的代码。IDA pro还有一个亮点,就是类似C语言的“中间语言”,汇编语言的阅读是需要一些学习成本的,类C的“中间语言”有助于用户更好地查看实现逻辑。

NDK开发流程

The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C++. For certain types of apps, this can help you reuse code libraries written in those languages.

上段是Android官网对NDK的定义,简单明了,就是在开发App的过程中,通过NDK使用C或C++实现一些类库,实现复用。

那么,为什么使用NDK进行开发呢?

  1. 代码的保护
  2. 易于重用现有成熟的开源库(OpenCV、OpenGL等)
  3. 提高性能
  4. 便于移植复用so库

从事Android开发的同学们应该对NDK很熟悉,为了更好地理解SO库是什么,还是提供一张图说明下。

反汇编

反汇编,即把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。因为C/C++、Pascal等高级语言编译后会生成计算机语言,而不像Java的虚拟机指令集。所以,我们只能够对计算机语言进行逆向,即反汇编。

so文件生成

在开始反汇编之前,我们必须要有一个目标,即so文件,生成过程这里不再赘述。

笔者使用的是自己写的demo,代码如下所示。

#include <jni.h>
#include <string>

#define _SOSECURITYSTR IamSoSecurityHONG1543

static const std::string staticSoStr = "IamSoSecurityStatic1547";

std::string soStrParam = "IamSoSecurityField1553";

extern "C" {

    JNIEXPORT jstring JNICALL Java_sosecurity_gj_com_sosecurity_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) {

        std::string soStr = "IamSoSecurity1514";

        soStr += staticSoStr + "_" + soStrParam + "_" + soStr;

        return env->NewStringUTF(soStr.c_str());
    }

}

IDA pro打开so文件

接下来,就是重头戏,使用IDA pro打开这个so文件!!!

打开IDA pro后,弹出选择打开方式界面,如下图所示。so文件选择ELF for ARM选项,点击OK

2.png

打开后就会进入到IDA pro的主界面,界面中间显示的是汇编文件的具体信息(用户license、so源文件信息等),左边部分展示的是so文件反汇编生成的汇编方法名,上边部分展示汇编文件按照数据类型的分类情况。IDA pro还提供了6种视图,来帮助用户更好地分析so文件,如下图所示。

3.png

由于JNI函数都是“Java + 包名”开始的,我们可以在方法名显示部分左击并输入“Java”就会找到so文件里的JNI函数,如下图所示。

4.png

双击该方法就可以看到“IDA View”,即JNI函数的汇编语言,如果对汇编语言不熟悉,可以按“F5”使用IDA pro提供的插件,将该汇编语言转换为Pseudocode,即类C中间语言的格式。如下图所示。

5.png

这样就完成了so文件的反汇编,可以看出,NDK对代码的保护是有效果的,反汇编后的攻击成本比Java高了不少。

尝试使用IDA pro修改so文件

接下来,可以尝试使用IDA pro修改so文件的内容,我们希望将so文件JNI函数定义的字符串内容进行改动,我们可以先找IamSoSecurity1514的地址。双击Pseudocode View中的IamSoSecurity1514,就会转换到IDA View,可以看到IamSoSecurity1514所在地址为“000165E7”,如下图所示。

6.png

选中“000165E7”地址,再转换到Hex View-A,即切换到16进制的视图。发现该地址上的16进制值如下图所示。提供ASCII码与16进制对照表,可以对照一下发现,真是IamSoSecurity1514

7.png

选中该地址上的值,点击鼠标右键,选择“Edit”,将So改成No表示我们反汇编成功的喜悦吧,So是53 6F,No是4E 6F。再次点击“Apply Changes”保存变化,如下图所示。

8.png

总结

很可惜的告诉大家,这种方式的修改之后并不会更新原始程序文件,即不会生成有效的so文件,修改的只是IDA pro中的项目文件。所以IDA pro中只适合做一些验证性的修改,确保正确后再使用其他工具修改原始程序文件。可以使用UltraEdit(www.ultraedit.com/)寻找到“000165E7”,进行上述修改保存,替换原有so文件。

so文件提高了代码的安全性。 IDA pro 反汇编需要学习成本。 IDA pro只能做一些验证性的修改。

参考文献

Android安全技术揭秘与防范

developer.android.google.cn/ndk/

blog.csdn.net/yelangjueqi…

今天的文章SO文件反汇编实践分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18739.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注