http://sunzeduo.blog.51cto.com/2758509/1409450

近来android上越来越多的应用对自身的保护机制加强了重视,主要表现在几个方面。

1 dex加壳

2 so加壳

3 dex藏在so中,在适当的时候释放。

这是技术上一个进步,并且还有一些专业的公司提供了整个安全的解决方法,比如防ptrace,或者加密dex文件等。但是不管如何,在技术层面,cpu要
运行的指令还必须是cpu能够支持的,除非不考虑效率利用复杂的动态内存机制来保护代码,一般情况下,加载内存的so或者dex等文件还都是原生态的
cpu可以执行的指令集。

因为有时候骇客要破解你精心涉及的算法是一件很麻烦的事情,他要求一条一条的看枯燥的汇编代码,不是达不到,而是效率特别低。所以这个时候内存dump却是骇客们经常采用的一种手段了。

linux下的内存dump离不开
ptrace,所以有些安全方案直接防止别的进程对其ptrace,主要手段就是ptrace住自己。即便如此,依然有孜孜不倦的骇客成功绕开了防止
ptrace的保护机制,关于这方面的事情,我以后有时间在专门写一篇文章分享。今天只讲如何内存dump,内存dump需要的ptrace目标进程。

为了方便我个人的使用,我编写了一个memdump工具,这是一个elf的可执行文件,在android系统下adb shell进去以后直接可以执行。首先说一下这个工具的用法。

1
2
3
shell@android:/ # memdump
usage: memdump pid start_addr end_addr filaname
255|shell@android:/ #

用法十分简单,将memdump通过 adb push拷贝到你的手机里面,我是放在了/system/bin 下面了,这样我不用每次找路径,直接运行命令即可。

然后后面需要有4个参数

1
2
3
4
pid                     要dump目标进程的进程号
start_addr         要dump目标进程数据的虚拟起始地址
end_addr           要dump目标进程数据的虚拟结束地址
filename            dump出来的数据要保存的文件名称(要求有路径)

ok 介绍完了命令使用方法,下一步就具体操作一下如何使用的。

如图一

上图中我自己编写了一个 包名为 com.example.socketcomm 的apk应用,里面加载了一个 libsocketback.so的库,打开以后其进程号为 11164 ,通过查看其maps信息,发现其可执行的

代码段在

1
2
56d34000-56d37000 r-xp 00000000 103:04 579426  
/data/data/com.example.socketcomm/lib/libsocketback.so

这三个物理页面上

由于物理页面是以0x1000对其,我不知道这个so具体的大小,但是没有关系,先将其全部dump出来

再做处理。

如上图,

memdump 11164 0x56d34000 0x56d37000 /sdcard/dump.so

通过这个命令将libsocketback.so  dump到了 /sdcard/dump.so

然后退出adb cmdline 以后,通过 adb pull 将 /sdcard/dump.so 拉到linux host机器上

再使用 readelf -h dump.so 查看 elf文件头部,果然是

Type:                              DYN (Shared object file)

这个共享对象。

仔细的同学会看到

readelf: Error: Unable to read in 0x370 bytes of section headers

这条错误,产生的原因是 linux在加载so的时候是按照程序视图的方式加载的,主要关心的是

Start of program headers:          52 (bytes into file)


个开始的头部信息,对于链接方式的视图的 段名等数据并不敏感,所以直接从内存dump出来的数据,是没有 .symstrtab   .symtab
 .strtab
这些段的,所以解析错误也很正常。一般常用的修补so的方法是拿到原来的so,这个你只要有这个应用就应该能拿到,然后根据elf文件头部,找到

Start of section headers:          12600 (bytes into file)

段表在文件中的偏移地址,拼接一下文件即可,这个程序的编写需要对elf文件有一定的了解,回头我会根据自己的研究和学习补充一些elf格式相关的博文。

从本质来看,基本上这个时候的so中的指令都应该是符合业务逻辑的指令了,dex文件的提取同理,这个时候大家可以通过ida工具对其进行静态分析。

附件为:memdump工具,我压缩了一下,解压即可,关于源代码,谁有需要在下面留个邮箱,我发过去即可。

最新文章

  1. shell 脚本之获取命令输出字符串以及函数参数传递
  2. SUSE zypper failed to work
  3. js 函数覆盖的问题
  4. [JS] JS模块化开发之RequireJS
  5. .net程序员转行做手游开发经历(二)
  6. javascript 公共方法 集合
  7. Selenium&EmguCV实现爬虫图片识别
  8. IOS 杂笔-2(协议)
  9. 提高HTML5 canvas性能的几种方法
  10. android的入门学习
  11. raise()函数
  12. 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)
  13. [开源] C# 封装 银海医保的接口
  14. tensorflow的简单操作
  15. 自制操作系统Antz(14)——实现内置编程语言(词法解析器)
  16. 毕业设计 Makefile 编写
  17. Python matplotlib绘图学习笔记
  18. nginx实现按日期进行日志分割
  19. JQuery中after() append() appendTo()的区别
  20. PHP-FPM 不完全指南

热门文章

  1. 09 mongoDB基础(进阶)
  2. 对URI的理解
  3. C语言Windows程序开发—CreateWindow函数介绍【第03天】
  4. C errno是否是线程安全的
  5. Waterline从概念到实操
  6. Educational Codeforces Round 47 (Rated for Div. 2) :A. Game Shopping
  7. 2018 ccpc final I. Cockroaches
  8. HDU暑假多校第四场J-Let Sudoku Rotate
  9. MapRudecer
  10. axios应用