簡介
通過android系統自帶的函式android.os.Debug.isDebuggerConnected(),
可以進行判斷是否android的應用程式是否在被除錯狀態,
原理分析
分析android自帶除錯檢測函式isDebuggerConnected()在native的實作;
android系統有兩中模式分別為dalvik模式和art模式,下面分別對這兩種模式下進行做反除錯檢測做決議,
1.dalvik模式下:
通過獲取到行程中libdvm.so中的dvmDbgIsDebuggerConnected()函式介面
通過呼叫該函式就能判斷app程式是否被除錯狀態,
dlopen(/system/lib/libdvm.so)
dlsym(_Z25dvmDbgIsDebuggerConnectedv)
2.art模式下:
在art模式下,結果存放在libart.so中的全域變數gDebuggerActive中,
符號名為_ZN3art3Dbg15gDebuggerActiveE,
但是貌似新版本android不允許使用非ndk原生庫,dlopen(libart.so)會失敗,
有一種麻煩的方法,手動在記憶體中搜索libart模塊,然后手工尋找該全域變數符號,
代碼實作
// dalvik模式下的代碼實作
typedef unsigned char wbool;
typedef wbool (*PPP)();
int NativeIsDBGConnected()
{
void* Handle=NULL;
//呼叫系統函式進行打開so檔案
Handle=dlopen("/system/lib/libdvm.so", RTLD_LAZY);
//打開檔案失敗
if(NULL==Handle)
{
LOGA("dlopen打開libdvm.so失敗!\n");
return -1;
}
//獲取so里面到匯出函式
PPP Fun = (PPP)dlsym(Handle, "_Z25dvmDbgIsDebuggerConnectedv");
//獲取失敗
if(NULL==Fun)
{
LOGA("dlsym獲取_Z25dvmDbgIsDebuggerConnectedv失敗!\n");
return -1;
}
else
{
wbool ret = Fun();
if(1==ret)
{
// 此處判定為除錯模式
LOGA("dalvikm模式,除錯狀態!\n");
return 1;
}
}
return -1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292068.html
標籤:其他
上一篇:Flutter 打包教程
