/   今日科技快讯   /

2021年上半年,中国移动实现营收4436亿元,同比增长13.8%;股东应占利润为人民币591亿元,增长6%。

中国电信营收2192亿元,同比增长13.1%;净利润为177亿元,同比增长27.2%,剔除出售附属公司的一次性税后收益后,同比增长17.0%。

中国联通上半年营收1641.7亿元,去年同期1503.97亿元;同比增9.2%;净利润91.7亿元,同比增长21.1%

/   作者简介   /

又到了激动的周五了,祝大家都能有个愉快的周末!

本篇文章来自JavaNoober的投稿,文章主要分享了so库的逆向调试,相信会对大家有所帮助!

JavaNoober的博客地址:

https://juejin.cn/user/1028798611994030/posts

/   前言   /

好久没有写博客了,最近的精力全放在逆向上面。目前也只是略懂皮毛。
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;elseresult = 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 查看变量

进行调试

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

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

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

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

推荐阅读:

我的新书,《第一行代码 第3版》已出版!

PermissionX 1.5发布,支持申请Android特殊权限啦

用Compose来搞个水墨画效果吧

欢迎关注我的公众号

学习技术或投稿

长按上图,识别图中二维码即可关注

超详细的Android so库的逆向调试相关推荐

  1. 超详细的Android百度地图开发:在APP上定位并显示出来

    超详细的Android百度地图开发:在APP上定位并显示出来 一 写在前面 二 注册百度开发者账户.申请API KEY 三.代码实现 四.问题 五.总结 一 写在前面 由于项目所需,我需要在手机APP ...

  2. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  3. (转)超详细的Android系统50大必备秘籍分享

    虽然Android操作系统的用户界面和交互经过两年的发展已经非常人性化,但是有些操作和使用还是让很多刚接触的菜鸟用户感到复杂和困惑.我们整理出Android系统的50大必备秘籍供用户参考,适合各种阶段 ...

  4. 超详细的Android系统50大必备秘籍分享

    虽然Android操作系统的用户界面和交互经过两年的发展已经非常人性化,但是有些操作和使用还是让很多刚接触的菜鸟用户感到复杂和困惑.我们整理出Android系统的50大必备秘籍供用户参考,适合各种阶段 ...

  5. 2021年超详细的-Android超神学习路线总结--纯干货分享(字节,阿里,腾讯大牛联合打造)

    前言 2021年秋招没有找到满意工作的童鞋,考研结果不理想的童鞋,留学生回国的童鞋们,都开始准备2021年的春招了,如果想从事Android开发工作,可以参考本文. 本文整理了Android开发的学习 ...

  6. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug

    POI检索, 根据地址输入提示检索 Sug 参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/sug ...

  7. android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...

    实现起始点输入的路线规划 要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个Activity中,也可以新建一个Activity,来实现地址的输入,然后通过页面之间的跳转来传 ...

  8. 超详细 某代刷网站js逆向

    1.背景及简单分析 插播恰饭广告:可以加我qq 2967615343随便打赏点,我把js代码和post服务器可用脚本,一起发你 这几天想用Django写一个接口,但不知道写啥,写每天天气推送太俗,烂大 ...

  9. 最新超详细C++经典Boost库介绍

    Boost库 Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发.维护.Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能. 目录 Boost库 ...

最新文章

  1. [LeetCode] NO.383 Ransom Note
  2. Oracle 存储过程异常处理
  3. 基于openFrameworks 三维重建 2018.10.25
  4. silverlight中递归构造无限级树treeview+checkbox
  5. Python Django 配置URL的方式(url传参方式)
  6. Linux的java服务配置步骤
  7. 平衡树-Treap基础内容
  8. 在SSH框架中,如何得到POST请求的URL和参数列表
  9. SSH框架(Struts+Spring+Hibernate)
  10. 简单易懂的snmpd.conf配置文件说明
  11. sftp连不上服务器 vscode_vscode+sftp 开发模式环境的同步
  12. vb从入门到精通_干货|让你 ArcGIS Engine从入门到精通的22个视频
  13. 滚动字幕的源代码(可作滚动公告)
  14. Weka 3.8.6安装与Weka 3.8.6功能介绍
  15. 使用jxls模板解析导出数据时添加单元格样式
  16. 阿里云服务器添加CDN
  17. 微信html5线上卡券,16.7.1HTML5网页领取卡券
  18. 随感10-Transecndence超验骇客
  19. 不用PS,也可以轻松组合漂亮的图片—135编辑器拼图教程
  20. 国耀明医院互联网医院:儿童医保门诊不报销???你错啦!

热门文章

  1. 通信专业考研就业专栏
  2. 腾讯滑块vData_VMP分析
  3. 关于开发人员学习的网站【收藏】
  4. 自动驾驶车辆控制测评标准
  5. Capital One数据泄露影响1.06亿人,嫌疑人已被捕
  6. 给Excel表格中某一列都添加指定内容
  7. Android Volley核心源码解析
  8. c语言输入10个评委分数,vb输入10个评委给的分数,去掉最高分和最低分
  9. mysql只能导出65535条_导出Excel超过65535条限制解决方案
  10. emu8086不支持的x86语法