吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17935|回复: 77

[Android 原创] Hook Android C代码(Cydia Substrate)

  [复制链接]
发表于 2016-9-25 10:54 | 显示全部楼层
本帖最后由 PJ头狼 于 2016-9-26 18:00 编辑

之前对于Cydia Substrate这个框架的使用及如何hookAndroidJava层,是在学习了鬼哥的Hook Android Java教程掌握的:http://www.52pojie.cn/thread-288128-1-1.html
这几天自己开始深入来学习Cydia Substrate这个框架在Hook Android C上的使用,但一开始对Android native的开发不怎么了解,所以直接通过学习这方面的博文容易碰壁,碰到的问题没有相应的思路来很好解决、实现。便先学习了Android native开发方面的知识,这里给大家推荐一篇Android native的学习博文,讲的很详细:
http://blog.csdn.net/shulianghan/article/details/18964835

下边是我学习Hook Android C的知识总结,希望可以给学习这方面的初学者有些帮助,也希望大牛们可以多多指点。
参考学习的英文博文https://koz.io/android-substrate-c-hooking/

创建一个目标apk
编写目标项目,用于本次实操过程的hook对象

1.创建项目
android create project--target android-23 --path targetapp --package com.example.targetapp --activityMainactivity
//执行命令,在当前目录下创建Android项目
我这次是在Ubuntu12.04上以命令行的方式完成Android项目的构建的,也可以使用Eclipse或Android Studio来完成

2.编写C程序在项目下创建jni目录,并新建targetlib.c文件,其代码如下:

c14.png

其中doThings()方法将对应Java层中的声明的native daThings(),而arc4random()是系统上的仿生标准库(bionic standardlibrary),生成随机数

3.编写Android.mk

c15.png

用于编译生成targetlib库文件

4.Java层编写

c17.png

5.编译、调试运行、安装程序
在jni目录下,执行ndk-build进行库文件的编译

c19.png

然后在项目目录下,执行ant debug进行项目的调试运行,生成apkadb install ./bin/Mainactivity-debug.apk  //安装apk程序打印结果如下:

c20.png

6.查看库文件中的exported symbols
nm-aDC --defined-only libs/armeabi-v7a/libtargetLib.so //
显示库文件所暴露的符号

c21.png

忽略其中_的符号,该库文件暴露了下边两个方法
00000e95 TJava_com_example_targetapp_Mainactivity_doThings
00000e6d T getAge

这些暴露出来的方法将可以直接被其他程序或库文件
调用
nm -aDCulibs/armeabi-v7a/libtargetLib.so  //显示库文件中未定义的请求符号

c22.png

这样可以查看库文件所调用其他库的符号,可以看到库文件调用了arc4random()
创建Substrate模块

编写Substrate扩展模块来hook上边库文件中的arc4random()方法,修改其返回值,使其返回固定值

1.创建项目android create project--target android-23 --name Hooknative --package com.example.hooknative --pathHooknative --activity Mainactivity//创建hook项目

2.修改AndroidManifest.xml声明权限:cydia.permission.SUBSTRATE,设置android:installLocation和android:hasCode

c23.png

3.编写C++程序在项目目录下,创建jni目录并新建***.cy.cpp文件,以最后编译生成.cy.so文件才能被Substrate框架所链接到。代码如下:

c33.png

通过MSConfig()方法来配置过滤对象,这里是可执行文件,参数2应为文件的绝对路径,再调用MSHookFunction()方法来hook其中的arc4random()方法

4.编译、调试运行、安装模块在jni目录下,执行ndk-build进行库文件的编译然后在项目目录下,执行ant debug进行项目的调试运行,生成apkadb install./bin/Hooknative-debug.apk  //安装apk然后通过Substrate链接模块,重启系统,或执行下边命令重启zygoteadb shell setprop ctl.restartzygote修改后,打印结果如下:

c24.png

hook库文件内部暴露方法
编写Substrate模块来hook库文件中暴露的内部方法,进行修改返回值操作
可在上边C++源文件中添加下边代码,进行hook操作

c34.png

这里我们使用lookup_symbol()这个定义的方法来查找getAge()方法在库文件libtargetLib.so在的地址,需要注意的是我们的Substrate模块将会在作为所有进程初始化的孵化器zygote中第一个被加载,这时候库文件libtargetLib.so还没被加载到进程空间,直接查找其暴露的方法是行不通的。这里通过dlopen()方法人为的打开和加载在zygote的内存中的ELF二进制文件,并通过dlsym()方法来找到库文件中的暴露方法。同时Substrate也提供MSGetImageByName()和MSFindSymbol()来实现相同的功能。hook结果输出如下:

c25.png

hook内部non-exported方法
1.
将内部方法getAge()设置为non-exported
在C++程序中将getAge()设置为static,则方法就不会暴露出来给其他程序直接调用
通过nm -aDC --defined-onlylibs/armeabi-v7a/libtargetLib.so将不会打印出:00000e6d T getAge当然由于doThings()方法要被Java层调用,所以仍是暴露的。由于getAge()设置为static,所以上边的模块将不再hook到该方法,结果输出如下:

c26.png

2.静态分析定位non-exported方法
使用IDA pro工具打开libtargetLib.so库文件,可以定位到其中getAge()方法对应的汇编程序如下:

c28.png

其中的sub_E48就是对于getAge(),由图可得出sub_E48对应的地址为0xE48,但这不是方法getAge()在库文件中的地址,而是基于库文件基地址的偏移量,所以应先找出库文件的基地址,然后加上方法的偏移量便可确定方法的地址。

3.获取库文件的基地址
通过将库文件加载到zygote的内存空间,然后通过/proc/self/maps来读取其基地址

c29.png
c30.png

4.hooknon-exported方法

c32.png

其中之所以在基地址上加上0xE48+1,是因为这里在运行在thumb体系下,+1使地址为奇数对应thumb

5.hook结果如下:

c27.png

好啦,分享了,技术才能价值。

apk.zip

438.7 KB, 下载次数: 200, 下载积分: 吾爱币 -1 CB

实例源码

点评

精华 啊啊啊  发表于 2016-10-16 10:39

免费评分

参与人数 17吾爱币 +26 热心值 +16 收起 理由
wi5101 + 1 + 1 用心讨论,共获提升!
zhuzaiting + 1 + 1 谢谢@Thanks!
MatchState + 1 用心讨论,共获提升!
GG0 + 1 + 1 我很赞同!
lawlier + 1 + 1 我很赞同!
yuuding + 1 + 1 我很赞同!
xouou + 2 + 1 我很赞同!
loser1 + 1 + 1 谢谢@Thanks!
siuhoapdou + 1 + 1 谢谢@Thanks!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
很快再相见123 + 1 + 1 我很赞同!
602301011 + 1 + 1 谢谢@Thanks!
wanttobeno + 2 + 1 很详细的分享,收藏了
Sound + 6 + 1 赞!
海盗小K + 1 + 1 看到你在看雪的文章了,排版很好,怎么到52成这样了。。。
cqr2287 + 3 + 1 good
啦灯是我干掉的 + 1 + 1 又是一位大神!

查看全部评分

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

 楼主| 发表于 2016-11-7 19:50 | 显示全部楼层
alu 发表于 2016-11-6 21:34
请问我怎么缺少substrate.h。。还有so ndk12

是缺少了头文件和库文件,这博文有说怎么添加(http://blog.csdn.net/hu3167343/article/details/50792153),我的是下载相关包后,在build path添加这些文件,所以你没添加就报错了。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2017-2-20 09:38 | 显示全部楼层
PJ头狼 发表于 2017-2-17 09:36
可以的,doTings这个native方法跟getAge方法一样是暴露出来的

谢谢楼主,这几天自己试了试,感觉 so地址+偏移量的方式是不是有些暴力,小弟水平比较菜,看到有前辈发的帖 通过遍历got表 是不是更稳定一点

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-25 10:59 | 显示全部楼层
这次图片显示了,不过却有点错位,大家自己勉强对照一下

点评

赞一个,帖子我编辑了下,把文章和图片做了换行,这下看起来好多了。  详情 回复 发表于 2016-9-26 11:37

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-25 19:27 | 显示全部楼层
我对于安卓逆向一窍不通。唉

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-25 19:28 | 显示全部楼层
PJ头狼 发表于 2016-9-25 10:59
这次图片显示了,不过却有点错位,大家自己勉强对照一下

怎么错位了?没错位呀

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-25 20:05 | 显示全部楼层
图片顺序没错,图片跟文字有些左右偏移了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-25 21:48 | 显示全部楼层
好高端。。。膜拜

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-25 23:14 | 显示全部楼层
看不懂哟

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-26 02:33 来自手机 | 显示全部楼层
有心学Java,无奈英语0基础!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-26 08:41 | 显示全部楼层
前排沙发 强力围观!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2016-9-26 11:37 | 显示全部楼层
PJ头狼 发表于 2016-9-25 10:59
这次图片显示了,不过却有点错位,大家自己勉强对照一下

赞一个,帖子我编辑了下,把文章和图片做了换行,这下看起来好多了。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2017-7-22 14:49

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表