IDA 调试 Android 方法及简单的脱壳实现

IDA 调试 Android 方法及简单的脱壳实现

标签: android原创逆向调试dalvik

2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报

分类:

原创(25) Android(5) 学习(9) 逆向(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

本文参考了一些网络文章,对大大们的技术分享表示感谢。小弟刚刚开始深入去搞Android的逆向不久,写一下学习笔记,希望能抛砖引玉,给新手同学们带来方便。文笔比较烂,这不重要,重要的是按自己思路整理出来的资料以后自己看起来快一些。文中如有不对的地方还请留言指正。

前置环境

JDK,IDA PRO,Android NDK,Android Killer,JEB,Root并开启开发者模式USB调试的手机

动态启动调试

Android Killer 反编译 x.apk,取出 classes.dex Dalvik文件,记录包名和启动类名。

修改 AndroidManifest.xml 文件,在<application>标签里添加属性 android:debuggable="true"  这一步越早修改越好,防止忘记改。

可以查看一下AndroidManifest.xml 他们的对应关系,加深理解。

用AndroidKiller 重新编译修改过的x_fix.apk。

adb install x_fix.apk 安装到手机

将 IDA 安装目录 dbgsrv 目录下的 android_server 文件拷入手机

adb push dbgsrv\android_server /data/data/android_server

接着执行

adb shell chmod 655 /data/data/android_server添加可执行权限

adb shell /data/data/android_server 将其运行起来

在实际环境中可能会遇到上图中的一些错误,图中也给出了解决方法。

需要额外说明的是,当 adb root 失败时,需要在手机中安装一下“超级adbd”打开应用选择启用超级adbd ,再执行adb root 就可以了。

运行后可以看到 Listening on port #23946 … 字样就说明 server 运行成功了,并且已经打开了手机端的 23946 端口等待接收命令。

为了方便PC端IDA 连接调试手机,可以在本机做端口转发。另起一个cmd,输入:

adb forward tcp:23946 tcp:23946

将之前保存出的 classes.dex 托入 IDA。在IDA菜单中选择 【Debugger】-> 【Debugger Options…】添加以下选项

再点击 Set specific options,添加adb 路径及刚刚保存的包名和入口名,如图

【Debugger】-> 【Process Options…】的配置如图

接下来就可以按IDA上的启动键,启动手机端的APP进行调试了,如图

你可以在【View】->【open subviews】->【functions】调出函数列表,再配合Android killer 或 JEB 分析的代码位置进行下断调试了。

动态附加调试

正常流程

在手机端运行程序后,按上图的步骤直接附加就可以了。

如果出现 Bogus or irresponsive remote server 的错误提示

修改 SELinux安全策略限制

adb shell su -c setenforce 0

再重新运行 android_server 重新转发,再试。

反调试/解密函数运行前进行动态调试

很多程序加入了反调试机制,或者是伪dex文件在程序运行时解密真正的dex文件以壳的方式保护APP。针对此两种方法可采用在程序运行前挂起程序,再用IDA挂载,在关键位置下断,来破解类此防护。

举一个网上的例子。

下载 ori.apk 按之前的操作记录包名等,加入Debug属性,安装到手机

运行调试启动命令

adb shell am start –D –n loading.androidmanual/loading.androidmanual.BeginningActivity

这时程序会被挂起,等待调试器接入。

用IDA 载入,调试选项如下

加载时可记录一下该应用的pid 之后会用到,忘记记录也没关系,附加后在IDA 的输出log里可以找到pid的信息

运行 adb forward tcp:7788 jdwp:977
命令,转发要调试的进程到端口7788(随便写),

运行 jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=7788 使用jdb 载入调试。

此时程序处于阻塞状态,没关系,返回IDA,在Modules窗口查找libdvm.so,双击进入Module: libdvm.so 窗口,查找_Z21dvmDexFileOpenPartialPKviPP6DvmDex 函数,双击定位过去,在函数头部下断。

因为要Load Dex 文件都要经过此函数就像 LoadLibrary同样的道理。

接下来点击IDA继续运行程序就会在此断点断下来。

R0 寄存器中的地址就是 Dex 的起始地址。点击旁边的回车图标跳转到相应的位置。在 View-PC 窗口中右键,选择Jump in a new hex window 可以更好的观察内存中的信息

这就是壳中释放出来的程序真正的dex文件了。根据Dex 文件结构,我们知道从起始位置偏移0x20字节是这个文件的大小,在这里也就是
0x0FAEB4。有了起始位置和文件大小就可以Dump了。我们直接写IDA 的脚本来dump。【file】->【Script
Command…】。输入以下代码:

[cpp] view plain copy

  1. auto fp, dexAddress ,endAddr;
  2. dexAddress = 0x54d4c41c;    //起始地址
  3. endAddr = 0x54E472D0;       //结束地址=起始地址+文件大小
  4. fp = fopen("d:\\dump.dex", "wb");       //打开文件
  5. for (; dexAddress < endAddr; dexAddress++)       //循环写入
  6. fputc(Byte(dexAddress), fp);
  7. fclose(fp);

Dex文件保存后就可以丢进JEB进行分析了……

如果是反调试机制,那么就从一开始加载的so文件入手进行分析。同样用IDA挂载起来

按照上面的步骤找到JNI_OnLoad函数并下断,F9运行起来后就可以跟踪分析了。

时间: 2024-07-30 21:24:05

IDA 调试 Android 方法及简单的脱壳实现的相关文章

IDA 调试 Android

最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 AndroidManifest.xml 中debuggable要为true 1.将 apk 装到手机上,然后执行命令行: adb shell am start -D -n "com.gabo.test/com.unity3d.player.UnityPlayerActivity" 最后一个参数是

ida 调试 android fork

在使用ida 调试android native代码时经常会碰见fork子进程的情况出现,而运行一个 android_server只能对一个进程进行调试或者attach,而ida 默认端口是23946,可以通过指定 android_server 的端口来实现多开,同时调试多个进程.

ida调试 android so

C:\Documents and Settings\Administrator>adb shell[email protected]_v2_dtg:/ $ susu[email protected]_v2_dtg:/ # cd /system/bincd /system/bin[email protected]_v2_dtg:/system/bin # andriod_serverandriod_serverIDA Android 32-bit remote debug server(ST) v

Android应用程序通用自动脱壳方法研究

Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从一开始只有甲方公司提供服务到现在大型互联网公司都有自己的加固保护服务,同时与金钱相

[转载]Android应用程序通用自动脱壳方法研究

本文转载自: http://drops.wooyun.org/tips/9214 Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从

Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native层,那么这样一来,我们前篇说到的Eclipse调试smali源码就显得很无力了,因为核心的都在native层,Android中一般native层使用的是so库文件,所以我们这篇就来介绍如何调试so文件的内容,从而让我们破解成功率达到更高的一层.

Android逆向之旅---应用的&quot;反调试&quot;方案解析(附加修改IDA调试端口和修改内核信息)

一.前言 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了.但是有时候必须要借助动态调试方可破解,就需要进行操作了.现阶段反调试策略主要包括以下几种方式: 第一.自己附加进程,先占坑,ptrace(PTRACE_TRACEME, 0, 0, 0)!第二.签名校验不可或缺的一个选择,本地校验和服务端校验双管齐下!第三.借助系统api判断应用调试状态和调试属

调试 Android* x86 应用程序的方法以及要使用的工具

作者:Xiaodong Wang 1.简介 众所周知,Android* 开发人员头顶许多称呼:设计员.程序猿等,并且通常会不可避免地被称为故障检修工.代码中的错误无法避免,因此无论您是否一开始就造成错误,了解调试工具以及如何迅速而有效地跟踪并解决错误都很重要.鉴于此,如今的 Android 开发人员必须掌握有效的调试技巧.本文提供了 Android 应用程序调试工具的简单教学,用于帮助 Android SDK 以及相关工具的新手迅速入门,并在 Android x86 平台上更有效地解决故障. 2

加壳学习笔记(三)-简单的脱壳思路&amp;调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能