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

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

一、目标


不管是通过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


27.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库是 github.com/ganyao114/S…


导入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


28.png

github.com/fenfei331/S…


三、总结


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


本篇教程是开胃菜,也是基础。下一篇才是真正的实战


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号 奋飞安全 ,最新技术干货实时推送



相关文章
|
6月前
|
安全 Android开发
Android13 Root实现和原理分析
Android13 Root实现和原理分析
600 0
|
iOS开发
iOS 逆向编程(十三)PS命令获取进程PID与名称(Process Status)
iOS 逆向编程(十三)PS命令获取进程PID与名称(Process Status)
243 0
|
算法 数据安全/隐私保护 索引
App逆向百例|09|某App hkey分析还原
App逆向百例|09|某App hkey分析还原
316 0
|
消息中间件 缓存 安全
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(下)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
1592 0
|
SQL 关系型数据库 MySQL
SyncNavigator数据库同步软件8.4.1 中文版
SyncNavigator是一款专门用于SqlServer、Mysql数据同步的软件,由国内顶级开发团队开发完成,经历8年逐步完善,目前具备强大的数据同步功能,国内很多大型连锁超市,企业,公司都在用SyncNavigator数据同步软件进行着数据同步服务。
4656 0
App逆向百例|18|某A系防护SO跳转修复
App逆向百例|18|某A系防护SO跳转修复
533 0
|
6月前
|
存储 安全 C++
【C++ 包装器类 std::optional】全面入门指南:深入理解并掌握C++ std::optional的实用技巧与应用
【C++ 包装器类 std::optional】全面入门指南:深入理解并掌握C++ std::optional的实用技巧与应用
252 0
|
缓存 IDE Go
记一次go module的坑
事情是这样的,因为小马本次要写一个go项目。但是因为一些权限问题,一些依赖包在内网小马获取不到,于是只能求助大大。大大给的策略就是他先把所有的依赖包go mod,然后go mod vendor迁移到项目目录vendor下进行本地依赖载入即可,也就是使用 go build -mod=vendor来编译即可。一切似乎看起来还是那么完美。然后正要起飞,直接翻车,现场如下。【这里插播一条发现,就是使用golang IDE go build 和使用命令行go build 的区别在于前者不会生成.exe文件】
422 0
记一次go module的坑
|
存储 安全 关系型数据库
无影云桌面,搭建一个属于自己的云上主机
在未来,云主机会成为越来越重要的计算资源之一。目前,云计算已经成为了IT行业的一个热点,越来越多的企业和个人开始使用云计算来提高工作效率和降低IT成本。在这种趋势下,云主机将会成为越来越重要的计算资源之一!
896 1
|
Linux Go Windows
go windows编译linux可执行文件
go windows编译linux可执行文件
8136 0