引言
本文是老本行系列,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进行开发呢?
- 代码的保护
- 易于重用现有成熟的开源库(OpenCV、OpenGL等)
- 提高性能
- 便于移植复用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
!
打开后就会进入到IDA pro的主界面,界面中间显示的是汇编文件的具体信息(用户license、so源文件信息等),左边部分展示的是so文件反汇编生成的汇编方法名,上边部分展示汇编文件按照数据类型的分类情况。IDA pro还提供了6种视图,来帮助用户更好地分析so文件,如下图所示。
由于JNI函数都是“Java + 包名”开始的,我们可以在方法名显示部分左击并输入“Java”就会找到so文件里的JNI函数,如下图所示。
双击该方法就可以看到“IDA View”,即JNI函数的汇编语言,如果对汇编语言不熟悉,可以按“F5”使用IDA pro提供的插件,将该汇编语言转换为Pseudocode,即类C中间语言的格式。如下图所示。
这样就完成了so文件的反汇编,可以看出,NDK对代码的保护是有效果的,反汇编后的攻击成本比Java高了不少。
尝试使用IDA pro修改so文件
接下来,可以尝试使用IDA pro修改so文件的内容,我们希望将so文件JNI函数定义的字符串内容进行改动,我们可以先找IamSoSecurity1514
的地址。双击Pseudocode View中的IamSoSecurity1514
,就会转换到IDA View,可以看到IamSoSecurity1514
所在地址为“000165E7”,如下图所示。
选中“000165E7”地址,再转换到Hex View-A,即切换到16进制的视图。发现该地址上的16进制值如下图所示。提供ASCII码与16进制对照表,可以对照一下发现,真是IamSoSecurity1514
!
选中该地址上的值,点击鼠标右键,选择“Edit”,将So
改成No
表示我们反汇编成功的喜悦吧,So
是53 6F,No
是4E 6F。再次点击“Apply Changes”保存变化,如下图所示。
总结
很可惜的告诉大家,这种方式的修改之后并不会更新原始程序文件,即不会生成有效的so文件,修改的只是IDA pro中的项目文件。所以IDA pro中只适合做一些验证性的修改,确保正确后再使用其他工具修改原始程序文件。可以使用UltraEdit(www.ultraedit.com/)寻找到“000165E7”,进行上述修改保存,替换原有so文件。
so文件提高了代码的安全性。 IDA pro 反汇编需要学习成本。 IDA pro只能做一些验证性的修改。
参考文献
Android安全技术揭秘与防范
今天的文章SO文件反汇编实践分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18739.html