前言

好久没有写博客了,最近的精力全放在逆向上面。目前也只是略懂皮毛。

android java层的逆向比较简单,主要就是脱壳 、反编译源码,通过xposed进行hook。

接下来介绍一下,如何去调试hook native层的源码,也就是hook so文件。

应用环境准备

首先,为了方便学习,一上来就hook第三方app难度极大,因此我们自己来创建一个native的项目,自己来hook自己的项目作为学习的练手点。

创建默认的native application

打开as,选择File -> new project -> naive c   创建包含c 的原生工程。

默认的native工程,帮我们实现了stringFromJNI方法,那我们就来探索如何hook这个stringFromJNI,并修改他的值。

修改stringFromJNI方法,便于调试

as默认实现的stringFromJNI只有在Activity onCreate的时候调用,为了便于调试,我们增加一个点击事件,每次点击重新调用,并且返回一个随机的值。

java代码增加如下方法:

	binding.sampleText.setOnClickListener {
		Log.e("MainActivity", "stringFromJNI")
		binding.sampleText.text = stringFromJNI()
	}

修改native-lib.cpp代码:

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

using namespace std;

int max1(int num1, int num2);
#define random(x) rand()%(x)

extern "C" JNIEXPORT jstring JNICALL
Java_com_noober_naticeapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    int result = max1(random(100), random(100));
    string hello = "Hello from C  ";
    string hello2 = hello.append(to_string(result));
    return env->NewStringUTF(hello2.c_str());
}


int max1(int num1, int num2)
{
    // 局部变量声明
    int result;

    if (num1 > num2)
        result = num1;
    else
        result = num2;

    return result;
}

修改的代码很简单,相信不会 c 的同学也看得懂,就是随机输入两个数,取其中小的那一位拼接在“Hello from C ”后面,并返回。主要目的是让我们每次点击的时候,返回内容可以动态。

修改androidManifest文件

在application中增加下面两行代码:

    android:extractNativeLibs="true"
    android:debuggable="true"
    

android:debuggable: 让我们可以对apk进行调试,如果是第三方已经打包好了app,我们需要对其manifest文件进行修改,增加这行代码,然后进行重打包,否则无法进行so的调试。

android:extractNativeLibs: 很多人在进行调试的时候发现ida pro一切正常,但是却一直没有加载我们的libnative
-lib.so, 是因为缺少这行代码。如果不加,可能会使so直接自身的base.apk进行加载,导致ida pro无法识别。

修改CMakeLists.txt

在cmakelists中增加下面代码。so文件生成路径,这样编译之后就可以在main-cpp-jniLibs目录下找到生产的so文件。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/jniLibs/${ANDROID_ABI})

编译运行,获取so

上述工作做好之后,直接编译运行,同时会生成4个so文件,我们取手机运行时对应使用的那个so进行hook。
我这边使用的是arm64-v8a目录下的libnative-lib.so。

hook环境准备

  • 系统:windows 10 64位
  • 工具ida pro 7.5
  • java8环境
  • android sdk tools和adb工具
  • arm64-v8a目录下的libnative-lib.so
  • android 真机

使用ida pro进行hook

adb与手机的准备

1、首先找到ida pro的dbgsrv文件夹,里面有很多server文件

64代表的含义是64位,否则就是32位,我们根据我们需要调试的so的指令集进行选择。因为我这边调试的是arm64-v8a,这里我们就选择android_server64的文件。连接真机后,打开cmd,输入以下指令:

adb push "\\Mac\Home\Desktop\IDA PRO 7.5 (x86, x64, ARM, ARM64)\dbgsrv\android_server64"  /data/local/tmp

2、如果是真机,则需要输入su,模拟器不需要

 #真机
 su

3、修改权限

 chmod 777 /data/local/tmp/android_server64

4、运行

 /data/local/tmp/android_server64

5、新打开一个cmd,在本地执行adb 做端口转发

 adb forward tcp:23946 tcp:23946

ida pro的工作准备

1、打开ida pro,因为我们的so是64位的,所以打开ida64.exe。点击new,选择libnative-lib.so。

2、选择debugger-select debugger

3、选择Remote ARM Linux/Android debugger

4、点击debugger-Debugger options

勾选Suspend on process entry point ,也就是在断点处进行挂起暂停

5、点击debugger-Process options

填写hostname为localhost

6、找到exports标签,ctrl f,搜索java关键字,找到我们要hook的函数。

7、双击打开,按F5,进行反汇编操作。这样就可以看到反汇编之后的c 代码了。然后我们随便加上断点进行调试。

8、执行adb命令,进入调试状态,也就是打开我们要调试的app的启动activity,我这边如下:

 adb shell am start -D -n com.noober.naticeapplication/com.noober.naticeapplication.MainActivity

9、点击debugger-Attach to process

选择我们需要调试的进程。

10、adb 执行如下命令,关联运行的so与本地要调试的so。

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

11、此时ida卡在libc.so的位置,点击继续执行,弹出如下界面,关联so到本地,选择same。如果没有弹出则需要通过快捷键ctrl s, 打开所有已经加载的so,找到我们的libnative-lib.so

12、此时就会自动进入断点。

使用ida pro进行调试

ida pro 常用调试快捷键

  • F2下断点
  • F7单步步入
  • F8单步步过
  • F9执行到下个断点
  • G调到函数地址
  • Debugger-debugger windows-locals 查看变量

进行调试

简单分析反汇编代码,我们发现返回值是v5,通过f8,执行到return的上一行。打开locals, 获取所有变量的值。

复制bytes的地址0x7FFE2CDEB9LL,切换到代码界面,输入快捷键g,输入地址跳转。这样我们便从内存中得到了数据结果,可以看出本次返回的值就是"Hello from c 89"

当然我们也可以在locals中直接修改值,这样就达到了我们hook so动态修改数据的目的。

结束

以上就是所有文章内容,主要是为了给没有接触过so调试的同学学习,以及自己记录。关于如何去进一步so hook,会在后面的研究后继续分享。

到此这篇关于android so库逆向调试的文章就介绍到这了,更多相关android so库逆向调试内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

非常详细的android so库逆向调试教程的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部