IDA 调试 Android 方法及简单的脱壳实现
IDA 调试 Android 方法及简单的脱壳实现
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…】。输入以下代码:
- auto fp, dexAddress ,endAddr;
- dexAddress = 0x54d4c41c; //起始地址
- endAddr = 0x54E472D0; //结束地址=起始地址+文件大小
- fp = fopen("d:\\dump.dex", "wb"); //打开文件
- for (; dexAddress < endAddr; dexAddress++) //循环写入
- fputc(Byte(dexAddress), fp);
- fclose(fp);
Dex文件保存后就可以丢进JEB进行分析了……
如果是反调试机制,那么就从一开始加载的so文件入手进行分析。同样用IDA挂载起来
按照上面的步骤找到JNI_OnLoad函数并下断,F9运行起来后就可以跟踪分析了。
IDA 调试 Android 方法及简单的脱壳实现的更多相关文章
- ida 调试 android fork
在使用ida 调试android native代码时经常会碰见fork子进程的情况出现,而运行一个 android_server只能对一个进程进行调试或者attach,而ida 默认端口是23946, ...
- IDA 调试 Android
最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...
- 【转】IDA 调试 Android
最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...
- IDA调试android so的.init_array数组
参考: http://www.itdadao.com/articles/c15a190757p0.html 一. 为什么要调试init_array init_array的用途 1. 一些全局变量的初始 ...
- IDA调试android so文件.init_array和JNI_OnLoad
我们知道so文件在被加载的时候会首先执行.init_array中的函数,然后再执行JNI_OnLoad()函数.JNI_Onload()函数因为有符号表所以非常容易找到,但是.init_array里的 ...
- ida调试 android so
C:\Documents and Settings\Administrator>adb shellshell@htc_v2_dtg:/ $ susushell@htc_v2_dtg:/ # cd ...
- ida 调试android之路
系统: Mac OSX 调试环境:IDA7.0, adb 手机环境:红米手机 android 4.4.4 前提条件: 红米手机root之路:https://www.cnblogs.com/dzqdz ...
- IDA动态调试Android的DEX文件
Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...
- Android动态方式破解apk进阶篇(IDA调试so源码)
一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...
随机推荐
- vue 声明响应式属性
声明响应式属性 由于vue不允许动态添加根级响应式属性,所以你必须在初始化实例前声明根级响应式属性,哪怕只是一个空值: var vm = new Vue({ data: { // 声明 message ...
- css中div标签不置顶
设置div属性垂直对齐方式为:top <div style="vertical-align: top;"></div>
- java内存管理和gc回收机制
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码 ...
- iOS 学习笔记五 【2016年百度地图定位详细使用方法】
具体介和配置绍在此就不详述了,详情请看百度地图API文档, 在这里具体讲解下,新版百度地图的定位与反地理编码的使用: 1.导入头文件 #import <BaiduMapAPI_Map/BMKMa ...
- Masonry介绍与使用实践:快速上手Autolayout【转载】
MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 win ...
- 华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!
还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线, 让你畅快 ...
- GCD - Extreme (II) for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } 推导分析+欧拉函数
/** 题目:GCD - Extreme (II) 链接:https://vjudge.net/contest/154246#problem/O 题意: for(i=1;i<N;i++) for ...
- Windows之建立C++开发环境
下载:https://yun.baidu.com/s/1pK7j4Fp 解压得到 把myMingw文件夹复制系统根目录下. 添加C:\myMingw\bin到系统环境变量 双击make-3.81.ex ...
- 苯(Benzene)
在常温下是甜味.可燃.有致癌毒性的无色透明液体,其密度小于水,但分子质量大于水,并带有强烈的芳香气味.它难溶于水,易溶于有机溶剂,本身也可作为有机溶剂.苯是一种石油化工基本原料,其产量和生产的技术水平 ...
- Ionic 取消自带动画效果
$ionicConfigProvider.views.transition('none'); 或: <ion-view view-title="个人中心" animation ...