1. 首先要明白 不要采用IMEI的方式。模擬器的IMEI可以修改的。而且平板是沒(méi)有IMEI的,可以檢測(cè)設(shè)備的MAC地址,模擬器的MAC地址是固定的幾種。
創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!
2.通過(guò)調(diào)用公開(kāi)或者隱藏的系統(tǒng)API判斷并不靠譜,因?yàn)檎{(diào)用結(jié)果可以輕易被修改,比如直接修改Android的源代碼或者借助Xposed Framework進(jìn)行修改。
3.有基于模擬器特征和api返回值的檢測(cè)方法都可以通過(guò)修改安卓源碼的方式輕松繞過(guò)。模擬器與真機(jī)的本質(zhì)區(qū)別在于運(yùn)行載體。鑒于大多數(shù)的安卓模擬器基于qemu,qemu在執(zhí)行程序時(shí)實(shí)際上是將其翻譯成宿主機(jī)的指令,比如將安卓的arm指令翻譯成PC的x86指令。為了效率上的考慮,qemu在翻譯執(zhí)行arm指令時(shí)并沒(méi)有實(shí)時(shí)更新模擬的pc寄存器值,只會(huì)在一段代碼翻譯執(zhí)行完之后再更新,而真機(jī)中pc寄存器是一直在更新的?;谶@一點(diǎn),可以設(shè)計(jì)一段CPU任務(wù)調(diào)度程序來(lái)檢測(cè)模擬器 。具體的你可以參鑒DexLab上的一篇文章。當(dāng)然,這個(gè)方法也是可以被繞過(guò)的,可以在理解qemu源碼的基礎(chǔ)上,修改qemu源碼,但很明顯這個(gè)門(mén)檻很高 。
COPY過(guò)來(lái)有什么意思。。。。。。。 ----------------------------- 要防止SQL注入其實(shí)不難,你知道原理就可以了。 所有的SQL注入都是從用戶的輸入開(kāi)始的。如果你對(duì)所有用戶輸入進(jìn)行了判定和過(guò)濾,就可以防止SQL注入了。用戶輸入有好幾種,我就說(shuō)說(shuō)常見(jiàn)的吧。 文本框、地址欄里***.asp?中?號(hào)后面的id=1之類的、單選框等等。一般SQL注入都用地址欄里的。。。。如果要說(shuō)怎么注入我想我就和上面的這位“仁兄”一樣的了。 你只要知道解決對(duì)嗎? 對(duì)于所有從上一頁(yè)傳遞過(guò)來(lái)的參數(shù),包括request.form 、request.qurrystring等等進(jìn)行過(guò)濾和修改。如最常的***.asp?id=123 ,我們的ID只是用來(lái)對(duì)應(yīng)從select 里的ID,而這ID一般對(duì)應(yīng)的是一個(gè)數(shù)據(jù)項(xiàng)的唯一值,而且是數(shù)字型的。這樣,我們只需把ID的值進(jìn)行判定,就可以了...
Android 5.0 之前的版本,對(duì) @ interface 注解操作處理的并不好,效率完全不能和 jvm 相比,所以注重運(yùn)行流暢的框架基本都拋棄了 注解 的使用。而 ButterKnife 的注入依賴注解,其運(yùn)行效率必然不高。另外,在一些場(chǎng)景下,比如視圖注入的過(guò)程中,你并不能優(yōu)化 ButterKnife 的查找。比如一個(gè)我們需要找到一個(gè)父視圖中的數(shù)個(gè)子視圖,如果純手工寫(xiě),我們可以先找到父視圖,在從父視圖中查找子視圖。而 ButterKnife 卻要每次重新從根視圖去查找,效率也是有所下降的。想了解更多請(qǐng)關(guān)注扣丁學(xué)堂。
Android下so注入是基于ptrace系統(tǒng)調(diào)用,因此要想學(xué)會(huì)android下的so注入,首先需要了解ptrace的用法。
ptrace用法可以參考博客:,也可以在ubuntu下輸入man ptrace命令,查看具體描述。
android中進(jìn)程系統(tǒng)調(diào)用劫持可參考博客:,這是一個(gè)android簡(jiǎn)單的ptrace監(jiān)控遠(yuǎn)程進(jìn)程監(jiān)控調(diào)用的例子。
Android系統(tǒng)是基于Linux系統(tǒng),在linux系統(tǒng)中可以通過(guò)ptrace系統(tǒng)調(diào)用實(shí)現(xiàn)進(jìn)程注入。ptrace注入過(guò)程大致過(guò)程如下:
(1)基于shellcode加載
[1]編寫(xiě)shellcode,shellcode是使用匯編語(yǔ)言寫(xiě)一段匯編程序,該程序?qū)崿F(xiàn)so庫(kù)的加載、so庫(kù)函數(shù)查找以及執(zhí)行庫(kù)中的函數(shù)。
[2]通過(guò)遠(yuǎn)程進(jìn)程pid,ATTACH到遠(yuǎn)程進(jìn)程。
[3]獲取遠(yuǎn)程進(jìn)程寄存器值,并保存,以便注入完成后恢復(fù)進(jìn)程原有狀態(tài)。
[4]獲取遠(yuǎn)程進(jìn)程系統(tǒng)調(diào)用mmap、dlopen、dlsym調(diào)用地址。
[5]調(diào)用遠(yuǎn)程進(jìn)程mmap分配一段存儲(chǔ)空間,并在空間中寫(xiě)入shellcode、so庫(kù)路徑以及函數(shù)調(diào)用參數(shù)。
[6]執(zhí)行遠(yuǎn)程進(jìn)程shellcode代碼。
[7]恢復(fù)遠(yuǎn)程進(jìn)程寄存器。
[8]detach遠(yuǎn)程進(jìn)程。
基于shellcode注入可看雪古河大哥寫(xiě)的libInject,網(wǎng)址:
(2)直接加載
[1]通過(guò)遠(yuǎn)程進(jìn)程pid,ATTACH到遠(yuǎn)程進(jìn)程。
[2]獲取遠(yuǎn)程進(jìn)程寄存器值,并保存,以便注入完成后恢復(fù)進(jìn)程原有狀態(tài)。
[3]獲取遠(yuǎn)程進(jìn)程系統(tǒng)調(diào)用mmap、dlopen、dlsym調(diào)用地址。
[4]調(diào)用遠(yuǎn)程進(jìn)程mmap分配一段存儲(chǔ)空間,并在空間中寫(xiě)入so庫(kù)路徑以及函數(shù)調(diào)用參數(shù)。
[5]執(zhí)行遠(yuǎn)程進(jìn)程dlopen,加載so庫(kù)。
[6]執(zhí)行遠(yuǎn)程進(jìn)程dlsym,獲取so庫(kù)中需要執(zhí)行的函數(shù)地址。
[7]執(zhí)行遠(yuǎn)程進(jìn)程中的函數(shù)。
[7]恢復(fù)遠(yuǎn)程進(jìn)程寄存器。
[8]DETACH遠(yuǎn)程進(jìn)程。
目前android so注入的版本基本上都是基于古河大哥的libInject修改而來(lái)。關(guān)于so注入的項(xiàng)目,還可以參考洗大師的一個(gè)開(kāi)源項(xiàng)目,網(wǎng)址:。洗大師注入需要修改elf文件。
提供一個(gè)方便測(cè)試so注入成功與否的小測(cè)試庫(kù),代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include unstd.h
#include stdio.h
#include android/log.h
#define LOG_TAG "test"
__attribute__((constructor))
void
inject
()
{
__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,"Hello,I
am injected.");
}
說(shuō)明:若函數(shù)被設(shè)定為constructor屬性,則該函數(shù)會(huì)在main()函數(shù)執(zhí)行之前被自動(dòng)的執(zhí)行。因此,so注入測(cè)試中,只需注入以上代碼編譯的so庫(kù),無(wú)需調(diào)用注入so的相關(guān)函數(shù),即可測(cè)試是否注入到遠(yuǎn)程進(jìn)程。
第一步:
mainfest.xml中加入網(wǎng)絡(luò)權(quán)限
uses-permission android:name="android.permission.INTERNET" /
第二步:
加載本地寫(xiě)好的html文件(定義好js中提供給android調(diào)用的方法 funFromjs(),和android提供給js調(diào)用的對(duì)象接口fun1FromAndroid(String name)),放在 assets目錄下。
body
ajs中調(diào)用本地方法/a
script
function funFromjs(){
document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";
}
var aTag = document.getElementsByTagName('a')[0];
aTag.addEventListener('click', function(){
//調(diào)用android本地方法
myObj.fun1FromAndroid("調(diào)用android本地方法fun1FromAndroid(String name)?。?);
return false;
}, false);
/script
p/p
div id="helloweb"
/div
/body
第三步:
實(shí)現(xiàn)android工程與js交互的相關(guān)代碼
android主題代碼:
public class JavaScriptObject {
Context mContxt;
@JavascriptInterface //sdk17版本以上加上注解
public JavaScriptObject(Context mContxt) {
this.mContxt = mContxt;
}
public void fun1FromAndroid(String name) {
Toast.makeText(mContxt, name, Toast.LENGTH_LONG).show();
}
public void fun2(String name) {
Toast.makeText(mContxt, "調(diào)用fun2:" + name, Toast.LENGTH_SHORT).show();
}
}