首先要确保你所使用的gdb和gdbserver是配对的,最好(或必须)是sdk内相同platform(api level)下的gdb和gdbserver。否则你使用的gdb可能与运行测试机上的gdbserver,因为协议不兼容,而不能正常调试。

gdb 连接后提示,"Argument to arithmetic operation not a number or boolean."

gdbserver 连接后提示,“Unable to get location for thread creation breakpoint: requested event is not supported."

这种情况下,gdb是没法正常使用的,你将会在后续的调试中,不同情况地收到”Remote 'g' packet reply is too long:"

因为这个问题可能会耗费掉了你不少的时间和注意力。这时候最好就是去将你使用的gdb配对的gdbserver从sdk放到测试机去使用。

在测试机中默认有一个远程调试服务程序/system/bin/gdbserver,如果有上面的情况出现,至少使用绝对路径下的你所安排的gdbserver。

参数传递方式:

在x86下,要清楚特殊的传参行为。android的x86 gcc对静态函数的传参规则是,前面两个参数分别应用%eax和%edx,第三个参数开始应用参数栈。而this指针不是我们熟知的vc下应用ecx,gun gcc应用%ebx,而ndk是应用%eax。

下面回到百度加固平台的libbaiduprotect.so逆向。

libbaiduprotect_x86.so是对目标app的dex进行了加固,并且它自身也是加壳了的。下面是以加壳方式存储文件和脱壳后运行在内存映像的dump对比。

壳程序一般都安排在elf格式文件的.init_array section,由linker加载时最先执行。linker有这样的执行流程:

dl_open -> do_open -> soinfo::CallConstructors

只要通过中断linker的soinfo::CallConstructors方法,就可以将加载动态库之初使用程序中断。

中断后,我们通过%eax查看this指针的对象内容,soinfo::CallConstructors是成员方法,指针的对象类型是soinfo,这个结构体包含了加载后section信息。

这个结构的第一个结构成员是不同gcc平台下的linker都一样的,so文件名,查看结果与我调试加载的库名一致,libbaiduproctect_x86.so。后面的结构组织,不同版本的linker各不相同。在这里我懒得去配对正确的版本代码,也就不去搞清它的结构。但是可以通过运行时映射信息,以及readelf查看到的section信息,清楚看到.init_array和.fini_array的section信息加载到soinfo结构了。.init_array section一共0x14字节加载在0xadfa5464。

本例中so映射在0xadf16000,.text段偏移0x2bc0,也就说在0xadf8bc0。而JNI_OnLoad函数偏移量是0x3060,位于0xadf19060。

不用翻查代码,通过查看.init_array段0x14字节的内容,可以大至清楚这个段约等同一个函数指针数组,以空指针结尾。第一个函数指针位于.text的末端,后面三个函数指针位于.text段的开端。linker将按顺序去执行这四个函数。也就是说脱壳程序的其中一个入口就在这四个函数中。

现在我们的程序中断在soinfo::CallConstructors的入口,还没有执行so文件中任何的程序,我们如果反汇编JNI_OnLoad地址的话,就只能得到无法解释的加壳内容。

而so文件.init_array段的函数指针指向的函数则是怎么也就能是加壳的,或者至少保证前面的一个函数可以被执行脱壳出后面的函数。一般地,程序在对代码段进行脱壳,都必须要修改该段的内存访问属性,从只读变为可写才能将脱壳后的代码更新上去,也就说我们只要中断mprotect同样也会将脱壳程序中断到。

libbaiduprotect_x86.so并没有对所有.text段的代码进行脱壳,只是脱壳了一部分,并且在这阶段创建了6个线程,其中包含了反调试的监控线程。由于现在程序的运行被一步步掌控,所以可以将这些线程冻结然后进行后面的调试。

在这里我将被部分脱壳后的so映像dump出来,尝试用ida来静态分析,结果发现ida对x86指令支持并不好,一些原本在gdb能够反汇编的代码,不ida却识别不了。

逆向libbaiduprotect(二)的更多相关文章

  1. 逆向libbaiduprotect(四)

    百度加固libbaiduprotect.so自身对只读字符串进行了加密保护,防止成为破解和逆向的切入口.一般地认为,只要找出这个解密算法就可以对.rodata段的只读字符串进行破解,从而窥探程序的意图 ...

  2. OD 实验(二十一) - 对反调试程序的逆向分析(二)

    程序: 运行程序 点击“Verify” 关闭该程序,启动 OD 再运行程序 逆向: 用 OD 载入程序 按 F8 往下走 执行完这个 call 指令就弹出了对话框 这个 call 指令调用了 Dial ...

  3. 逆向libbaiduprotect(三)- 移植python操作dalvik虚拟机c++函数,配合gdb控制程序运行流程

    python编译移植到测试机,并且移植ctypes模块.利用ctypes代替c程序,利用dalvik内部c++函数,在运行过程中手动命令操控dalvik虚拟机,并结合gdb进行调试.绕过zygote和 ...

  4. Python逆向(二)—— pyc文件结构分析

    一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...

  5. 从零开始Android逆向教程(二)——什么是Xposed

    前言在阅读本文之前,假设你的手机已经root,并且已经成功安装好了 XposedInstaller. Xposed是什么?       Xposed 是一个 Android 平台上的动态劫持框架,通过 ...

  6. x32下PsSetLoadImageNotifyRoutine的逆向

    一丶简介 纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. ...

  7. x32下逆向 PsSetCreateProcessNotifyRoutine 进程钩子

    目录 一丶前言 二丶逆向过程 1.windbg挂载 win7 32位.定位到函数反汇编位置 2.逆向 PspSetCreateProcessNotifyRoutine 3.逆向 ExReference ...

  8. Python逆向(一)—— 前言及Python运行原理

    一.前言 最近在学习Python逆向相关,涉及到python字节码的阅读,编译及反汇编一些问题.经过长时间的学习有了一些眉目,为了方便大家交流,特地将学习过程整理,形成了这篇专题.专题对python逆 ...

  9. Mysql高可用

    一.二进制日志 二进制日志,记录所有对库的修改,如update.修改表结构等等 需要开启二进制日志的原因: 1.主从复制都是通过二进制日志进行.主库写二进制日志,传输到从库,从库replay二进制日志 ...

随机推荐

  1. java架构之路-(Redis专题)SpringBoot连接Redis超简单

    上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构 如何配置我上次已 ...

  2. HDU 6112 今夕何夕 (预处理 枚举)

    中文题意都看的懂啦~ 思路很简单,就是通过前一天推出当天是星期几,直接枚举所有2017-9999年的每一天就好了.ㄟ( ▔, ▔ )ㄏ 代码: #include <cstdio> #def ...

  3. Java中常用的四种线程池

    在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例,如何使用参见之前的文章Java线程池构造参数详解.不过,在Executors类中,为我们提供了常用线程 ...

  4. Shiro 并发登录控制

    本文转载于:https://www.w3cschool.cn/shiro/epht1ifg.html

  5. Leetcode(3)无重复字符的最长子串

    Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...

  6. zepto源码分析·event模块

    准备知识 事件的本质就是发布/订阅模式,dom事件也不例外:先简单说明下发布/订阅模式,dom事件api和兼容性 发布/订阅模式 所谓发布/订阅模式,用一个形象的比喻就是买房的人订阅楼房消息,售楼处发 ...

  7. 基于 HTML5 + Canvas 实现的 PID 可视化系统

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...

  8. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...

  9. VS无法新建项目

    问题描述:VS无法新建项目,确定Button呈灰色状态 原因:本机未安装Framework的环境,避免此类现象,在装VS之前,先安装好Framework,再安装VS. 解决方案: 1.点击图中< ...

  10. unity image 设置图片

    从任意文件目录下读取文件并在unity中显示: 1)读取目标文件 byte[] imageByte = File.ReadAllBytes(imagePath); 2)转换成纹理 texture.Lo ...