等等,不過裡面的很多手段都能通過改寫rom或者xposed作假,讓判斷的效能打折扣。其實,現在絕大部分手機都是基於arm架構,可以將其他cpu架構給忽略不計,模擬器全部執行在pc上,因此,只需要判斷是執行的裝置否是arm架構即可。
arm與pc的x86在架構上有很大區別,arm採用的哈弗架構將指令儲存跟資料儲存分開,與之對應的,arm的一級快取分為i-cache(指令快取)與d-cahce(資料快取),而x86只有一塊快取,如果我們將一段**可執行**動態對映到記憶體,在執行的時候,x86架構上是可以修改這部分**的,而arm的i-cache可以看做是唯讀,因為,當我們往pc對應的位址寫指令的時候,其實是往d-cahce寫,而i-cache中的指令並未被更新,這樣,兩端程式就會在arm與x86上有不同的表現,根據計算結果便可以知道究竟是還在哪個平台上執行。但是,無論是x86還是arm,只要是靜態編譯的程式,都沒有修改**段的許可權,所以,首先需要將上面的彙編**翻譯成可執行檔案,再需要申請一塊記憶體,將可執行**段對映過去,執行。 以下實現**是測試**的核心,主要就是將位址e2844001的指令add r4, r4, #1,在執行中動態替換為e2877001的指令add r7, r7, #1,這裡目標是arm-v7架構的,要注意它採用的是**流水,pc值=當前程式執行位置+8。通過arm交叉編譯鏈編譯出的可執行**如下:
8410: e92d41f0 push
8414: e3a07000 mov r7, #0
8418: e1a0800f mov r8, pc // 本平台針對arm7,**流水 pc值=當前程式執行位置+8
841c: e3a04000 mov r4, #0
8420: e2877001 add r7, r7, #1
....
842c: e1a0800f mov r8, pc
8430: e248800c sub r8, r8, #12 // pc值=當前程式執行位置+8
8434: e5885000 str r5, [r8]
8438: e354000a cmp r4, #10
843c: aa000002 bge 844c .....
複製**
如果是在arm上執行,e2844001處指令無法被覆蓋,最終執行的是add r4,#1,而在x86平台上,執行的是add r7,#1,**執行完畢, r0的值在模擬器上是1,而在真機上是10。之後,將上述可執行**通過mmap,對映到記憶體並執行即可,具體做法如下,將可執行的二進位制**直接拷貝可執行**區,去執行
void (*asmcheck)(void);
int detect()
複製**
經驗證, 無論是android自帶的模擬器,還是夜神模擬器,或者genymotion造假的模擬器,都能準確識別。在32位真機上完美執行,但是在64位的真機上可能會存在相容性問題,可能跟arm64-v8a的指令集不同有關係,也希望人能指點。為了防止在真機上出現崩潰,最好還是單獨開乙個程序服務,利用binder實現模擬器鑑別的查詢。
qemu emulation detection
dexlabs
Android惡意軟體模擬器檢測技術
前言 下面的報告來自sophoslabs實驗室的android安全專家陳宇,還有來自android組的成員william lee,jagadeesh chandraiah and ferenc l szl nagy的幫助。隨著android惡意軟體的數量的持續增長,它緊隨windows下的應用採用的...
Android 模擬器錯誤
啟動android模擬器時.有時會報the connection to adb is down,and a severe error has occured.的錯誤.在說在任務管理器上把所有adb.exe關閉掉.重啟eclipse.但試過不管用.所以在外國 上找到一種可行的方法 1.先把eclips...
Android模擬器的使用
android模擬器的使用 一 90度旋轉模擬器 快捷鍵 ctrl f11 或 ctrl f12 二 在模擬器中安裝apk 首先要執行模擬器,否則就有如下錯誤 error device not found.等模擬器啟動後,終端執行platform tools adb adb install apk ...