欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種用于Linux系統(tǒng)測(cè)試代碼注入的方法

文檔序號(hào):6335583閱讀:560來源:國(guó)知局
專利名稱:一種用于Linux系統(tǒng)測(cè)試代碼注入的方法
技術(shù)領(lǐng)域
本發(fā)明涉及用于Linux操作系統(tǒng)的測(cè)試代碼注入的方法和使用該方法的軟件工具。
背景技術(shù)
代碼注入是指向目標(biāo)程序?qū)?yīng)的本地進(jìn)程(目標(biāo)進(jìn)程)的地址空間注入一段可執(zhí) 行代碼,并使進(jìn)程執(zhí)行這段代碼,用來實(shí)現(xiàn)某些特殊的功能。在Linux開發(fā)過程中,為對(duì)目標(biāo)程序進(jìn)行測(cè)試,經(jīng)常需要在目標(biāo)進(jìn)程的地址空間 內(nèi)注入某些測(cè)試代碼,用于搜集信息或其他測(cè)試目的。在Linux系統(tǒng)中,每個(gè)進(jìn)程都有自己的私有內(nèi)存空間,互相隔離,彼此不能越界 操作。把代碼注入不同的進(jìn)程地址空間,然后在該進(jìn)程的上下文中執(zhí)行注入的代碼,就必 須跨越進(jìn)程間訪問內(nèi)存執(zhí)行代碼。代碼注入技術(shù)作為病毒、木馬已經(jīng)存在多年,特別是在 Windows系統(tǒng)中為躲避系統(tǒng)的監(jiān)控,一些木馬病毒在攻擊系統(tǒng)時(shí)往往將自身作為一個(gè)線 程運(yùn)行于其他應(yīng)用程序的地址空間內(nèi),并監(jiān)視、竊取甚至修改用戶進(jìn)程內(nèi)的數(shù)據(jù)。這些技術(shù) 也可用于軟件測(cè)試領(lǐng)域,因?yàn)闇y(cè)試工具也往往需要對(duì)待測(cè)程序進(jìn)行監(jiān)控、獲取進(jìn)程數(shù)據(jù)。目前測(cè)試代碼注入方法一般有兩類。第一類為直接修改目標(biāo)程序的源代碼即源代 碼插樁,由于必須擁有源代碼,其局限性顯而易見。例如《艦船電子工程》24卷6期《基于 源代碼插樁的C程序內(nèi)存使用錯(cuò)誤動(dòng)態(tài)檢測(cè)》、《計(jì)算機(jī)工程》36卷4期《飛行控制軟件測(cè)試 中插樁技術(shù)的優(yōu)化方法》、專利號(hào)CN200710123818. 2的《一種嵌入式系統(tǒng)測(cè)試方法》及專利 號(hào)CN200910054325. 7的《使用監(jiān)控線程對(duì)二進(jìn)制翻譯程序執(zhí)行流程動(dòng)態(tài)監(jiān)控的方法》等均 采用了源代碼插樁方法。另一類為在目標(biāo)程序運(yùn)行前對(duì)目標(biāo)程序二進(jìn)制代碼進(jìn)行修改。這 對(duì)于某些運(yùn)行時(shí)間超長(zhǎng),且無法中斷的程序就無能為力了。病毒傳播大部分采用此方法。下面就此文用到的一些名詞進(jìn)行解釋。系統(tǒng)調(diào)用程序是Unix/Linux操作系統(tǒng)向用戶程序提供支持的接口,通過這些接 口應(yīng)用程序向操作系統(tǒng)請(qǐng)求服務(wù),控制轉(zhuǎn)向操作系統(tǒng),而操作系統(tǒng)在完成服務(wù)后,將控制和 結(jié)果返回給用戶程序。Linux包括200多個(gè)系統(tǒng)調(diào)用,主要分為進(jìn)程控制、文件系統(tǒng)控制、 系統(tǒng)控制、內(nèi)存管理、網(wǎng)絡(luò)管理、用戶管理、進(jìn)程通信等幾類。本方法用到了一下ptrace、 mmap、mprotect等3個(gè)系統(tǒng)調(diào)用程序。ptrace系統(tǒng)調(diào)用提供父進(jìn)程觀察和控制另一個(gè)進(jìn)程執(zhí)行的機(jī)制,同時(shí)提供查詢 和修改另一進(jìn)程的核心影像與寄存器的能力。主要用于執(zhí)行斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用跟蹤。mmap系統(tǒng)調(diào)用=Linux中的程序執(zhí)行時(shí),需要將對(duì)應(yīng)的進(jìn)程映象調(diào)入進(jìn)程的虛擬 內(nèi)存空間,就需要通過mmap系統(tǒng)調(diào)用向系統(tǒng)申請(qǐng)一段合適的虛擬內(nèi)存空間。mprotect系統(tǒng)調(diào)用可以更改一個(gè)已經(jīng)存在的內(nèi)存映射區(qū)的訪問權(quán)限。函數(shù)庫(kù)函數(shù)庫(kù)是用于程序的子程序(函數(shù))的集合。其和可執(zhí)行文件的區(qū)別是, 庫(kù)不是獨(dú)立程序,他們是向其他程序提供服務(wù)的代碼。庫(kù)鏈接是指把一個(gè)或多個(gè)庫(kù)包括到 程序中。有兩種不同的庫(kù)鏈接形式靜態(tài)鏈接和動(dòng)態(tài)鏈接,相應(yīng)的,前者鏈接的庫(kù)叫做靜態(tài)庫(kù),后者的叫做共享庫(kù)或動(dòng)態(tài)庫(kù)。靜態(tài)鏈接指將函數(shù)庫(kù)的內(nèi)容直接加入到可執(zhí)行程序中,即程序本身擁有一份共 享函數(shù)庫(kù)中函數(shù)的副本,加載時(shí)只加載程序本身的文件即可。動(dòng)態(tài)鏈接它提供了一種方法,使可執(zhí)行程序可以調(diào)用外部函數(shù),此函數(shù)的代碼位 于一個(gè)獨(dú)立SO (或DLL)文件中。該SO(或DLL)文件包含一個(gè)或多個(gè)已被編譯、鏈接并 與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)。SO(或DLL)有助于共享數(shù)據(jù)和資源。裝載器程序文件的解析器,它負(fù)責(zé)解釋程序文件,準(zhǔn)備好執(zhí)行環(huán)境(包括場(chǎng)地等 資源),形成進(jìn)程。對(duì)于動(dòng)態(tài)鏈接或靜態(tài)鏈接的程序,其裝載過程不太相同。靜態(tài)連接程序, 裝載過程簡(jiǎn)單為將程序文件映射到內(nèi)存。對(duì)于動(dòng)態(tài)連接的程序,工作還包括庫(kù)加載和符號(hào) 解析重定位。PPC Linux 2. 4. 25 系統(tǒng)嵌入式 PowerPC 架構(gòu) Linux 系統(tǒng),內(nèi)核版本 2. 4. 25。

發(fā)明內(nèi)容
本發(fā)明的目的是提供一種用于Linux系統(tǒng)測(cè)試代碼注入的方法。本發(fā)明的技術(shù)方案由五個(gè)步驟組成,用于Linux系統(tǒng)下運(yùn)行進(jìn)程測(cè)試代碼注入的 方法
第一步驟,編寫編譯引導(dǎo)程序及測(cè)試代碼;引導(dǎo)程序(裝載器)在目標(biāo)進(jìn)程里申請(qǐng)地址 空間,裝載測(cè)試代碼,及使申請(qǐng)的內(nèi)存空間屬性變?yōu)榭蓤?zhí)行;
若目標(biāo)進(jìn)程為動(dòng)態(tài)共享鏈接而成,則測(cè)試代碼編譯為.so文件;若目標(biāo)進(jìn)程為靜態(tài)鏈 接,則編譯為.0中間文件;引導(dǎo)程序?yàn)榧虞d器,加載測(cè)試代碼對(duì)應(yīng)的.SO或.0文件;
靜態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序首先利用rnmap系統(tǒng)調(diào)用程序申請(qǐng)一定大小數(shù) 據(jù)空間;將測(cè)試代碼、即elf文件的.text . data等段數(shù)據(jù)映射到此段空間,然后執(zhí)行符號(hào) 鏈接、函數(shù)重定向操作,最后利用mprotect系統(tǒng)調(diào)用程序?qū)⑸鲜鰞?nèi)存區(qū)域設(shè)置成可執(zhí)行屬 性;由于測(cè)試代碼為中間.o目標(biāo)文件,無法直接執(zhí)行,而目標(biāo)進(jìn)程空間中存在符號(hào)表等,因 此必須人工分析目標(biāo)進(jìn)程的二進(jìn)制文件,查找測(cè)試代碼.o文件所需外部符號(hào)對(duì)應(yīng)位置;
動(dòng)態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序加載測(cè)試代碼對(duì)應(yīng)的so文件,調(diào)用Linux系統(tǒng) 動(dòng)態(tài)函數(shù)庫(kù)Id. so的函數(shù)dlopen打開so文件,不需要另外編寫加載器(Id. so是進(jìn)程加載 的第一個(gè)so文件,所有其他so文件是通過Id. so間接加載的);需要查找函數(shù)dlopen及 dlsym地址。由于目標(biāo)進(jìn)程地址空間存在符號(hào)表、PLT及GOT表,容易獲得此地址。引導(dǎo)程序查找保存測(cè)試代碼的入口地址,為執(zhí)行測(cè)試代碼做準(zhǔn)備動(dòng)態(tài)鏈接的測(cè) 試代碼僅僅使用Id. so的函數(shù)dlsym即可找到特定測(cè)試代碼入口在內(nèi)存中的地址;靜態(tài)鏈 接的測(cè)試代碼,在mmap系統(tǒng)調(diào)用程序映射測(cè)試代碼到內(nèi)存空間時(shí),知道代碼段加載的內(nèi)存 地址,再加上測(cè)試代碼入口在文件中的偏移量,即可算出測(cè)試代碼的入口在內(nèi)存中的實(shí)際 地址;
第二步驟,關(guān)聯(lián)待測(cè)進(jìn)程,復(fù)制引導(dǎo)程序到進(jìn)程地址空間;
通過ptrace系統(tǒng)調(diào)用調(diào)試監(jiān)控目標(biāo)進(jìn)程,備份目標(biāo)進(jìn)程某內(nèi)存地址步驟代碼;同時(shí)將 引導(dǎo)程序復(fù)制到此內(nèi)存地址;
prace系統(tǒng)調(diào)用有四個(gè)參數(shù),第一個(gè)參數(shù)決定了 ptrace的行為與其它參數(shù)的使用方 法;通過ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_ATTACH與目標(biāo)進(jìn)程建立起關(guān)聯(lián)調(diào)試關(guān)系。同時(shí)備份待測(cè)進(jìn)程的上下文;然后通過ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_PEEKTEXT讀取 用戶的進(jìn)程指令區(qū)中指令并備份。備份結(jié)束后,通過ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_ P0KETEXT將引導(dǎo)程序?qū)懭肷鲜龉瓅導(dǎo)程序復(fù)制的內(nèi)存中;
第三步驟執(zhí)行引導(dǎo)程序并裝載測(cè)試代碼;在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代 碼,并將其與原進(jìn)程符號(hào)鏈接;
執(zhí)行引導(dǎo)程序并裝載測(cè)試代碼;引導(dǎo)程序在目標(biāo)進(jìn)程空間執(zhí)行,使用ptrace系統(tǒng)調(diào) 用改變?cè)M(jìn)程的指令寄存器值,從而達(dá)到執(zhí)行引導(dǎo)程序的目的;對(duì)于PPC Linux 2. 4. 25系 統(tǒng),一般通過ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_POKEUSR設(shè)置指令寄存器值為弓|導(dǎo)程起始 地址,并通過ptrace系統(tǒng)調(diào)用參數(shù)PTRACE_C0NT執(zhí)行引導(dǎo)程序;
尤其是在引導(dǎo)程序最后一條指令替換為TRAP指令;這樣在引導(dǎo)程序執(zhí)行完后,可繼續(xù) 操作目標(biāo)進(jìn)程;
第四步驟執(zhí)行測(cè)試代碼;在目標(biāo)進(jìn)程中創(chuàng)建線程,同時(shí)在目標(biāo)進(jìn)程里申請(qǐng)地址空間, 裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)鏈接、函數(shù)重定向工作;
再次通過ptrace系統(tǒng)調(diào)用調(diào)用參數(shù)PTRACE_POKEUSR設(shè)置指令寄存器值為測(cè)試代碼起 始地址,并通過ptrace系統(tǒng)調(diào)用參數(shù)PTRACE_C0NT執(zhí)行測(cè)試程序;測(cè)試代碼執(zhí)行時(shí)在目標(biāo) 進(jìn)程中創(chuàng)建一測(cè)試線程,當(dāng)最后進(jìn)程恢復(fù)時(shí),測(cè)試線程仍駐留在進(jìn)程中; 第五步驟脫離待測(cè)進(jìn)程,恢復(fù)原進(jìn)程空間指令,恢復(fù)原進(jìn)程執(zhí)行; 在脫離目標(biāo)進(jìn)程前,先用備份的指令恢復(fù)被引導(dǎo)程序覆蓋的代碼段;其次,還需要恢復(fù) 目標(biāo)進(jìn)程上下文,也采用備份上下文恢復(fù);恢復(fù)完后ptrace系統(tǒng)調(diào)用調(diào)用(參數(shù)PTRACE_ C0NT)繼續(xù)執(zhí)行原進(jìn)程,這樣就脫離了目標(biāo)進(jìn)程,原進(jìn)程也恢復(fù)了執(zhí)行。本發(fā)明的有益效果本發(fā)明提供的方法能夠在不中斷被檢測(cè)目標(biāo)程序運(yùn)行,不需 要更改目標(biāo)代碼的情況下,實(shí)時(shí)對(duì)目標(biāo)程序注入測(cè)試代碼用于測(cè)試。


下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式
作進(jìn)一步詳細(xì)的說明。圖1是一個(gè)靜態(tài)鏈接的引導(dǎo)程序流程圖。圖2是一個(gè)動(dòng)態(tài)鏈接的引導(dǎo)程序流程圖。圖3是系統(tǒng)流程圖。
具體實(shí)施例方式分五步驟內(nèi)容,下面以PPC Linux 2. 4. 25為例說明這一過程。第一步驟為編寫、編譯引導(dǎo)程序及測(cè)試代碼。測(cè)試代碼根據(jù)目標(biāo)進(jìn)程類型編譯為 共享庫(kù)文件.SO或簡(jiǎn)單.o文件。若目標(biāo)進(jìn)程為動(dòng)態(tài)共享鏈接而成,則測(cè)試代碼也編譯為.so 文件。若目標(biāo)進(jìn)程為靜態(tài)鏈接,則編譯為.0中間文件。引導(dǎo)程序?qū)嶋H為一加載器,主要功 能為加載測(cè)試代碼對(duì)應(yīng)的.so或.0文件。具體流程如圖1和圖2所示
靜態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序主要功能為首先利用mmap系統(tǒng)調(diào)用申請(qǐng)一定 大小數(shù)據(jù)空間,將測(cè)試代碼(elf文件的.text . data等段數(shù)據(jù))映射到此段空間,然后執(zhí)行 符號(hào)鏈接、函數(shù)重定向操作,最后利用mprotect系統(tǒng)調(diào)用將上述內(nèi)存區(qū)域設(shè)置成可執(zhí)行屬 性。由于測(cè)試代碼為中間.0目標(biāo)文件,無法直接執(zhí)行,而目標(biāo)進(jìn)程空間中符號(hào)表等,因此必須人工分析目標(biāo)進(jìn)程的二進(jìn)制文件,查找測(cè)試代碼.o文件所需外部符號(hào)對(duì)應(yīng)位置,手工進(jìn) 行鏈接操作。為減少手工鏈接工作量,測(cè)試代碼盡可能少引用庫(kù)函數(shù)(或自己編寫庫(kù)函數(shù)), 盡可能直接使用系統(tǒng)調(diào)用。動(dòng)態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序主要功能為由于Linux系統(tǒng)唯一的動(dòng)態(tài)庫(kù) 引導(dǎo)程序Id. so在目標(biāo)代碼開始執(zhí)行時(shí)已經(jīng)加載到了其進(jìn)程空間,因此加載測(cè)試代碼對(duì)應(yīng) 的SO文件,可簡(jiǎn)單的調(diào)用Id. so的函數(shù)dlopen打開so文件,不需要另外編寫加載器。唯 一的工作為查找函數(shù)dlopen及dlsym地址。由于目標(biāo)進(jìn)程地址空間存在符號(hào)表、PLT及GOT 表,因此此地址也較容易獲得。引導(dǎo)程序最后的功能為查找保存測(cè)試代碼的入口地址,為執(zhí)行測(cè)試代碼做準(zhǔn)備。 動(dòng)態(tài)鏈接的測(cè)試代碼僅僅使用Id. so的函數(shù)dlsym即可找到特定測(cè)試代碼入口在內(nèi)存中 的地址。靜態(tài)鏈接的測(cè)試代碼,在mmap映射測(cè)試代碼到內(nèi)存空間時(shí),已經(jīng)知道代碼段加載 的內(nèi)存地址,再加上測(cè)試代碼入口在文件中的偏移量,即可算出測(cè)試代碼的入口在內(nèi)存中 的實(shí)際地址
第二步驟調(diào)試關(guān)聯(lián)待測(cè)進(jìn)程,復(fù)制引導(dǎo)程序到進(jìn)程地址空間,用于最后的指令恢復(fù)與 執(zhí)行。在Linux系統(tǒng)中,為方便軟件的開發(fā)和調(diào)試,提供了一種對(duì)運(yùn)行中的進(jìn)程進(jìn)行跟蹤 和控制的手段,那就是系統(tǒng)調(diào)用ptrace。ptrace提供了一種使父進(jìn)程監(jiān)視和控制其它進(jìn) 程的方式,它還能夠改變子進(jìn)程中的寄存器和內(nèi)核映像,實(shí)現(xiàn)斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用的跟蹤。 prace調(diào)用有四個(gè)參數(shù),它的第一個(gè)參數(shù)決定了 ptrace的行為與其它參數(shù)的使用方法。通 過ptrace調(diào)用參數(shù)PTRACE_ATTACH與目標(biāo)進(jìn)程建立起關(guān)聯(lián)調(diào)試關(guān)系,同時(shí)備份進(jìn)程上下文 環(huán)境,然后通過Ptrace調(diào)用參數(shù)PTRACE_PEEKTEXT讀取用戶的進(jìn)程指令區(qū)中指令并備份。 備份結(jié)束后,通過ptrace調(diào)用參數(shù)PTRACE_P0KETEXT將引導(dǎo)程序?qū)懭肷鲜鰞?nèi)存中。第三步驟執(zhí)行引導(dǎo)程序,裝載測(cè)試代碼。引導(dǎo)程序必須在目標(biāo)進(jìn)程空間執(zhí)行。這 里使用ptrace調(diào)用方法改變?cè)M(jìn)程的指令寄存器值,從而達(dá)到執(zhí)行引導(dǎo)程序的目的。對(duì)于 PPC Linux 2.4. 25系統(tǒng),一般通過ptrace調(diào)用參數(shù)PTRACE_P0KEUSR設(shè)置指令寄存器值為 引導(dǎo)程起始地址,并通過ptrace調(diào)用參數(shù)PTRACE_C0NT執(zhí)行引導(dǎo)程序。為了讓引導(dǎo)程序執(zhí) 行完后,目標(biāo)程序能繼續(xù)接受控制,這里在引導(dǎo)程序最后一條指令替換為TRAP指令。這樣 弓I導(dǎo)程序執(zhí)行完后,我們可以繼續(xù)操作目標(biāo)進(jìn)程。第四步驟執(zhí)行測(cè)試代碼;在目標(biāo)進(jìn)程中創(chuàng)建線程,同時(shí)在目標(biāo)進(jìn)程里申請(qǐng)地址 空間,裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)鏈接、函數(shù)重定向工作。這里再次通過Ptrace調(diào) 用(參數(shù)PTRACE_P0KEUSR)設(shè)置指令寄存器值為測(cè)試代碼起始地址,并通過ptrace調(diào)用 (參數(shù)PTRACE_C0NT)執(zhí)行測(cè)試程序。測(cè)試代碼執(zhí)行時(shí)可在目標(biāo)進(jìn)程中創(chuàng)建一測(cè)試線程,這 樣等到最后進(jìn)程恢復(fù)時(shí),測(cè)試線程仍駐留在目標(biāo)進(jìn)程中繼續(xù)運(yùn)行。第五步驟恢復(fù)原進(jìn)程空間指令,脫離待測(cè)進(jìn)程,恢復(fù)原進(jìn)程執(zhí)行。在脫離目標(biāo)進(jìn) 程前,我們首先用備份的指令恢復(fù)被引導(dǎo)程序覆蓋的代碼段。其次,再恢復(fù)目標(biāo)進(jìn)程上下文 環(huán)境,也采用備份上下文恢復(fù)?;謴?fù)完后ptrace調(diào)用參數(shù)PTRACE_C0NT繼續(xù)執(zhí)行原進(jìn)程, 這樣我們就脫離了目標(biāo)進(jìn)程,原進(jìn)程也恢復(fù)了執(zhí)行。整個(gè)系統(tǒng)流程如圖3所示。實(shí)驗(yàn)結(jié)果表明,利用上述方法開發(fā)的測(cè)試工具能實(shí)時(shí)將測(cè)試代碼注入到運(yùn)行中的 進(jìn)程中去,不受測(cè)試代碼大小限制,提高了測(cè)試工具的應(yīng)用能力。
權(quán)利要求
1、一種用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟1,編寫編譯引導(dǎo)程序及測(cè)試代碼;引導(dǎo)程序目的是在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,及使申請(qǐng)的內(nèi)存空間屬性變?yōu)榭蓤?zhí)行;步驟2,關(guān)聯(lián)待測(cè)進(jìn)程,復(fù)制引導(dǎo)程序到進(jìn)程地址空間;步驟3執(zhí)行引導(dǎo)程序并裝載測(cè)試代碼;在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)進(jìn)行鏈接;步驟4執(zhí)行測(cè)試代碼;在目標(biāo)進(jìn)程中創(chuàng)建線程,同時(shí)在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)鏈接、函數(shù)重定向工作;步驟5脫離待測(cè)進(jìn)程,恢復(fù)原進(jìn)程空間指令,恢復(fù)原進(jìn)程執(zhí)行。
2.2、如權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟1中測(cè) 試代碼根據(jù)目標(biāo)進(jìn)程類型編譯為共享庫(kù)文件.so或簡(jiǎn)單.ο文件;若目標(biāo)進(jìn)程為動(dòng)態(tài)(共享) 鏈接而成,則測(cè)試代碼也編譯為.so文件,若目標(biāo)進(jìn)程為靜態(tài)鏈接,則編譯為.ο中間文件;所述靜態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序首先利用mmap系統(tǒng)調(diào)用程序申請(qǐng)一定大 小數(shù)據(jù)空間;將測(cè)試代碼即elf文件的.text與.data等段數(shù)據(jù)映射到此段空間,然后執(zhí)行 符號(hào)鏈接、函數(shù)重定向操作,最后利用mprotect系統(tǒng)調(diào)用程序?qū)⑸鲜鰞?nèi)存區(qū)域設(shè)置成可執(zhí) 行屬性;由于測(cè)試代碼為中間.ο目標(biāo)文件,無法直接執(zhí)行,而目標(biāo)進(jìn)程空間中存在符號(hào)表 等,因此必須人工分析目標(biāo)進(jìn)程的二進(jìn)制文件,查找測(cè)試代碼.ο文件所需外部符號(hào)對(duì)應(yīng)位 置;所述動(dòng)態(tài)鏈接的測(cè)試代碼對(duì)應(yīng)的引導(dǎo)程序加載測(cè)試代碼對(duì)應(yīng)的so文件,調(diào)用Linux 系統(tǒng)動(dòng)態(tài)函數(shù)庫(kù)Id. so ;動(dòng)態(tài)鏈接、目標(biāo)進(jìn)程必須加載的第一個(gè)so文件的函數(shù)dlopen打開 so文件,不需要另外編寫加載器;需要查找函數(shù)dlopen及dlsym地址;引導(dǎo)程序查找保存測(cè)試代碼的入口地址,為執(zhí)行測(cè)試代碼做準(zhǔn)備動(dòng)態(tài)鏈接的測(cè)試代 碼僅僅使用Id. so的函數(shù)dlsym即可找到特定測(cè)試代碼入口在內(nèi)存中的地址;靜態(tài)鏈接 的測(cè)試代碼,在mmap系統(tǒng)調(diào)用程序映射測(cè)試代碼到內(nèi)存空間時(shí),知道代碼段加載的內(nèi)存地 址,再加上測(cè)試代碼入口在文件中的偏移量,即可算出測(cè)試代碼的入口在內(nèi)存中的實(shí)際地 址。
3.3、如權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟2中通 過ptrace系統(tǒng)調(diào)用調(diào)試監(jiān)控目標(biāo)進(jìn)程,備份目標(biāo)進(jìn)程某內(nèi)存地址步驟代碼;同時(shí)將引導(dǎo)程 序復(fù)制到此內(nèi)存地址。
4.4、由權(quán)利要求1所述用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是在步驟3過程 中,引導(dǎo)程序包含一簡(jiǎn)單程序加載器,用于測(cè)試代碼的動(dòng)態(tài)加載,包括符號(hào)解析、鏈接、函數(shù) 重定向。
5.5、如權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟3中執(zhí) 行引導(dǎo)程序并裝載測(cè)試代碼;引導(dǎo)程序在目標(biāo)進(jìn)程空間執(zhí)行,使用Ptrace系統(tǒng)調(diào)用改變?cè)?進(jìn)程的指令寄存器值,從而達(dá)到執(zhí)行引導(dǎo)程序的目的。
6.6、如權(quán)利要求5所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟3中 prace系統(tǒng)調(diào)用有四個(gè)參數(shù),第一個(gè)參數(shù)決定了 ptrace的行為與其它參數(shù)的使用方法;通 過ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_ATTACH與目標(biāo)進(jìn)程建立起關(guān)聯(lián)調(diào)試關(guān)系,同時(shí)備份 目標(biāo)進(jìn)程的上下文;然后通過Ptrace系統(tǒng)調(diào)用、調(diào)用參數(shù)PTRACE_PEEKTEXT讀取用戶的進(jìn)程指令區(qū)中指令并備份;備份結(jié)束后,通過Ptrace系統(tǒng)調(diào)用參數(shù)PTRACE_POKETEXT將引導(dǎo) 程序?qū)懭肷鲜鲆龑?dǎo)程序復(fù)制的內(nèi)存中。
7.7、根據(jù)權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是,步驟3中 在引導(dǎo)程序最后一條指令替換為TRAP指令;這樣在引導(dǎo)程序執(zhí)行完后,可繼續(xù)操作目標(biāo)進(jìn)程。
8.8、如權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟4中 再次通過Ptrace系統(tǒng)調(diào)用設(shè)置指令寄存器的值為測(cè)試代碼起始地址,參數(shù)為PTRACE_ P0KEUSR,并通過ptrace系統(tǒng)調(diào)用執(zhí)行測(cè)試程序,參數(shù)為PTRACE_C0NT ;測(cè)試代碼執(zhí)行時(shí)在 目標(biāo)進(jìn)程中創(chuàng)建一測(cè)試線程,當(dāng)最后進(jìn)程恢復(fù)時(shí),測(cè)試線程仍駐留在目標(biāo)進(jìn)程中,可繼續(xù)進(jìn) 行測(cè)試任務(wù)。
9.9、如權(quán)利要求1所述的用于Linux系統(tǒng)測(cè)試代碼注入的方法,其特征是步驟5中 在脫離目標(biāo)進(jìn)程前,先用步驟2備份的指令恢復(fù)被引導(dǎo)程序覆蓋的代碼指令;其次,恢復(fù)目 標(biāo)進(jìn)程的上下文,也采用步驟2備份的上下文恢復(fù);恢復(fù)完后ptrace系統(tǒng)調(diào)用調(diào)用參數(shù) PTRACE_C0NT繼續(xù)執(zhí)行原進(jìn)程,這樣就脫離了目標(biāo)進(jìn)程,原進(jìn)程也恢復(fù)了執(zhí)行。
全文摘要
一種用于Linux系統(tǒng)測(cè)試代碼注入的方法,步驟1,編寫編譯引導(dǎo)程序及測(cè)試代碼;引導(dǎo)程序目的是在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,及使申請(qǐng)的內(nèi)存空間屬性變?yōu)榭蓤?zhí)行;步驟2,關(guān)聯(lián)待測(cè)進(jìn)程,復(fù)制引導(dǎo)程序到進(jìn)程地址空間;步驟3執(zhí)行引導(dǎo)程序并裝載測(cè)試代碼;在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)進(jìn)行鏈接;步驟4執(zhí)行測(cè)試代碼;在目標(biāo)進(jìn)程中創(chuàng)建線程,同時(shí)在目標(biāo)進(jìn)程里申請(qǐng)地址空間,裝載測(cè)試代碼,并將其與原進(jìn)程符號(hào)鏈接、函數(shù)重定向工作;步驟5脫離待測(cè)進(jìn)程,恢復(fù)原進(jìn)程空間指令,恢復(fù)原進(jìn)程執(zhí)行。本發(fā)明提供的方法能夠在不中斷目標(biāo)進(jìn)程運(yùn)行,實(shí)時(shí)對(duì)目標(biāo)程序進(jìn)行測(cè)試代碼的動(dòng)態(tài)注入。
文檔編號(hào)G06F9/445GK101984409SQ20101053837
公開日2011年3月9日 申請(qǐng)日期2010年11月10日 優(yōu)先權(quán)日2010年11月10日
發(fā)明者李興建, 李忠安 申請(qǐng)人:南京南瑞繼保電氣有限公司;南京南瑞繼保工程技術(shù)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
明溪县| 连云港市| 津南区| 儋州市| 贡觉县| 黄石市| 景德镇市| 白河县| 德令哈市| 即墨市| 尉犁县| 静宁县| 南皮县| 元江| 盐边县| 金寨县| 阳城县| 大田县| 哈密市| 仲巴县| 安义县| 白沙| 陆丰市| 和林格尔县| 广水市| 积石山| 鄂州市| 咸宁市| 全南县| 平泉县| 远安县| 长丰县| 安达市| 万宁市| 北宁市| 保山市| 恩平市| 夏河县| 工布江达县| 永顺县| 武城县|