标签:密码 遇到 项目 过程 XML sem code 代码 create
什么是 NDK 开发?
目前的Android开发,在很多公司不再是纯粹的Java层开发,更多的会与C++结合,把一些重要的方和行为以及一些私密性质的东西放在C++中,一般遇到多人开发的时候,通常的做法是在Android项目中放入C++的动态库(.so文件)
定义:Native Development Kit,是Android的一种开发工具包
作用:快速开发C
、 C++
的动态库,并自动将so
和应用一起打包成 APK
即可通过 NDK
在 Android
中 使用 JNI
与本地代码(如C、C++)交互
什么是JNI?
JIN 是 Java Native Interface 的缩写,用 Java 调用 so 库就叫 JIN
作用:通过JNI能使java调用c++
// 在 Java 中申明一个 Native 方法
public static native String securityCheck(Context context, String str);
// 用 System.loadLibrary() 加载 so 库 全称是 libnative-lib.so
static {
System.loadLibrary("native-lib");
}
1、 .so 文件里对应的 secutiryCheck 函数的名称是:
Java_com_yaotong_crackme_MainActivity_securityCheck()
Java_类名_方法名()
2、 .so文件里对应的函数名称不一致:
这种情况叫着:手动注册 native 方法
函数对应的名称是在 JNI_ONLoad() 函数里注册
System.loadLibrary() 加载 so文件流程
先读取 so 文件的.init_array段
再执行 JNI_OnLoad 函数
JNI_ONLoad 是 .so 文件的初始函数
然后调用具体的 native 方法
简介
交互式反汇编器专业版(Interactive Disassembler Professional),简称为IDA,由Hex-Rays公司推广和销售。就其本质而言,IDA是一种递归下降反汇编器,但效率相比普通的反汇编器要高得多,原因如下
打开 IDA 后点击 NEW,选择一个 so 文件打开
静态调试技巧:
面板左侧函数列表可以查看每个函数的偏移量(相较于.so文件头的偏移量)
F5键(windows fn+F5) 把汇编代码转成C代码
shift+F12 查看 so文件中所有常量字符串的值 有的密码之类的可能就在这里面
ctrl + s 查看 so文件段信息
JNI 函数方法名还原 选中 v3 按 y 键 作用(类型还原)
v3 + 676 前面是一个指针 比如 *(_DWORD *)v3 + 676 表示 v3 是 JNIEnv * 类型
形如 *(_DWORD *)vX + YYY 皆是
可选中 v3 按 y 键进行类型替换,替换为 JNIEnv *
找到 JNI_OnLoad 函数
按 F5 识别成函数
配置:
把本地文件推送进手机目录
adgsrv目录下,我这里是 nex6p,选择 32 位
adb push android_x86_server(cpu型号要对应 模拟器是x86) /data/local/tmp/
进入手机shell
adb shell
真机要使用 su 命令 切换到 root 用户,模拟器不用
进入手机tmp目录
cd /data/local/tmp/
修改权限
chmod 777 android_server
运行
./android_server
在本地执行adb 做端口转发
adb forward tcp:23946 tcp:23946
如何在 JNI_OnLoad 函数打断点
so文件在加载阶段会执行JNI_ONLoad,此后不再执行,要在so文件加载阶段才能给JNI_OnLoad打断点
1、修改APP AndroidMenifest.xml文件, APP加上可调试权限,android:debuggable="true",重新打包 APP,签名,安装 (加在Application处)
2、检查flags中是否有应许debug项 adb shell dumpsys package com.yaotong.crackme
3、以调试模式启动应用
adb forward tcp:23946 tcp:23946 # 端口转发
adb shell am start -D -n 包名/类名
adb shell am start -D -n com.yaotong.crackme/.MainActivity
android:name
4、DebuggerOptions里勾选 Suspend on thread start/exit Suspend on library load/unload JNI_OnLoad函数是lib刚加载时就会执行,必须要在lib载入时就让程序停下来,才能调试JNI_OnLoad
打开 IDA 选择 go
需要用到 adbd root,记住端口转发
5、点击 IDA 左上角运行按钮
6、在设备里查看 APP 的进程号
可以用 ps 命令查看
要 adb shell 先进入设备运行,过滤出该应用的信息
ps | grep crack
>>> u0_a80 11685 4539 963992 58232 SyS_epoll_ 0000000000 S com.yaotong.crackme
7、使用 JDB 命令让 APP 恢复运行
adb forward tcp:8700 jdwp:16000(APP的PID)
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
8、在so文件被加载时,IDA会停止住,使用ctrl+s 查看目标so文件是否加载
若加载点选目标 so 文件,
计算 JNI_OnLoad(静态打开 libso 文件,找到相对地址) 的绝对地址
然后使用科学计算器 F3F81000 + 1B9C = F3F82B9C 就是 JNI_OnLoad 在内存的位置
按G键跳转到JNI_OnLoad处,设置断点
恢复APP 执行
开始调试按 F8 下一步(注意,有道词典开着的话热键会被占用,需要关掉)
找到反调试代码处,pthread_create()
如何找到反调试代码处?(关键地方,可按 f5,把汇编代码转成C语言辅助) 反复按F8单步执行,程序退出处(前面),既为反调试处
如何让反调试代码不执行?
记住反调试处的汇编指令,同时以静态方式再打开一个IDA(也叫双开IDA 以动态和静态方式各打开一 个IDA )
让该指令变为空指令,既 NOP,NOP指令的16进制是 00 00 00 00
把鼠标放到 R7 上面,然后切换到 Hex View-1窗口,就会显示指令的16进制
然后用 UE 编辑器打开so文件,找到位置,改成 00 00 00 00
再然后需要重新打包签名
进行调试
标签:密码 遇到 项目 过程 XML sem code 代码 create
原文地址:https://www.cnblogs.com/kai-/p/13714392.html