Android 逆向分析

您所在的位置:网站首页 apk改为 Android 逆向分析

Android 逆向分析

2024-07-17 09:32:58| 来源: 网络整理| 查看: 265

分析步骤 通用逆向分析步骤 1.了解该模块正向编程相关方法 2.使用apktool解密apk,得到资源、jni模块等文件 3.从apk提取出dex文件,使用dex2jar转换成jar文件,再用java逆向工具得到java源码 dex->jar->java 4.根据特征(字符串、常量、包名类名方法名、manifest文件、布局文件等方式)或调试手段定位到关键代码 5.分析变量含义类型、函数逻辑、模块流程 6.对变量、函数、类进行标注、恢复成高级语言 ->c

Android程序的特点相比在于使用混淆方式打包,将包名、类名、函数名改成不易看懂的字母,从而使生成的apk小很多(android studio提供了release编译方式,使用proguard混淆),因此反编译apk最多的工作在于重构这些名称,这一点和pc上一致,对于android native程序(jni)则和pc上基本一致,不同之处在于常见的是arm汇编。

安卓上APK调试步骤: 1.Apk(debuggable)或系统(ro.debuggable=1)设置为可调试 2.在虚拟机中启动服务端(adbd/android_server) 3.在主机端连接客户端调试器(IDA/jdb/adt),设置断点 安卓上linux程序调试步骤: 1.在虚拟机中启动服务端(gdb_server/linux_server) 2.在主机端连接客户端调试器(IDA/gdb_for_windows),设置断点

对于apk的反编译,由于资源和xml都进行了编码,因此反编译时必然要解析相应的resource.arsc/AndroidManifest.xml等文件,对于做过保护处理的apk通常会在这里做手脚干扰Apktool、dex2jar等反编译工具因此很有必要掌握编译、调试这些工具源码的方法(见“如何编译、调试apktool和dex2jar”)

分析工具 集成IDE:APK改之理、JD-GUI、JEB(1.4破解 2.0)、jadx 解压(apk, jar):WinRar 解析资源:apktool 反编译引擎(jar, class):dex2jar工具集、jd-core(JD-GUI,JD-Eclipse反编译核心)、fernflower(Android Studio反编 、procyon 回编译:aapt、dex2jar工具集 调试器:IDA、jdb、adt等 辅助工具:DDMS 如果是虚拟机可以看到所有进程 APK改之理 整合&提供了全套解压、反编译代码和资源、回编译、签名功能,强大的正则搜索,修改smali字节码等功能 集成ApkTool、Dex2jar、JD-GUI工具 可视化操作,全自动的反编译、回编译、签名Apk 正则表达式搜索资源及源码 JD-GUI

轻量级反编译,反编译jar/class等java字节码文件(能力一般),提供简单的搜索能力 JEB

反编译apk/jar工具(能力较强) 强大的正向、反向索引,一定程度重命名能力,一定搜索能力 支持注释、插件 交互式可视化操作,全自动的反编译 支持重命名 Dex2jar工具集

dex2jar是一个工具包,反编译dex和jar,还提供了一些其它的功能,每个功能使用一个bat批处理或 sh 脚本来包装,只需在Windows 系统中调用 bat文件、在Linux 系统中调用 sh 脚本即可。在bat中调用相应的jar主类完成特定功能,例如d2j-dex2jar.bat中的内容是:@“%~dp0d2j_invoke.bat” com.googlecode.dex2jar.tools.Dex2jarCmd %*。常用的有dex2jar jar2dex dex2smali smali2dex

d2j-apk-sign用来为apk 文件签名。命令格式:d2j-apk-sign xxx.apk 。 d2j-asm-verify 用来验证jar 文件。命令格式:d2j-asm-verify -d xxx.jar。 d2j-dex2jar 用来将dex 文件转换成jar 文件。命令格式:d2j-dex2jar xxx.apk d2j-dex-asmifier 用来验证dex 文件。命令格式:d2j-dex-asmifier xxx.dex。 d2j-dex-dump 用来转存dex 文件的信息。命令格式:d2j-dex-dump xxx.apk out.jar 。 d2j-init-deobf 用来生成反混淆jar 文件时的初始化配置文件。 d2j-jar2dex 用来将jar 文件转换成 dex 文件。命令格式:d2j-jar2dex xxx.apk。 d2j-jar2jasmin 用来将jar 文件转换成jasmin 格式的文件。命令格式:d2j-jar2jasmin xxx.jar d2j-jar-access 用来修改jar 文件中的类、方法以及字段的访问权限。 d2j-jar-remap 用来重命名jar 文件中的包、类、方法以及字段的名称。 d2j-jasmin2jar 用来将jasmin 格式的文件转换成 jar 文件。命令格式:d2j-jasmin2jar dir dex2jar为d2j-dex2jar 的副本。 dex-dump为d2j-dex-dump 的副本 Apktool反编译&打包工具 反编译apk:apktool d file.apk –o path 回编译apk:apktool b path –o file.apk

常见文件格式 Apk

Android package,android安装程序文件,本质上是压缩包,解压得到classes.dex、resources.arsc、AndroidManifest.xml、so文件以及资源文件

Resources.arsc资源描述文件 Classes.dex所有代码编译过得darvik字节码文件,可能会有多个 AndroidManifest.xml 编译过的AndroidManifest.xml文件

使用aapt解析xml

aapt d xmltree 1.apk AndroidManifest.xml N: android=http://schemas.android.com/apk/res/android E: manifest (line=2) A: android:versionCode(0x0101021b)=(type 0x10)0x1 A: android:versionName(0x0101021c)="1.0" (Raw: "1.0") A: package="com.ibotpeaches.issue767" (Raw: "com.ibotpeaches.issue767") A: platformBuildVersionCode=(type 0x10)0x17 (Raw: "23") A: platformBuildVersionName="6.0-2438415" (Raw: "6.0-2438415") E: uses-sdk (line=0) A: android:minSdkVersion(0x0101020c)=(type 0x10)0x16 A: android:targetSdkVersion(0x01010270)=(type 0x10)0x17 E: application (line=3) A: android:theme(0x01010000)=@0x7f090083 A: android:label(0x01010001)=@0x7f060015 A: android:icon(0x01010002)=@0x7f030000 A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff A: android:supportsRtl(0x010103af)=(type 0x12)0xffffffff E: activity (line=4) A: android:theme(0x01010000)=@0x7f090030 A: android:label(0x01010001)=@0x7f060015 A: android:name(0x01010003)="com.ibotpeaches.issue767.MainActivity" (Raw : "com.ibotpeaches.issue767.MainActivity") E: intent-filter (line=5) E: action (line=6) A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "andr oid.intent.action.MAIN") E: category (line=7) A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER") E: meta-data (line=10) A: android:name(0x01010003)="large.int.value" (Raw: "large.int.value") A: android:value(0x01010024)="9999999999999999999999" (Raw: "99999999999 99999999999")

查看xml => aapt d xmltree 1.apk AndroidManifest.xml 查看resource => aapt d resources 1.apk (resource.arsc)

Dex

Dalvik Executable,Dalvik可执行文件,从java class文件转换而来的字节码,Classes.Dex通过dex2jar转换成java字节码(有损),或者dex2smali转换成darvik汇编(无损)——smali字节码,其形式如下 在这里插入图片描述

Jar

Java Archive,java归档文件,可以直接解压得到class文件

Odex

dex转odex:/system/bin/dexopt dexopt-wrapper 1.apk 1.odex

Aar

Android归档文件,压缩包格式,包含

/AndroidManifest.xml (强制) 未编译的 /classes.jar (强制) /res/ (强制) /R.txt (强制) /assets/ (可选) /libs/*.jar (可选) /jni/ /*.so (可选) /proguard.txt (可选) /lint.jar (可选) So

Linux动态链接库文件,包含arm64 arm mips mips64 x86 x86-64几个平台

工具转换图

在这里插入图片描述

Android设备上重要目录 /system/app/1.apk 系统应用 /data/app/1.apk 用户应用 /data/data/[pkgname] 应用数据(so,database,…) /data/dalvik-cache 存放dex Java层 __

常用工具 adb

设备通信、调试工具,常用法:

adb devices 列出当前设备 adb –s d24eb3ab [命令] 指定设备执行命令 adb push 源 目标 非root机器可以设置路径为/data/local/tmp adb pull 源 目标 adb shell 执行终端 adb logcat 查看日志(/system/logcat为服务器) adb jdwp 查看远程jdwp进程 adb forward tcp:主机端口 tcp:远程端口 把主机端口消息转发手机端口(端口对应进程) 用于ida调试 adb forward tcp:主机端口 jdwp:远程进程ID 把主机端口消息转发手机jdwp进程 用于jdb调试 adb install [apkpath] 安装apk adb uninstall [packagename] 卸载apk 注意会彻底清理,删除/data/app下的备份apk adb remount 将/system重新映射为读写,以便进行系统区文件操作 adb root 使adb以root方式启动,便于push/pull/remount aapt

APK资源管理工具,用于增删查改APK中的文件、资源等,对于分析编译后的Resource.arsc, AndroidManifest.xml格式较有价值,通常也可以用winrar对apk/jar进行解压

打印xml树 aapt d xmltree 1.apk AndroidManifest.xml 打印资源 aapt d resources 1.apk 添加文件 aapt a 1.apk AndroidManifest.xml 删除文件 aapt r 1.apk AndroidManifest.xml

am & pm

Android远程命令,am执行调试、运行功能,pm执行安装、卸载功能

启动应用:am start -D -n "b.myapp/b.myapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 启动服务:am startservice -n com.android.music/com.android.music.MediaPlaybackService 强制停止包:am force-stop com.example.administrator.myapplication 强制结束包进程:am kill com.example.administrator.myapplication am kill all 发送广播:adb shell am broadcast -a com.android.test 安装应用:pm install –r 1.apk 卸载应用:pm uninstall packagename 列出所有安装包:pm list package 查看是否以指定名为前缀的包存在:pm list package com.qihoo 禁用应用:pm disable packagename (禁用后,图标消失,对该应用的操作都无效) 有源码调试APK

Android studio

在android studio中可以采用运行调试或进程附加方式调试,支持条件断点、一次断点、对单线程下断,有6种断点: 在这里插入图片描述

Adb wifi

应用市场有很多这种软件,需要Root权限。解决没有USB数据线的情况下的调试

C:\Users\Administrator>adb connect 192.168.0.103:5555 connected to 192.168.0.103:5555 此时可以用adt调试 无源码调试apk

不需要调试的一般过程 :使用反编译工具得到源代码,修改调试标识,修改机器码,最后回编译签名:

反编译apk:apktool d file.apk –o path 回编译apk:apktool b path –o file.apk

使用AndroidStudio和Apktool工具调试

第一步,反编译得到(占行)伪源码:java -jar apktool.jar d -d input.apk -o out,加上-d选项之后反编译出的文件后缀为.java,而不是.smali,每个.java文件立马都伪造成了一个类,语句全都是“a=0;”这一句,smali语句成为注释,做这些都是为了后面欺骗idea、eclipse、android studio这些ide的 第二步,修改资源或者源码(smali),修改AndroidManifest.xml调试标识,反编译以后可以在dex中插入waitfordebugger或者Log.i的smali代码来进行相应的控制 第三步,回编译(-d选项)+签名 回编译:apktool b –d path –o input.apk 签名: java –jar signapk.jar testkey.x509.pem testkey.pk8 input.apk output.apk 第四步,新建android studio工程 ,将反编译得到的smali文件夹中的源文件拷贝到源码目录(欺骗),回编译的apk覆盖目标apk位置 ,删除Edit configuration的Before launch,下断点调试

点评:这种方式只可以用来分析加密很弱的App,前提是apktool可以成功反编译 在这里插入图片描述

使用jdb调试

jdb是一个支持java代码级调试的工具,它是由java jdk提供的,可以设置断点、查看堆栈、计算表达式、动态修改类字节码、调试&跟踪、修改变量值、线程操作,断点包括:(源码)行断点、符号断点、成员变量访问断点。每个java程序(windows/ios/android)都可以用jdwp协议进行调试,Android Studio/Eclipse的调试也是建立在该协议基础之上,下面以实例说明:

第一步,开发demo

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.b.com")); intent.setClassName("com.android.browser","com.android.browser.BrowserActivity"); startActivity(intent); } }); } }

第二步,启动jdb调试

adb shell am start -D -n "b.myapp/b.myapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

在这里插入图片描述第三步,开始调试

查看ddms中该进程端口号 8600 使用jdb调试:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600 下断点:函数断点stop in android.app.Activity.startActivity(android.content.Intent)

行断点 stop at android.app.Activity:123,触发断点后显示堆栈:

main[1] where [1] android.app.Activity.startActivity (Activity.java:3,490) [2] b.myapp.MainActivity$1.onClick (MainActivity.java:21) [3] android.view.View.performClick (View.java:4,084) [4] android.view.View$PerformClick.run (View.java:16,966) [5] android.os.Handler.handleCallback (Handler.java:615) [6] android.os.Handler.dispatchMessage (Handler.java:92) [7] android.os.Looper.loop (Looper.java:137) [8] android.app.ActivityThread.main (ActivityThread.java:4,745) [9] java.lang.reflect.Method.invokeNative (本机方法) 查看参数

main[1] print intent intent = “Intent { act=android.intent.action.VIEW dat=http://www.b.com cmp= com.android.browser/.BrowserActivity }”

设置源码从而进行逐行调试 main[1] use D:\Android\sdk\sources\android-18 //参考设备android版本 main[1] use D:\test\MyApplication\app\src\main\java main[1] list 3,421 * @hide Implement to provide correct calling token. 3,422 */ 3,423 public void startActivityAsUser(Intent intent, UserHandle user) { 3,424 startActivityAsUser(intent, null, user); 3,425 => } 3,426 3,427 /** 3,428 * @hide Implement to provide correct calling token. 3,429 */ 3,430 public void startActivityAsUser(Intent intent, Bundle options, User Handle user) {

行断点:

> use D:\test\MyApplication\app\src\main\java stop at b.myapp.MainActivity:18 正在延迟断点b.myapp.MainActivity:18。 将在加载类后设置。 > resume 已恢复所有线程。 > 设置延迟的断点b.myapp.MainActivity:18 断点命中: "线程= main", b.myapp.MainActivity.onCreate(), 行=18 bci=12 18 int j = 0;


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭