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

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…】。输入以下代码:

  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运行起来后就可以跟踪分析了。

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

  1. ida 调试 android fork

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

  2. IDA 调试 Android

    最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...

  3. 【转】IDA 调试 Android

    最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 And ...

  4. IDA调试android so的.init_array数组

    参考: http://www.itdadao.com/articles/c15a190757p0.html 一. 为什么要调试init_array init_array的用途 1. 一些全局变量的初始 ...

  5. IDA调试android so文件.init_array和JNI_OnLoad

    我们知道so文件在被加载的时候会首先执行.init_array中的函数,然后再执行JNI_OnLoad()函数.JNI_Onload()函数因为有符号表所以非常容易找到,但是.init_array里的 ...

  6. ida调试 android so

    C:\Documents and Settings\Administrator>adb shellshell@htc_v2_dtg:/ $ susushell@htc_v2_dtg:/ # cd ...

  7. ida 调试android之路

    系统: Mac OSX 调试环境:IDA7.0,  adb 手机环境:红米手机 android 4.4.4 前提条件: 红米手机root之路:https://www.cnblogs.com/dzqdz ...

  8. IDA动态调试Android的DEX文件

    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...

  9. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

随机推荐

  1. Painting Fence

    Painting Fence Time Limit:1000MS     Memory Limit:524288KB     64bit IO Format:%I64d & %I64u Sub ...

  2. BZOJ 1260 CQOI2007 涂色paint 动态规划

    题目大意:给定一块木板,上面每一个位置有一个颜色,问最少刷几次能达到这个颜色序列 动态规划,能够先去重处理(事实上不是必需),令f[i][j]代表将i開始的j个位置刷成对应颜色序列的最小次数.然后状态 ...

  3. ServletContext与Web应用以及Spring容器启动

    一.ServletContext对象获取Demo Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象. 可以把ServletContext看作一个 ...

  4. deque双端队列用法

    #include <iostream> #include <cstdio> #include <deque> #include <algorithm> ...

  5. 修改Nginx与Apache上传文件大小限制

    一.修改Nginx上传文件大小限制 我们使用ngnix做web server的时候,nginx对上传文件的大小有限制. 当超过大小的时候会报413错误. 这个时候我们要修改nginx参数. sudo ...

  6. Spring MVC复选框

    以下示例显示如何在使用Spring Web MVC框架的表单中使用复选框(Checkbox).首先使用Eclipse IDE来创建一个WEB工程,并按照以下步骤使用Spring Web Framewo ...

  7. 什么是 HTTPS

    HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议. 你也可以说:HTTPS = HTTP + SSL HTTPS 在 ...

  8. 安装Oracle后修改IP总结(转载)

    转载自:http://blog.csdn.net/bleibo/article/details/5447198 安装Oracle后修改IP总结(转载) 针对ORACLE 10G 在安装完后,修改IP ...

  9. IOS 键盘协议之中的一个 &lt;UITextFieldDelegate&gt;

    1. 设置键盘的第一响应者后,便可通过点击TextField唤出键盘 设置键盘第一响应者方法为: [textField becomeFirstResponder];//此时,textField 输入框 ...

  10. div块级元素获取焦点

    在做弹出层时需要对div获取失去焦点 focus blur只是针对form表单控件的,而对于 span , div , li 之类的,则没办法触发它们的动作 几个事件(摘自w3c). blur事件: ...