LBE 隐私卫士原理分析
LBE 是業(yè)界比較出名的 Android 軟件。對(duì)作者的能力深感佩服,同時(shí)抱著學(xué)習(xí)的態(tài)度,需要研究一下這個(gè)軟件工作原理。請(qǐng)看分析過(guò)程!
?
看運(yùn)行現(xiàn)象:
因?yàn)樗菙r截權(quán)限的,所以第一時(shí)間看系統(tǒng)服務(wù),發(fā)現(xiàn)在系統(tǒng)服務(wù)中出現(xiàn)了三個(gè)服務(wù)
1.? sec_controller_phone
2. com.lbe.security.service.IFirewallService
3. sec_controller_main
?
看程序的“異常”情況
servicemanager、system_server、phone 三個(gè)進(jìn)程被加載了 libservice.so 動(dòng)態(tài)庫(kù)
?
我們打開(kāi) APK 包,不難發(fā)現(xiàn),和普通的程序有很多類(lèi)似的東西,就不看了,主要在 libs 下有三個(gè) so 庫(kù)
?
1.? libloader.so
??? 根據(jù)以往經(jīng)驗(yàn)這個(gè)是用來(lái)裝載的,應(yīng)該是注入進(jìn)程的,進(jìn)程應(yīng)該是上面的 servicemanager、system_server、phone
2. libservice.so
??? 是被目標(biāo)程序所加載
3. 其它暫時(shí)不關(guān)注
?
注入過(guò)程不研究,如果讓我實(shí)現(xiàn)這樣的權(quán)限攔截的話(huà),我會(huì)怎樣設(shè)計(jì)呢?
?
程序A????????????? 系統(tǒng)服務(wù)??????? 我的服務(wù)?????????中轉(zhuǎn)服務(wù)?????????? LBE
---------------------------------------------------------------------------------
?
>>>? LBE 建立中轉(zhuǎn)服務(wù),注冊(cè)一個(gè)回調(diào),方便有事件得到通知。好彈出對(duì)話(huà)框。
>>>? 替換某些“系統(tǒng)服務(wù)”中的某服務(wù)為“我的服務(wù)”
>>> 程序A 請(qǐng)求 “系統(tǒng)服務(wù)” 服務(wù)的時(shí)候相當(dāng)于請(qǐng)求了“我的服務(wù)”, “我的服務(wù)”再調(diào)中轉(zhuǎn)服務(wù)提前處理,然后再調(diào)原來(lái)的“系統(tǒng)服務(wù)”
>>> 完成檢查
?
系統(tǒng)服務(wù)進(jìn)程在 system_server 進(jìn)程中。
服務(wù)管理在 servicemanager 進(jìn)程中。
?
?
最近找工作非常心煩,很有“不存在感”,都不知道怎么辦了...
??
貌似有些輕度失眠,最近晚上不到4點(diǎn)完全睡不著,于是乎趁著睡不著,起來(lái)學(xué)習(xí)一直都?jí)裘乱郧蟮腖BE,感覺(jué)還是那么遙不可及的技術(shù)啊,不過(guò)看看總是有收獲的。感覺(jué)這兩個(gè)晚上還是沒(méi)白看,雖然還是那么遙不可及。
??
首先LBE就不介紹了,Android下面一個(gè)安全軟件,不過(guò)做得的確很出色,主要就是那一套主動(dòng)防御的技術(shù)。LBE號(hào)稱(chēng)叫做業(yè)界最早實(shí)現(xiàn)HOOK技術(shù)的人,又是Linux,又是ARM...我去,人生是不能洗點(diǎn)的,就這兩點(diǎn)其實(shí)就廢掉了,找不到工作也是該的。
??
安裝完了LBE什么發(fā)短信,讀手機(jī)卡之類(lèi)的操作會(huì)被攔截下來(lái),這點(diǎn)做得確實(shí)霸道。不過(guò)結(jié)合一下Windows HOOK,還是能夠理解原因的。HOOK嘛,首先要注入,然后就是注入后的事。由于現(xiàn)在出的版本都是很新很新的了,在SO中好多調(diào)試鏈接信息都被無(wú)情地strip鳥(niǎo),要逆向真的非常頭大。我估摸著老版本沒(méi)有問(wèn)題,于是在網(wǎng)上找了個(gè)可以說(shuō)是第一版的軟件,但是功能還是足夠的,最為重要的是調(diào)試信息,拖到IDA里面就感嘆其意義。
??
安裝完畢之后里面有兩個(gè)BIN,可能版本不同情況也不同,反正作為最老版是這樣:一個(gè)叫l(wèi)ibloader.so,一個(gè)叫l(wèi)ibservice.so。相信SO大家都編過(guò),但是這兩個(gè)SO,其實(shí)不是傳統(tǒng)書(shū)上教的那種,因?yàn)檫B個(gè)什么對(duì)JAVA接口都沒(méi)有。不過(guò)我還是相信用法嘛,可能是什么System.loadLibrary之類(lèi),但是不是...
??
由AndroidManifest.xml可以知道哪里是入口點(diǎn),反正就那么找,然后逆向JAVA代碼之后發(fā)現(xiàn)了下面這種情況:
??
??
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;
???? ......
}
??
那就是說(shuō),其實(shí)這個(gè)libloader.so就不是真正的SO而是一個(gè)BIN,于是乎一測(cè)試就發(fā)現(xiàn)了:
# ./libloader.so
./libloader.so
Usage: ./libloader.so euid#
??
??
至于Usage嘛,那應(yīng)該是后面接個(gè)UID就是了(注意:Process.myUid())。
??
好吧,那么這個(gè)loader真是名副其實(shí)的loader,而且也不是屬于那種constructor來(lái)混淆你的SO而是真正的BIN。記得Windows注入就是一個(gè)EXE一個(gè)DLL,那么說(shuō)另外一個(gè)SO就是所謂的“HOOK DLL(SO)”。
??
還是繼續(xù)從loader下手,它HOOK了那些程序?其實(shí)從IDA里面的Strings可以看到一堆,不過(guò)還有個(gè)函數(shù)即使在main附近的一個(gè)叫find_pid_of,那個(gè)里面有個(gè)結(jié)構(gòu)體(猜的),里面講到了三個(gè)注入過(guò)程:
1、inject_svcmgr(HOOK實(shí)際對(duì)象是/system/bin/servicemanage),感覺(jué)和短信有關(guān)
2、inject_server(HOOK為system_server中的/system/lib/libandroid_runtime.so中的導(dǎo)入表sendmsg),據(jù)LBE自己說(shuō)攔截網(wǎng)絡(luò)和那個(gè)iptables無(wú)關(guān),不過(guò)sendmsg似乎是UDP的啊,其它情況呢?
3、inject_phonemgr(HOOK為com.android.phone),打電話(huà)
??
??
不過(guò)怎么HOOK都是后話(huà),我覺(jué)得第一步還是怎么注入是關(guān)鍵。arm匯編著實(shí)讓人頭大,不過(guò)大致的流程還是能夠看到,在loader中有一個(gè)叫inject_remote_process的函數(shù),其就是主要負(fù)責(zé)注入滴,而另外三個(gè)注入過(guò)程的函數(shù)(inject_svcmgr、inject_server、inject_phonemgr)都路過(guò)調(diào)用了它,其中傳入的參數(shù)有要注入的進(jìn)程pid以及一個(gè)字符串解析值,不過(guò)那個(gè)解析值直到看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號(hào)????hook_server
.text:00010594???????????????? BEQ???? loc_105D4
.text:00010598???????????????? CMP???? R3, #3????;3號(hào)????hook_phonemgr
.text:0001059C???????????????? BEQ???? loc_105C4
.text:000105A0???????????????? CMP???? R3, #1????;1號(hào)????hook_svcmgr
??
??
就是注入進(jìn)去之后然后調(diào)用的hook_entry代碼了,至于這個(gè)傳入的"func=%d,sec_uid=%d,sec_pid=%d"被sscanf解析了,func ID不說(shuō)了,sec_uid應(yīng)該是來(lái)自JAVA代碼的myUid,而pid就是進(jìn)程吧。
??
??
inject_remote_process是亮點(diǎn)啊,我是完全對(duì)Linux不懂,而且ARM也不懂,真麻煩。其大致的過(guò)程是:
1、首先ATTACH(附加進(jìn)程)
??
2、然后GETREGS(讀那個(gè)進(jìn)程寄存器,這里是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、設(shè)置寄存器SETREGS(這里有結(jié)構(gòu)體,由于不熟悉ARM,但是粗略猜測(cè)這里可能是ARM_lr,因?yàn)锽X LR嘛)
??
5、運(yùn)行CONT
??
嗯,也就說(shuō)就目前這種寫(xiě)法上看,我需要在自己寫(xiě)的測(cè)試so里面有個(gè)hook_entry供調(diào)用才行,并且函數(shù)格式還得對(duì)。不過(guò)如果不考慮這些,就用它自己提供的兩個(gè)SO,在不啟動(dòng)LBE主進(jìn)程的情況下,進(jìn)行測(cè)試,對(duì)象為/system/bin/servermanager...
??
這是servermanager沒(méi)有運(yùn)行l(wèi)oader之前的情況(查看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]
??
??
這是運(yùn)行之后的情況:
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]
?
轉(zhuǎn)載于:https://blog.51cto.com/laokaddk/1175482
總結(jié)
以上是生活随笔為你收集整理的LBE 隐私卫士原理分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红黑树的实现(二)
- 下一篇: Exchange 2010 运维技巧一