码迷,mamicode.com
首页 > 其他好文 > 详细

IDA 动静态调试

时间:2020-09-24 20:47:41      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:密码   遇到   项目   过程   XML   sem   code   代码   create   

NDK 开发

什么是 NDK 开发?

目前的Android开发,在很多公司不再是纯粹的Java层开发,更多的会与C++结合,把一些重要的方和行为以及一些私密性质的东西放在C++中,一般遇到多人开发的时候,通常的做法是在Android项目中放入C++的动态库(.so文件)

定义:Native Development Kit,是Android的一种开发工具包

作用:快速开发CC++的动态库,并自动将so和应用一起打包成 APK
即可通过 NDKAndroid中 使用 JNI与本地代码(如C、C++)交互


Java 如何调用 so库里的方法/函数

什么是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 方法


IDA 静态调试

简介

交互式反汇编器专业版(Interactive Disassembler Professional),简称为IDA,由Hex-Rays公司推广和销售。就其本质而言,IDA是一种递归下降反汇编器,但效率相比普通的反汇编器要高得多,原因如下

  • IDA应用大量启发式代码来识别递归下降过程中遗漏的代码。IDA在区分数据与代码的同时还会设法确定数据的类型。IDA的目标之一是呈现尽可能接近源代码的代码。
  • 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 识别成函数


IDA 动态调试

配置:

把本地文件推送进手机目录

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

再然后需要重新打包签名

进行调试

IDA 动静态调试

标签:密码   遇到   项目   过程   XML   sem   code   代码   create   

原文地址:https://www.cnblogs.com/kai-/p/13714392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!