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. Elasticsearch嵌套聚合

    Elasticserch在新版本中支持聚合操作,而聚合操作也可以嵌套使用,方法如下: curl -XGET 10.4.44.19:9200/test/test/_search?pretty -d ' ...

  2. 一图看懂host_only nat bridge拓扑结构

    VMware三种模式 我们在使用VMware时经常能看到三种网络的连接模式:Bridged  Host-Only Nat,它们都有什么作用,网络拓扑是怎样的?怎样才能让他们上网,他们相互间能不能相互访 ...

  3. Fiddler使用AutoResponder进行本地文件和线上文件的映射

    直入正题.. 刚刚想写篇总结,照常登上博客园添加新随笔,写了百来字发现有什么不对劲 编辑器去哪儿了... 心想重新登录应该就OK了吧,点击退出然后重新登录 按钮一直显示加载中...简直就没法登录嘛.. ...

  4. C#2.0 to 4.0

    //xmlElement.set_InnerText(value); xmlElement.InnerText = value; ).ToCharArray());//Convert.ToChar(s ...

  5. canvas画简单电路图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. MVC上传文件

    ASP.NET MVC上传文件是必段撑握的知识.加强训练才是.以前Insus.NET曾使用第三方MyAjaxForm.js :http://www.cnblogs.com/insus/p/378548 ...

  7. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  8. 【C#】第3章学习要点(三)--常用类和结构的用法

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.DateTime结构和TimeSpan结构 DateT ...

  9. Java的List排序

    有时需要对List排序,这时可以利用Collections的sort()方法来排序,不用自己再去排序. package myTest; import java.util.ArrayList; impo ...

  10. [转]CSS编码规范

    单行形式书写风格的排版约束 1.      每一条规则的大括号 { 前后加空格 2.      多个selector共用一个样式集,则多个selector必须写成多行形式 3.      每一条规则结 ...