首页
社区
课程
招聘
FakeXposed最强屏蔽Xposed、Root检测,自定义maps、文件重定向等支持Android5~11
发表于: 2021-2-22 10:42 37716

FakeXposed最强屏蔽Xposed、Root检测,自定义maps、文件重定向等支持Android5~11

2021-2-22 10:42
37716

一个通用多功能的 Xposed 隐藏器,采用 NativeJava 结合来做到双向屏蔽检测,提供高度自由化为每个应用配置不同属性。它不仅仅局限于屏蔽 Xposed 检测,还提供更多更加高级的功能,如 maps 文件自定义屏蔽各种检测、完整的文件重定向功能、访问权限控制、JNI 方法监控、动态符号查找屏蔽 dlsym 等等,还可以提供给其它模块在进程内动态添加或修改配置。开源地址 https://github.com/sanfengAndroid/FakeXposed 目前问题还较多不够稳定,欢迎加群讨论

Java 调用 System.getenv()System.getenv(String) 源码如下

其最终调用两个函数 Libcore.os.environ()Libcore.os.getenv(String)

不同版本 Libcore.os 的实现对象类名不一样,但是区别很小,而 native 中访问到是 libc 导出变量 environ、导出函数 getenv,因此通过 Native Hook 拦截 getenv 函数即可拦截对应 Java System.getenv(String)调用,而 System.getenv() 调用是直接使用 environ 变量,因此暂时采用Java Hook替换该Map对象,通常情况下应用是很少使用到 System.getenv 非系统环境变量的,一些软件检测才会使用,因此后续可能会直接修改 environ 变量中的值

Java 反射使用 SystemProperties.get 系列方法

调用 android_os_SystemProperties.cpp 中的方法

而它调用了 libc.so 中的 __system_property_find__system_property_read_callback,在低版本中获取属性也使用到了 __system_property_get 方法,因此采用 Native Hook 以上这三个方法,这里也要注意不同版本在不同动态库中实现

根据代码位置猜测,或者直接在 maps 文件里面查找哪些已经加载的可疑的库,目前查找到系统有关的库包含如下几个

如果有遗漏的库可以调用 NativeHook.relinkLibrary() 重新重定位该库

查看 FakeXposed 说明文档

static volatile IPackageManager sPackageManager;
public static IPackageManager getPackageManager() {
  if (sPackageManager != null) {
      return sPackageManager;
  }
  final IBinder b = ServiceManager.getService("package");
  sPackageManager = IPackageManager.Stub.asInterface(b);
  return sPackageManager;
}
static volatile IPackageManager sPackageManager;
public static IPackageManager getPackageManager() {
  if (sPackageManager != null) {
      return sPackageManager;
  }
  final IBinder b = ServiceManager.getService("package");
  sPackageManager = IPackageManager.Stub.asInterface(b);
  return sPackageManager;
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
  new Singleton<IActivityManager>() {
      @Override
      protected IActivityManager create() {
          final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
          final IActivityManager am = IActivityManager.Stub.asInterface(b);
          return am;
      }
  };
private static final Singleton<IActivityManager> IActivityManagerSingleton =
  new Singleton<IActivityManager>() {
      @Override
      protected IActivityManager create() {
          final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
          final IActivityManager am = IActivityManager.Stub.asInterface(b);
          return am;
      }
  };
public static java.util.Map<String,String> getenv() {
  SecurityManager sm = getSecurityManager();
  if (sm != null) {
      sm.checkPermission(new RuntimePermission("getenv.*"));
  }
 
  return ProcessEnvironment.getenv();
}
public static String getenv(String name) {
  if (name == null) {
      throw new NullPointerException("name == null");
  }
 
  return Libcore.os.getenv(name);
}
public static java.util.Map<String,String> getenv() {
  SecurityManager sm = getSecurityManager();
  if (sm != null) {
      sm.checkPermission(new RuntimePermission("getenv.*"));
  }
 
  return ProcessEnvironment.getenv();
}
public static String getenv(String name) {
  if (name == null) {
      throw new NullPointerException("name == null");
  }
 
  return Libcore.os.getenv(name);
}
public final class Libcore {
  private Libcore() { }
  public static final Os rawOs = new Linux();
  public static volatile Os os = new BlockGuardOs(rawOs);
  ...
}
 
public final class Linux implements Os {
  Linux() { }
  public native String getenv(String name);
  public native String[] environ();
  ...
}
public final class Libcore {
  private Libcore() { }
  public static final Os rawOs = new Linux();
  public static volatile Os os = new BlockGuardOs(rawOs);
  ...
}
 
public final class Linux implements Os {
  Linux() { }
  public native String getenv(String name);
  public native String[] environ();
  ...
}
@NonNull
@SystemApi
public static String get(@NonNull String key, @Nullable String def) {
    if (TRACK_KEY_ACCESS) onKeyAccess(key);
    return native_get(key, def);
}
...
@FastNative
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native String native_get(String key, String def);
@NonNull
@SystemApi
public static String get(@NonNull String key, @Nullable String def) {
    if (TRACK_KEY_ACCESS) onKeyAccess(key);
    return native_get(key, def);
}
...
@FastNative
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native String native_get(String key, String def);
template<typename Functor>
void ReadProperty(const prop_info* prop, Functor&& functor)
{
#if defined(__BIONIC__)
    auto thunk = [](void* cookie,
                    const char* /*name*/,
                    const char* value,
                    uint32_t /*serial*/) {
        std::forward<Functor>(*static_cast<Functor*>(cookie))(value);
    };
    __system_property_read_callback(prop, thunk, &functor);
#else
    LOG(FATAL) << "fast property access supported only on device";
#endif
}
 
template<typename Functor>
void ReadProperty(JNIEnv* env, jstring keyJ, Functor&& functor)
{
    ScopedUtfChars key(env, keyJ);
    if (!key.c_str()) {
        return;
    }
#if defined(__BIONIC__)
    const prop_info* prop = __system_property_find(key.c_str());
    if (!prop) {
        return;
    }
    ReadProperty(prop, std::forward<Functor>(functor));
#else
    std::forward<Functor>(functor)(
        android::base::GetProperty(key.c_str(), "").c_str());
#endif
}
 
jstring SystemProperties_getSS(JNIEnv* env, jclass clazz, jstring keyJ,
                             jstring defJ)
{
    jstring ret = defJ;
    ReadProperty(env, keyJ, [&](const char* value) {
        if (value[0]) {
            ret = env->NewStringUTF(value);
        }
    });
    if (ret == nullptr && !env->ExceptionCheck()) {
      ret = env->NewStringUTF("");  // Legacy behavior
    }
    return ret;
}
 
int register_android_os_SystemProperties(JNIEnv *env)
{
    const JNINativeMethod method_table[] = {
        { "native_get",
          "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
          (void*) SystemProperties_getSS },
        { "native_get_int", "(Ljava/lang/String;I)I",
          (void*) SystemProperties_get_integral<jint> },
        { "native_get_long", "(Ljava/lang/String;J)J",
          (void*) SystemProperties_get_integral<jlong> },
        { "native_get_boolean", "(Ljava/lang/String;Z)Z",
          (void*) SystemProperties_get_boolean },
        { "native_find",
          "(Ljava/lang/String;)J",
          (void*) SystemProperties_find },
        { "native_get",
          "(J)Ljava/lang/String;",
          (void*) SystemProperties_getH },
        { "native_get_int", "(JI)I",
          (void*) SystemProperties_get_integralH<jint> },
        { "native_get_long", "(JJ)J",
          (void*) SystemProperties_get_integralH<jlong> },
        { "native_get_boolean", "(JZ)Z",
          (void*) SystemProperties_get_booleanH },
        { "native_set", "(Ljava/lang/String;Ljava/lang/String;)V",
          (void*) SystemProperties_set },
        { "native_add_change_callback", "()V",
          (void*) SystemProperties_add_change_callback },
        { "native_report_sysprop_change", "()V",
          (void*) SystemProperties_report_sysprop_change },
    };
    return RegisterMethodsOrDie(env, "android/os/SystemProperties",
                                method_table, NELEM(method_table));
}
template<typename Functor>
void ReadProperty(const prop_info* prop, Functor&& functor)
{
#if defined(__BIONIC__)
    auto thunk = [](void* cookie,
                    const char* /*name*/,
                    const char* value,
                    uint32_t /*serial*/) {
        std::forward<Functor>(*static_cast<Functor*>(cookie))(value);
    };
    __system_property_read_callback(prop, thunk, &functor);
#else
    LOG(FATAL) << "fast property access supported only on device";
#endif
}
 
template<typename Functor>
void ReadProperty(JNIEnv* env, jstring keyJ, Functor&& functor)
{
    ScopedUtfChars key(env, keyJ);
    if (!key.c_str()) {
        return;
    }
#if defined(__BIONIC__)
    const prop_info* prop = __system_property_find(key.c_str());
    if (!prop) {
        return;
    }
    ReadProperty(prop, std::forward<Functor>(functor));
#else
    std::forward<Functor>(functor)(
        android::base::GetProperty(key.c_str(), "").c_str());
#endif
}
 
jstring SystemProperties_getSS(JNIEnv* env, jclass clazz, jstring keyJ,
                             jstring defJ)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-2-23 12:48 被北辰制作编辑 ,原因: 添加问题说明
收藏
免费 28
支持
分享
最新回复 (41)
雪    币: 192
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
坏蛋
2021-2-22 17:53
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
太强了,火钳刘明
2021-2-22 18:57
0
雪    币: 529
活跃值: (1015)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
牛批  感谢分享  respect
2021-2-23 00:17
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持一下
2021-2-23 02:33
0
雪    币: 198
活跃值: (616)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
厉害 支持
2021-2-23 09:10
0
雪    币: 4953
活跃值: (19055)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
7
感谢分享 赞
2021-2-23 09:29
0
雪    币: 1867
活跃值: (4073)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
这才是真的强,老板多放点儿这种有料的东西出来啊
2021-2-23 11:03
0
雪    币: 1229
活跃值: (694)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
支持 太赞了
2021-2-23 11:06
0
雪    币: 3126
活跃值: (3386)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
道行太浅,只能瑞斯拜
2021-2-23 11:43
0
雪    币: 1478
活跃值: (846)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
道行太浅,只能瑞斯拜
2021-2-23 16:20
0
雪    币: 1263
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
太强了吧,大佬,支持一下!有成品就更好啦,小白一枚!
2021-2-23 17:15
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
13
666666666
2021-2-23 17:33
0
雪    币: 173
活跃值: (3831)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
想知道fake-linker的具体实现原理,或者能够给点相关文档博客之类的吗?
2021-2-23 20:06
0
雪    币: 3442
活跃值: (2517)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
https://sanfengandroid.github.io/2021/01/10/modify-linker-to-implement-plt-hook/   fake-linker的实现原理,github上面也有链接
2021-2-23 20:36
0
雪    币: 416
活跃值: (255)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
优秀
2021-2-23 23:39
0
雪    币: 3098
活跃值: (4222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
火钳留名
2021-2-24 08:47
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不错
2021-2-24 14:58
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
牛批
2021-2-25 11:00
0
雪    币: 6124
活跃值: (4716)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
20
支持
2021-2-25 15:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
我这里把大神的项目编译成了 成品   
https://download.csdn.net/download/weixin_45691961/15485774
2021-2-27 11:18
0
雪    币: 7
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
厉害
2021-3-1 10:31
0
雪    币: 92
活跃值: (508)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
牛逼、牛逼、太牛逼
2021-3-1 13:59
0
雪    币: 209
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
牛逼 留个脚印
2021-3-2 04:13
0
雪    币:
活跃值: (854)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
太极好像适配不上,不支持还
2021-3-5 11:00
0
游客
登录 | 注册 方可回帖
返回
//