嘘~ 正在从服务器偷取页面 . . .

Unidbg检测之Env


  • Unidbg中跑so如果获取了环境变量 并不会有任何提示 就算这个环境变量不存在
    • 如果开发者做了检测 就难以察觉

// 在java层设置环境变量
try {

    Os.setenv("ass", "env success", true);
} catch (ErrnoException e) {
    e.printStackTrace();
}
void GetEnv(){
    const char *value = getenv("ass");
    if(value == nullptr){
        value = "执行错误";
    }
    LOG_I("%s", value);
}
  • so放在Unidbg中跑 并不会有任何异常信息 就算Info日志等级

  • 因为上面使用了Log_I所以进行Hook看一下输出是什么
public void hook_android_log_print(Module module) {
    emulator.attach().addBreakPoint(module.findSymbolByName("__android_log_print").getAddress(), new BreakPointCallback() {
        @Override
        public boolean onHit(Emulator<?> emulator, long address) {
            RegisterContext context = emulator.getContext();
            log("调用 __android_log_print" + " | Level -> " + context.getIntArg(0) + " | TAG -> " + context.getPointerArg(1).getString(0) + " | Placeholder -> " + context.getPointerArg(2).getString(0) + " | info -> " + context.getPointerArg(3).getString(0));
            return true;
        }
    });
}

// 调用 __android_log_print | Level -> 4 | TAG -> AssA | Placeholder -> %s | info -> 执行错误
  • 没有获取到 也正常执行完
  • 所以我这里解决方式就是 不管什么so我都hook getEnv
public void hook_getenv(Module module) {
    emulator.attach().addBreakPoint(module.findSymbolByName("getenv").getAddress(), new BreakPointCallback() {
        @Override
        public boolean onHit(Emulator<?> emulator, long address) {
            String key = emulator.getContext().getPointerArg(0).getString(0);
            log("调用 getenv" + " | key -> " + key);
            return true;
        }
    });
}
  • 当我获取到Hook到之后 进行补齐环境变量
public void call_setenv(Module module, String key, String value) {
    Symbol setenv = module.findSymbolByName("setenv", true);
    setenv.call(emulator, key, value);
}

// 调用 __android_log_print | Level -> 4 | TAG -> AssA | Placeholder -> %s | info -> env success

文章作者: 林木木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林木木 !
评论