首页
社区
课程
招聘
[原创]Android studio环境下Cydia android Native Hook测试
发表于: 2016-3-25 10:43 14580

[原创]Android studio环境下Cydia android Native Hook测试

2016-3-25 10:43
14580

原文发表在:8d0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2&6j5X3g2A6j5X3g2A6i4K6u0W2L8X3g2@1i4K6u0r3i4K6y4r3M7q4)9K6c8o6p5H3y4e0p5`.

人比较笨,按照网上教程,断断续续折腾了5天4晚才最终搞定,期间无数次google,无数次翻看stackoverflow,各个android群询问,期间也得到了很多热心朋友的帮助,特别感谢“旗木、穿越地平线”、“kings0527”二位的耐心解答。

言归正传,部署步骤:

配置环境:

AS版本:Android Studio 1.5.1(之前用的1.3版本,各种问题,最终选择升级到1.5)

Cydia版本:com.saurik.substrate_0.9.4010.apk

Cydia框架:cydia_substrate-r2

NDK版本:android-ndk-r11

模拟器:海马玩0.9.0beta

1.建立project,选择No Activity;

然后在Mainfest.xml中增加substrate的调用权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <meta-data android:name="com.saurik.substrate.main"
            android:value=".Main"/>
    </application>
    <uses-permission android:name="cydia.permission.SUBSTRATE"/>
</manifest>

2.在app-main下建立jni文件夹;


3.将cydia_substrate-r2下的substrate.h、libsubstrate.so和libsubstrate-dvm.so三个文件放入jni目录中,这里要注意根据架构的不同,选择x86或ARM目录下的libsubstrate.so和libsubstrate-dvm.so(我这里选择的是x86的)

4.同样在jni目录下建立test.cy.cpp(一定要记得带‘cy’)和Android.mk两个文件;

5.test.cy.cpp内容:

#include <jni.h>
#include "substrate.h"
#include <android/log.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>

#define TAG "HOOKTEST"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)


MSConfig(MSFilterLibrary, "libdvm.so");

bool (*_dvmLoadNativeCode)(char* pathName, void* classLoader, char** detail);

bool fake_dvmLoadNativeCode(char* soPath, void* classLoader, char** detail)
{
    LOGD("fake_dvmLoadNativeCode soPath:%s", soPath);
    return _dvmLoadNativeCode(soPath,classLoader,detail);
}

//Substrate entry point
MSInitialize{
    LOGD("Substrate initialized.");
    MSImageRef image;
    image = MSGetImageByName("/system/lib/libdvm.so"); // 绝对路径
    if (image != NULL)
    {
        LOGD("dvm image: 0x%08X", (void*)image);

        void * dvmload = MSFindSymbol(image, "_Z17dvmLoadNativeCodePKcP6ObjectPPc");
        if(dvmload == NULL)
        {
            LOGD("error find dvmLoadNativeCode.");
        }
        else
        {
            MSHookFunction(dvmload,(void*)&fake_dvmLoadNativeCode,(void **)&_dvmLoadNativeCode);
            LOGD("hook dvmLoadNativeCode sucess.");
        }
    }
    else{
        LOGD("can not find libdvm.");
    }
}
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:= substrate-dvm
LOCAL_SRC_FILES := libsubstrate-dvm.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= substrate
LOCAL_SRC_FILES := libsubstrate.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := test.cy #生成的模块名
LOCAL_SRC_FILES := test.cy.cpp #源文件名
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate
include $(BUILD_SHARED_LIBRARY)
ndk.dir=D\:\\android-ndk-r11

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (21)
雪    币: 729
活跃值: (1340)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
先mark一下,学习
2016-3-25 11:20
0
雪    币: 3603
活跃值: (799)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
正好看这个,好详细呀。
如果要hook的函数的返回类型是个ndk没有的结构怎么办呢
2016-3-25 17:10
0
雪    币: 501
活跃值: (5222)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
赞一个,不错比较详细,新手用的上
2016-3-25 18:20
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享。。。
2016-3-25 18:51
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
那个,为啥文件名字一定要带cy?
2016-3-27 22:16
0
雪    币: 1464
活跃值: (787)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
看网上教程都这么设的,估计是cydia这么要求吧。
2016-3-28 09:14
0
雪    币: 85
活跃值: (51)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
mark
2016-3-28 10:02
0
雪    币: 215
活跃值: (417)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
as各种版本对ndk的支持,简直让人崩溃!
2016-3-28 10:09
0
雪    币: 1464
活跃值: (787)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
是的,真的很让人崩溃,尤其是gradle,想死~
2016-3-28 11:17
0
雪    币: 325
活跃值: (563)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
多谢楼主,其他都是eclipse的,我也折腾一天了,原来楼主折腾了5天4夜,幸好我看到了你的文章
------------------------
楼主,编译成功了,就是hook不成功,可否参考下apk
2016-7-15 10:02
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主 我用 adt bundle +  逍遥安卓模拟器测试 ,CydiaSubstrate  load so 时总是提示  not a valid ELF executable,
发现楼主  用的是 x86 模式, 于是我也换成 x86, 结果就好了, 为什么?为什么 不是arm模式?
2016-8-14 22:56
0
雪    币: 1464
活跃值: (787)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
我是嫌原生模拟器太慢,所以用了海马玩模拟器,逍遥模拟器我没测试过,你原生模拟器试过吗,应该支持ARM的
2016-8-17 09:12
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我还试了 genymotion  模拟器,也是不行,编了网上的几个  demo 插件(arm 模式),安装进模拟器,也是 提示 not a valid ELF executable,  但上真机 跑正常, 应该是 CydiaSubstrate的bug, 搞不懂为啥是x86 模式,没理由,模拟器也应该是arm 模式才对呀
2016-8-18 02:22
0
雪    币: 335
活跃值: (671)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
暂时只有原生模拟器,是arm跑的。。。其它都是x86 => arm,so转换。。。没有做bin转换所以为什么ida pro除了原生模拟器其它都不行。。。
2016-8-22 00:23
0
雪    币: 3712
活跃值: (1736)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
楼主,试了很多遍,编译通过,但是HOOK不成功,求解决
2016-9-4 20:43
0
雪    币: 101
活跃值: (320)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼上编译成功,缺hook不成功的原因是LZ漏说一个步骤:
配置Manifest文件
需要指定权限:cydia.permission.SUBSTRATE

    </application>   
    <uses-permission android:name="cydia.permission.SUBSTRATE"/>   
</manifest>
2016-12-26 12:14
0
雪    币: 101
活跃值: (320)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
另外cpp文件不一定需要*.cy.cpp,而是生成的so文件必须*.cy.so,这个是在Android.mk中指定
2016-12-26 12:21
0
雪    币: 44
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢分享
2016-12-26 14:27
0
雪    币: 467
活跃值: (634)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
先mark一下,学习 ‘’‘’‘
2016-12-26 14:50
0
雪    币: 1464
活跃值: (787)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
21
感谢指正,已做补充。
2016-12-29 10:27
0
雪    币: 130
活跃值: (3483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
提示  not  a  valid  ELF  executable  arm的  可否告知原因啊
2017-2-23 21:59
0
游客
登录 | 注册 方可回帖
返回