初探LBE
轉自:http://bbs.byr.cn/article/MobileTerminalAT/4278
?
最近找工作非常心煩,很有“不存在感”,都不知道怎么辦了...?
??
貌似有些輕度失眠,最近晚上不到4點完全睡不著,于是乎趁著睡不著,起來學習一直都夢寐以求的LBE,感覺還是那么遙不可及的技術啊,不過看看總是有收獲的。感覺這兩個晚上還是沒白看,雖然還是那么遙不可及。?
??
首先LBE就不介紹了,Android下面一個安全軟件,不過做得的確很出色,主要就是那一套主動防御的技術。LBE號稱叫做業界最早實現HOOK技術的人,又是Linux,又是ARM...我去,人生是不能洗點的,就這兩點其實就廢掉了,找不到工作也是該的。?
??
安裝完了LBE什么發短信,讀手機卡之類的操作會被攔截下來,這點做得確實霸道。不過結合一下Windows HOOK,還是能夠理解原因的。HOOK嘛,首先要注入,然后就是注入后的事。由于現在出的版本都是很新很新的了,在SO中好多調試鏈接信息都被無情地strip鳥,要逆向真的非常頭大。我估摸著老版本沒有問題,于是在網上找了個可以說是第一版的軟件,但是功能還是足夠的,最為重要的是調試信息,拖到IDA里面就感嘆其意義。?
??
安裝完畢之后里面有兩個BIN,可能版本不同情況也不同,反正作為最老版是這樣:一個叫libloader.so,一個叫libservice.so。相信SO大家都編過,但是這兩個SO,其實不是傳統書上教的那種,因為連個什么對JAVA接口都沒有。不過我還是相信用法嘛,可能是什么System.loadLibrary之類,但是不是...?
??
由AndroidManifest.xml可以知道哪里是入口點,反正就那么找,然后逆向JAVA代碼之后發現了下面這種情況:?
??
??
package com.lbe.security.service.loader;?
...?
String str2 = Integer.toString(Process.myUid());?
arrayOfString[1] = str2;?
Cursor localCursor = localContentResolver.query(localUri, null, null, arrayOfString, null);?
...?
??
??
package com.lbe.security.service.loader;?
??
public Cursor query(...)?
{?
??try?
??{?
???? Runtime localRuntime1 = Runtime.getRuntime();?
???? String str3 = "/system/bin/chmod 755 " + str1 + "/libloader.so";?
???? java.lang.Process localProcess1 = localRuntime1.exec(str3);?
???? try?
???? {?
?????? Runtime localRuntime2 = Runtime.getRuntime();?
?????? String str4 = String.valueOf(str1);?
?????? String str5 = str4 + "/libloader.so " + str2;?
?????? java.lang.Process localProcess2 = localRuntime2.exec(str5);?
?????? l = 4000L;?
???? ......?
}?
??
那就是說,其實這個libloader.so就不是真正的SO而是一個BIN,于是乎一測試就發現了:?
# ./libloader.so?
./libloader.so?
Usage: ./libloader.so euid#?
??
??
至于Usage嘛,那應該是后面接個UID就是了(注意:Process.myUid())。?
??
好吧,那么這個loader真是名副其實的loader,而且也不是屬于那種constructor來混淆你的SO而是真正的BIN。記得Windows注入就是一個EXE一個DLL,那么說另外一個SO就是所謂的“HOOK DLL(SO)”。?
??
還是繼續從loader下手,它HOOK了那些程序?其實從IDA里面的Strings可以看到一堆,不過還有個函數即使在main附近的一個叫find_pid_of,那個里面有個結構體(猜的),里面講到了三個注入過程:?
1、inject_svcmgr(HOOK實際對象是/system/bin/servicemanage),感覺和短信有關?
2、inject_server(HOOK為system_server中的/system/lib/libandroid_runtime.so中的導入表sendmsg),據LBE自己說攔截網絡和那個iptables無關,不過sendmsg似乎是UDP的啊,其它情況呢??
3、inject_phonemgr(HOOK為com.android.phone),打電話?
??
??
不過怎么HOOK都是后話,我覺得第一步還是怎么注入是關鍵。arm匯編著實讓人頭大,不過大致的流程還是能夠看到,在loader中有一個叫inject_remote_process的函數,其就是主要負責注入滴,而另外三個注入過程的函數(inject_svcmgr、inject_server、inject_phonemgr)都路過調用了它,其中傳入的參數有要注入的進程pid以及一個字符串解析值,不過那個解析值直到看libservice.so才明白(有的注釋自己加的):?
??
libloader.so inject_phonemgr CODE:?
??
.text:00008FA4 inject_phonemgr?
.text:00008FA4???????????????? STMFD?? SP!, {R4-R10,LR}?
.text:00008FA8???????????????? LDR???? R4, =(_GLOBAL_OFFSET_TABLE_ - 0x8FBC)?
.text:00008FAC???????????????? LDR???? R6, =0x104?
.text:00008FB0???????????????? SUB???? SP, SP, #0x210?
.text:00008FB4???????????????? ADD???? R4, PC, R4?
.text:00008FB8???????????????? LDR???? R2, [R4,R6]?
.text:00008FBC???????????????? ADD???? R5, SP, #0x10C?
.text:00008FC0???????????????? MOV???? R10, R0?
.text:00008FC4???????????????? LDR???? R3, [R2]?
.text:00008FC8???????????????? MOV???? R7, R1?
.text:00008FCC???????????????? MOV???? R0, R5?
.text:00008FD0???????????????? MOV???? R1, #0x100?
.text:00008FD4???????????????? STR???? R3, [SP,#0x20C]?
.text:00008FD8???????????????? BL??????getcwd?
.text:00008FDC???????????????? MOV???? R0, R5?
.text:00008FE0???????????????? BL??????strlen?
.text:00008FE4???????????????? LDR???? R1, =0xFFFFF7E8 ; "/libservice.so"?
.text:00008FE8???????????????? MOV???? R2, #0xF?
.text:00008FEC???????????????? ADD???? R0, R5, R0?
.text:00008FF0???????????????? ADD???? R1, R4, R1?
.text:00008FF4???????????????? BL??????memcpy?
.text:00008FF8???????????????? MOV???? R0, R5?
.text:00008FFC???????????????? MOV???? R1, #0?
.text:00009000???????????????? BL??????access?
.text:00009004???????????????? CMP???? R0, #0?
.text:00009008???????????????? BNE???? loc_9094?
.text:0000900C???????????????? MOV???? R0, R7?
.text:00009010???????????????? BL??????get_thread_list?
.text:00009014???????????????? MOV???? R9, R0?
.text:00009018???????????????? BL??????getpid?
.text:0000901C???????????????? LDR???? R1, =0xFFFFF830 ; "func=%d,sec_uid=%d,sec_pid=%d"?
.text:00009020???????????????? ADD???? R8, SP, #0xC?
.text:00009024???????????????? STR???? R0, [SP]?
.text:00009028???????????????? ADD???? R1, R4, R1?
.text:0000902C???????????????? MOV???? R3, R10?
.text:00009030???????????????? MOV???? R2, #3?
.text:00009034???????????????? MOV???? R0, R8?
.text:00009038???????????????? BL??????sprintf?
.text:0000903C???????????????? LDR???? R12, =0xFFFFF850 ; "hook_entry"?
.text:00009040???????????????? MOV???? R0, R7?
.text:00009044???????????????? MOV???? R1, R5?
.text:00009048???????????????? ADD???? R2, R4, R12?
.text:0000904C???????????????? MOV???? R3, R8?
.text:00009050???????????????? BL??????inject_remote_process?
.text:00009054???????????????? CMP???? R0, #0?
.text:00009058???????????????? BNE???? loc_9084?
??
??
??
??
libservice.so hook_entry CODE:?
??
.text:00010560???????????????? EXPORT hook_entry?
.text:00010560 hook_entry?
.text:00010560?
.text:00010560 var_20??????????= -0x20?
.text:00010560 var_14??????????= -0x14?
.text:00010560 var_10??????????= -0x10?
.text:00010560 var_C?????????? = -0xC?
.text:00010560 var_4?????????? = -4?
.text:00010560?
.text:00010560???????????????? STR???? LR, [SP,#var_4]!?
.text:00010564???????????????? LDR???? R12, =($_GLOBAL_OFFSET_TABLE_ - 0x10578)?
.text:00010568???????????????? LDR???? R1, =(aFuncDSec_uidDS - 0x1DF20)?
.text:0001056C???????????????? SUB???? SP, SP, #0x1C?
.text:00010570???????????????? ADD???? R12, PC, R12?
.text:00010574???????????????? ADD???? R3, SP, #0x20+var_10?
.text:00010578???????????????? ADD???? LR, SP, #0x20+var_14?
.text:0001057C???????????????? ADD???? R1, R12, R1???? ; "func=%d,sec_uid=%d,sec_pid=%d"?
.text:00010580???????????????? ADD???? R2, SP, #0x20+var_C?
.text:00010584???????????????? STR???? LR, [SP,#0x20+var_20]?
.text:00010588???????????????? BL??????sscanf?
.text:0001058C???????????????? LDR???? R3, [SP,#0x20+var_C]?
.text:00010590???????????????? CMP???? R3, #2????;2號????hook_server?
.text:00010594???????????????? BEQ???? loc_105D4?
.text:00010598???????????????? CMP???? R3, #3????;3號????hook_phonemgr?
.text:0001059C???????????????? BEQ???? loc_105C4?
.text:000105A0???????????????? CMP???? R3, #1????;1號????hook_svcmgr?
??
??
就是注入進去之后然后調用的hook_entry代碼了,至于這個傳入的"func=%d,sec_uid=%d,sec_pid=%d"被sscanf解析了,func ID不說了,sec_uid應該是來自JAVA代碼的myUid,而pid就是進程吧。?
??
??
inject_remote_process是亮點啊,我是完全對Linux不懂,而且ARM也不懂,真麻煩。其大致的過程是:?
1、首先ATTACH(附加進程)?
??
2、然后GETREGS(讀那個進程寄存器,這里是ARM匯編,不是X86):?
#ifndef __ASSEMBLY__?
??
struct pt_regs {?
??long uregs[18];?
};?
??
#define ARM_cpsr uregs[16]?
#define ARM_pc uregs[15]?
#define ARM_lr uregs[14]?
#define ARM_sp uregs[13]?
#define ARM_ip uregs[12]?
#define ARM_fp uregs[11]?
#define ARM_r10 uregs[10]?
#define ARM_r9 uregs[9]?
#define ARM_r8 uregs[8]?
#define ARM_r7 uregs[7]?
#define ARM_r6 uregs[6]?
#define ARM_r5 uregs[5]?
#define ARM_r4 uregs[4]?
#define ARM_r3 uregs[3]?
#define ARM_r2 uregs[2]?
#define ARM_r1 uregs[1]?
#define ARM_r0 uregs[0]?
#define ARM_ORIG_r0 uregs[17]?
??
3、注入代碼POKETEXT(dlopen dlsym dlclose)?
??
4、設置寄存器SETREGS(這里有結構體,由于不熟悉ARM,但是粗略猜測這里可能是ARM_lr,因為BX LR嘛)?
??
5、運行CONT?
??
嗯,也就說就目前這種寫法上看,我需要在自己寫的測試so里面有個hook_entry供調用才行,并且函數格式還得對。不過如果不考慮這些,就用它自己提供的兩個SO,在不啟動LBE主進程的情況下,進行測試,對象為/system/bin/servermanager...?
??
這是servermanager沒有運行loader之前的情況(查看maps文件):?
00008000-0000a000 r-xp 00000000 1f:00 564????????/system/bin/servicemanager?
0000a000-0000b000 rwxp 00002000 1f:00 564????????/system/bin/servicemanager?
0000b000-0000c000 rwxp 0000b000 00:00 0??????????[heap]?
40000000-40008000 r-xs 00000000 00:07 188????????/dev/ashmem/system_properties (deleted)?
40008000-40028000 r-xp 00000000 00:0a 53???????? /dev/binder?
40028000-40029000 r-xp 40028000 00:00 0?
afa00000-afa03000 r-xp 00000000 1f:00 364????????/system/lib/liblog.so?
afa03000-afa04000 rwxp 00003000 1f:00 364????????/system/lib/liblog.so?
afb00000-afb20000 r-xp 00000000 1f:00 419????????/system/lib/libm.so?
afb20000-afb21000 rwxp 00020000 1f:00 419????????/system/lib/libm.so?
afc00000-afc01000 r-xp 00000000 1f:00 356????????/system/lib/libstdc++.so?
afc01000-afc02000 rwxp 00001000 1f:00 356????????/system/lib/libstdc++.so?
afd00000-afd3f000 r-xp 00000000 1f:00 368????????/system/lib/libc.so?
afd3f000-afd42000 rwxp 0003f000 1f:00 368????????/system/lib/libc.so?
afd42000-afd4d000 rwxp afd42000 00:00 0?
b0001000-b000c000 r-xp 00001000 1f:00 615????????/system/bin/linker?
b000c000-b000d000 rwxp 0000c000 1f:00 615????????/system/bin/linker?
b000d000-b0016000 rwxp b000d000 00:00 0?
beb4c000-beb61000 rwxp befeb000 00:00 0??????????[stack]?
??
??
這是運行之后的情況:?
00008000-0000a000 r-xp 00000000 1f:00 564????????/system/bin/servicemanager?
0000a000-0000b000 rwxp 00002000 1f:00 564????????/system/bin/servicemanager?
0000b000-00011000 rwxp 0000b000 00:00 0??????????[heap]?
40000000-40008000 r-xs 00000000 00:07 188????????/dev/ashmem/system_properties (deleted)?
40008000-40028000 r-xp 00000000 00:0a 53???????? /dev/binder?
40028000-40029000 r-xp 40028000 00:00 0?
40029000-4002d000 rwxp 40029000 00:00 0?
80000000-8001b000 r-xp 00000000 1f:01 484????????/data/data/com.lbe.security/lib/libservice.so?
8001b000-8001f000 rwxp 0001b000 1f:01 484????????/data/data/com.lbe.security/lib/libservice.so?
a8100000-a8124000 r-xp 00000000 1f:00 373????????/system/lib/libutils.so?
a8124000-a8125000 rwxp 00024000 1f:00 373????????/system/lib/libutils.so?
a8200000-a821f000 r-xp 00000000 1f:00 442????????/system/lib/libbinder.so?
a821f000-a8225000 rwxp 0001f000 1f:00 442????????/system/lib/libbinder.so?
af700000-af713000 r-xp 00000000 1f:00 395????????/system/lib/libz.so?
af713000-af714000 rwxp 00013000 1f:00 395????????/system/lib/libz.so?
af900000-af90e000 r-xp 00000000 1f:00 372????????/system/lib/libcutils.so?
af90e000-af90f000 rwxp 0000e000 1f:00 372????????/system/lib/libcutils.so?
af90f000-af91e000 rwxp af90f000 00:00 0?
afa00000-afa03000 r-xp 00000000 1f:00 364????????/system/lib/liblog.so?
afa03000-afa04000 rwxp 00003000 1f:00 364????????/system/lib/liblog.so?
afb00000-afb20000 r-xp 00000000 1f:00 419????????/system/lib/libm.so?
afb20000-afb21000 rwxp 00020000 1f:00 419????????/system/lib/libm.so?
afc00000-afc01000 r-xp 00000000 1f:00 356????????/system/lib/libstdc++.so?
afc01000-afc02000 rwxp 00001000 1f:00 356????????/system/lib/libstdc++.so?
afd00000-afd3f000 r-xp 00000000 1f:00 368????????/system/lib/libc.so?
afd3f000-afd42000 rwxp 0003f000 1f:00 368????????/system/lib/libc.so?
afd42000-afd4d000 rwxp afd42000 00:00 0?
b0001000-b000c000 r-xp 00001000 1f:00 615????????/system/bin/linker?
b000c000-b000d000 rwxp 0000c000 1f:00 615????????/system/bin/linker?
b000d000-b0016000 rwxp b000d000 00:00 0?
beb4c000-beb61000 rwxp befeb000 00:00 0??????????[stack]?
??
??
哎,就到這里吧,晚上筆試中興完了繼續學習吧...主要就是把inject_remote_process實現出來差不多了。?
總結
- 上一篇: titan框架的使用_如何设置和使用Go
- 下一篇: 房屋征收拆迁信息化管理平台