美文网首页android进阶版
借鸡生蛋之SandHook的使用(一)

借鸡生蛋之SandHook的使用(一)

作者: fenfei331 | 来源:发表于2020-12-23 21:15 被阅读0次

一、目标

不管是通过rpc调用签名还是模拟执行,都有一个小小的问题,那就是没有在真机环境下直接调用so来算签名来的快。

所以我们今天的目标是尝试在Android系统下直接调用目标App的so文件来做签名。

二、步骤

先从一个假想的例子说起

extern "C" JNIEXPORT jstring JNICALL
Java_com_fenfei_loadso_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject obj) {

    jclass cls = env->GetObjectClass(obj);
    jmethodID mid = env->GetMethodID(cls, "getPackageManager",
                                     "()Landroid/content/pm/PackageManager;");

    mid = env->GetMethodID(cls, "getPackageName", "()Ljava/lang/String;");//
    jstring packageName = (jstring) env->CallObjectMethod(obj, mid);

    const char* str;
    str = env->GetStringUTFChars(packageName, NULL);
    env->ReleaseStringUTFChars(packageName, str);

    std::string strRc = "ok";
    if( strcmp(str,"com.fenfei.demo") != 0){
        strRc = "OMG";
    }


    return env->NewStringUTF(strRc.c_str());
}

这个so在它的 stringFromJNI 的函数中获取了当前包名,判断是自己的包名就返回 OK,如果不是就返回 OMG

我们直接load这so,调用它的 stringFromJNI 函数,毫不意外,它的返回值是 OMG

omg.png

SandHook的使用

那么要让它返回正确的 OK,有如下几种方法:

1、 getPackageName函数恰好是可以重写的,那么重写 MainActivity 类的 getPackageName 函数直接返回 "com.fenfei.demo"
2、 Hook Native层 strcmp 函数,把比较的返回值改写成成功
3、Hook Java层 getPackageName 函数,来返回 "com.fenfei.demo"

今天我们使用最后一种方法,Hook Java层 getPackageName。

本次用的Hook库是 SandHook

导入SandHook库

在 app/build.gradle 中增加 implementation 'com.swift.sandhook:hooklib:4.2.1'

增加MyApp类,初始化SandHook

import android.app.Application;

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        try {
            SandHook.addHookClass(
                    MainActivityHooker.class);
        } catch (HookErrorException e) {
            e.printStackTrace();
        }

    }
}

记得在 AndroidManifest.xml 中增加 android:name=".MyApp"

增加MainActivityHooker类,Hook getPackageName函数

@HookClass(ContextWrapper.class)
public class MainActivityHooker {

    @HookMethodBackup("getPackageName")
    static Method onGetPackageNameBackup;

    @HookMethod("getPackageName")
    public static String onGetPackageName(@ThisObject ContextWrapper thiz) throws Throwable {
        String strPkg = (String)SandHook.callOriginByBackup(onGetPackageNameBackup, thiz);
 
        if (thiz.getClass().equals(MainActivity.class)){
            Log.e("MainActivityHooker", thiz + "hooked getPackageName success rc= com.fenfei.demo");
            return "com.fenfei.demo";
        }else{
            return strPkg;
        }
 
    }
}

好了,这次so就以为自己还是运行在com.fenfei.demo之下正常的返回 OK

ok.png

https://github.com/fenfei331/SandHookDemo

三、总结

借鸡生蛋要了解鸡的心理,让它以为还在自己家,它可能东看看西看看,这时候千万要小心把周围都模拟出来。然后它才会乖乖的下蛋。

相关文章

  • 借鸡生蛋之SandHook的使用(一)

    一、目标 不管是通过rpc调用签名还是模拟执行,都有一个小小的问题,那就是没有在真机环境下直接调用so来算签名来的...

  • Android SandHook 使用

    Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入一般都是用于拦...

  • Android 逆向有时候Hook不到的原因

    参考摘要[https://github.com/asLody/SandHook/blob/master/doc/d...

  • 2018-12-07

    借鸡生蛋,就是借助他人的力量,来实现自己的目标. “借鸡生蛋”是所有投资者最好的赚钱方式之一。比方说,我在年初借人...

  • SandHook Native Inline Hook

    前言 以前用的Android inline Hook项目一直有一个问题就是不支持64位的架构。所以这里再介绍一下S...

  • 借鸡生蛋

    恍然发现,已经快20天没写东西了,坚持就这么困难? 昨天看到一篇文章,叫做结构化思维。 结构化思维可以后天训练而成...

  • 借鸡生蛋

    有时候在想,如若借鸡生蛋,是好办法,为什么现实中很少出现呢,我从小长在农村,鸡是见了不少,但很少有人,借鸡,...

  • 借鸡生蛋

    借用别人的房子转手出租来挣钱 虽然说得容易,但是要当二房东,还是有一些坑需要注意的。 1 需要事先取得大房东的同意...

  • 借鸡生蛋

    听完一一老师的权利争斗课程,我对夫妻关系的相处模式又有了更深刻的领悟。 佛说,前世五百次的回睦,才能换来今生的擦肩...

  • 借鸡生蛋

    希而顿年轻时是一个很想发财的青年,有一天,他发现了一个很好的赚钱机会——建高档次的旅店。 因为他在一条相当繁华后街...

网友评论

    本文标题:借鸡生蛋之SandHook的使用(一)

    本文链接:https://www.haomeiwen.com/subject/nuwunktx.html