Unidbg
中跑so
如果获取了环境变量 并不会有任何提示 就算这个环境变量不存在
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;
}
});
}
- 没有获取到 也正常执行完
- 所以我这里解决方式就是 不管什么
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;
}
});
}
public void call_setenv(Module module, String key, String value) {
Symbol setenv = module.findSymbolByName("setenv", true);
setenv.call(emulator, key, value);
}