Ida双开定位的意思是先用ida静态分析so文件,然后再开一个ida动态调试so文件。因为在动态调试中ida并不会对整个动态加载的so文件进行详细的分析,所以很多函数并无法识别出来。比如静态分析中有很多的sub_XXXX函数:

但动态调试中的ida是没有这些信息的。

所以我们需要双开ida,然后通过ida静态分析的内容来定位ida动态调试的函数。当然很多时候我们也需要动态调试的信息来帮助理解静态分析的函数。

在上一节中,我们提到.init.array中有个sub_2378(),但当ida动态加载so后我们并无法在module中找到这个函数。那该咋办呢?这时候我们就要通过静态分析的地址和so文件在内存中的基址来定位目标函数。首先我们看到sub_2378()这个函数在静态分析中的地址为.text:00002378。而在动态加载中这个so在内存中的基址为:4004F000。

因此sub_2378()这个函数在内存中真正的地址应该为4004F000 + 00002378 =40051378。下面我们在动态调试窗口输入”g”,跳转到40051378这个地址。然后发现全是乱码的节奏:

不要担心,这是因为ida认为这里是数据段。这时候我们只要按”P”或者选中部分数据按”c”,ida就会把这段数据当成汇编代码进行分析了:

我们随后还可以按”F5”,将汇编代码反编译为c语言。

是不是和静态分析中的sub_2378()长的差不多?

我们随后可以在这个位置加入断点,再结合上一节提到的调试技巧就可以对init.array中的函数进行动态调试了。

我们接下来继续分析自毁程序这道题,当我们在对init.array和JNI_OnLoad()进行调试的时候,发现程序在执行完dowrd_400552B4()后就挂掉了。

于是我们在这里按”F7”进入函数看一下:

原来是libc.so的phread_create()函数,估计是app本身开了一个新的线程进行反调试检测了。

有意思的是在静态分析中我们并不清楚dword_62B4这个函数是做什么的,因为这个函数的地址在.bss段还没有被初始化:

但是当我们动态调试的时候,这个地址的值已经修改为了phread_create()这个函数的地址了。:

所以说自毁程序密码这个app会用pthread_create()开一个新的线程对app进行反调试检测。线程会运行sub_16A4()这个函数。于是我们对这个函数进行分析,发现里面的内容有大量的混淆,看起来十分吃力。这里我介绍个小trick:常见的反调试方法都会用fopen打开一些文件来检测自己的进程是否被attach,比如说status这个文件中的tracerpid的值是否为0,如果为0说明没有别的进程在调试这个进程,如果不为0说明有程序在调试。所以我们可以守株待兔,在libc.so中的fopen()处下一个断点,然后我们在hex view窗口中设置数据与R0的值同步:

这样的话,当函数在fopen处停住的时候我们就能看到程序打开了哪些文件。果不其然,程序打开了/proc/[pid]/status这个文件。我们”F8”继续执行fopen函数,看看返回后的地址在哪。然后发现我们程序卡在了某个函数中间,PC上面都是数据,PC下面才是汇编。这该咋办呢?

解决办法还是ida双开,我们知道现在PC的地址为40050420,libcrackme.so文件的基址为4004F000。因此这段代码在so中的位置应该是:40050420 - 4004F000 = 1420。因此我们回到ida静态分析界面,就可以定位到我们其实是在sub_130C()这个函数中。于是我们猜测这个函数就是用来做反调试检测的。

因此我们可以通过基址来定位sub_130C()这个函数在内存中的地址:40050420 + 130C = 4005030C。然后我们在4005030C这个地址处按”P”, ida就可以正确的识别整个函数了。

所以说动态调试的时候可以帮我们了解到很多静态分析很难获取到的信息。这也就是ida双开的意义所在:静态帮助动态定位函数地址,动态帮助静态获取运行时信息。

Ida双开定位android so文件的更多相关文章

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

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

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

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

  3. Android so文件进阶 <一>

    0x00  前言   最近一段时间在弄android方面的东西,今天有人发了张截图,问:在要dump多大的内存? 一时之间我竟然想不起来ELF文件的哪个字段表示的是文件大小,虽然最后给出了解决方法,I ...

  4. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

  5. Android.mk文件语法规范 原文

    序言:------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件.为了明白下面的内容,你必须已经阅读 ...

  6. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  7. 【Android】日常开发android.jar文件中十五个重要的包概述

    简述Android项目中android.jar文件里包含较为重要的15个系统编译后的class文件 android.app:提供高层的程序模型,提供基本的运行环境android.content:包含各 ...

  8. Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB

    Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...

  9. Android.mk文件语法规范及使用模板

    Android.mk文件语法详述 介绍:------------这篇文档是用来描述你的C或C++源文件中Android.mk编译文件的语法的,为了理解她们我们需要您先看完docs/OVERVIEW.h ...

随机推荐

  1. [Java 基础]字符串

    String类 实例化String对象 String 对象初始化方式有多种. 如下代码中,各种初始化方式的效果是一样的,初始化后,String 对象的内容为 "hello" . p ...

  2. c# 游戏策划配置工具

    该工具是提供策划配置excel数据,导出到mysql数据库,以及生成xml文件,和对应的xml解析实体类 实现了程序 excel 列名 ID =P 表示ID这列是唯一字段 =S=300 表示这列类型是 ...

  3. Ionic2学习笔记(1):新建一个页面

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5532323.html                 新建一个页面: 借上一篇中的HelloWorl ...

  4. LINQ的Any方法

    返回布尔值,判断集合中是否有元素满足某一条件. source code: IEnumerable<string> str = new List<string> { " ...

  5. Android应用中如何保护JAVA代码

    Java Classes字节码的反编译太容易了,有很多功能强大的反编译利器可以轻松的将Java字节码 反转为源代码,但是android中普通.apk文件可以轻松的被反编译为Java源代码吗? 答案是当 ...

  6. CodeSnippet.info 开源说明 和 环境搭建 (第一版)

    Github开源声明 本网站的代码开源,开源的目的如下 技术分享 希望业内同行贡献代码 希望能够让网站更加安全 开源地址: CodeSnippet开源地址 关于代码贡献 任何人都可以贡献代码,一般在 ...

  7. jquery可见性选择器(匹配所有隐藏的元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Java递归列出所有文件和文件夹

    package file_op; import java.io.File; public class file_list { static int n =0; /** * @param args */ ...

  9. Eclipse下FatJar插件的安装与使用

    在Eclipse下生成jar包分很多种情况.最简单的情况是没有用到第三方jar包,那么直接Export就可以生成jar包.但是如果用到了第三方jar包,那么就比较繁琐了,很不方便.FatJar可以解决 ...

  10. Pydev Debugger not working with breakpoints

    I have a simple test module: print("fish")print("sticks")It runs pretty fast as ...