動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入_第1頁
動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入_第2頁
動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入_第3頁
動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入_第4頁
動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

動(dòng)態(tài)修改其它進(jìn)程的代碼,實(shí)現(xiàn)DLL注入傳統(tǒng)的遠(yuǎn)程進(jìn)程控制方式有利用HOOK技術(shù)注入DLL,和利用遠(yuǎn)線程在目標(biāo)進(jìn)程中建立新的執(zhí)行線程的方式.遠(yuǎn)線程不被win9x所支持,而hook技術(shù)會(huì)對(duì)目標(biāo)進(jìn)程性能造成一定的影響.并具可以通過枚舉消息鏈的方式發(fā)現(xiàn).本文給出一種動(dòng)態(tài)修改目標(biāo)進(jìn)程代碼,注入DLL到目標(biāo)進(jìn)程的方法,效率高,不需要額外線程.缺點(diǎn)是使用難度大于上面二種辦法,并且修改目標(biāo)代碼的方法,受到編譯器的影響.使用不同的編譯器時(shí),需要根據(jù)編譯器調(diào)整動(dòng)態(tài)代碼修改方式.動(dòng)態(tài)修改目標(biāo)進(jìn)程代碼,使其加載自已的DLL的思路如下:得到目標(biāo)進(jìn)程句柄.在目標(biāo)進(jìn)程中分配一塊可執(zhí)行可讀寫的內(nèi)存.寫入加載DLL的代碼到分配出來的內(nèi)存中.修正動(dòng)態(tài)寫入的代碼中的地址(LoadLibrary地址,DLL名字地址).修改目標(biāo)進(jìn)程本身的代碼,使其執(zhí)行到被修改代碼時(shí),跳到加載DLL的代碼處.加載完DLL后,修正目標(biāo)進(jìn)程原來的代碼,并跳回去繼續(xù)執(zhí)行.這個(gè)過程中需要注意的地方是.對(duì)寄存器的保護(hù),堆棧的平衡.其中第5步需要修改一塊目標(biāo)進(jìn)程一定會(huì)執(zhí)行的代碼,消息循環(huán)是個(gè)不錯(cuò)的地方.這里以記事本為例.打開ollydbg在TranslateMessage函數(shù)下斷點(diǎn),中斷后如下:010029FC|./7514|jnzshortnotepad.01002A12010029FE|.|8D45E0|leaeax,dwordptrss:[ebp-20]01002A01|.150|pusheax;/pMsg01002A02|.|FF1598120001|calldwordptrds:[<&USER32.Translat>;/TranslateMessage01002A08|.18D45E0|leaeax,dwordptrss:[ebp-20]01002A0B|.150|pusheax;/pMsg01002A0C|.|FF1594120001|calldwordptrds:[<&USER32.Dispatch>;/DispatchMessageW01002A12|>/56pushesi01002A13|.56|pushesi01002A14|.8D45E0|leaeax,dwordptrss:[ebp-20]01002A17|.56|pushesi

|pusheax|calledi01002A18|.5001002A19|.FFD70x01002A02處是個(gè)不錯(cuò)的地方,可以動(dòng)態(tài)修改它.改成moveax,加載dll的代碼地址jmpeax需要注意的是,此程序基址在不同的系統(tǒng)上有可能不一樣,可以從PE頭中得到映像基址.所以此處的0x1002A02也許在你的機(jī)器上是另一個(gè)地址,請(qǐng)使用OD自行確定.(我是winxpsp2)找到修改點(diǎn)后,|pusheax|calledipusha//eax中是LoadLibrary函數(shù)地址,暫時(shí)為0xffffffff〃由程序動(dòng)態(tài)改成真實(shí)函數(shù)地址moveax,0xffffffff//要加載的DLL的名字地址,暫時(shí)為0xffffffff〃由程序動(dòng)態(tài)改成真實(shí)地址movebx,0xffffffffpushebx〃調(diào)用LoadLibrary,加載自已的DLL〃這樣DLL就注入到目標(biāo)進(jìn)程了calleaxpopa//恢復(fù)0x1002A02處的代碼,并跳回去執(zhí)行〃選執(zhí)eax寄存器是因?yàn)?x1002A02后面的代碼沒有直接使用到eaxmoveax,CODE_OFFSETmovdwordptr[eax],0x129815FFmovdwordptr[eax+4],0x458D0100jmpeax下面的代碼是在加載DLL后,修正目標(biāo)進(jìn)程原有的代碼moveax,CODE_OFFSETmovdwordptr[eax],0x129815FFmovdwordptr[eax+4],0x458D01000x129815FF0x458D0100即為原有代碼(字節(jié)順序是倒過來的,0x129815FF倒過來即是FF159812,0x458D0100倒過來即是00018D45,請(qǐng)注意和下面代碼對(duì)比01002A02|.|FF1598120001|calldwordptrds:[<&USER32.Translat>;/TranslateMessage01002A08|.|8D45E0|leaeax,dwordptrss:[ebp-20]其它基本上就是編碼了,例子如下,測(cè)試時(shí),請(qǐng)自行編寫一個(gè)Test.dll,放在記事本同一個(gè)目錄下,不同的編譯器,不同的系統(tǒng)請(qǐng)自行修正一些細(xì)節(jié):(我是使用的Release模式,Debug模式代碼會(huì)不同的)#include<iostream>#include<windows.h>#include<psapi.h>usingstd::cout;usingstd::cin;usingstd::endl;〃記事本的映象基址,不同的系統(tǒng)可能不一樣〃這個(gè)值可以從PE頭中讀取#defineNOTEPAD_IMAGE_BASE0x1000000;#defineCODE_OFFSET0x1002A02;//用來測(cè)試的DLL名constchar*dllname="Test.dll";voidloaddll(){—asm{pusha//eax中是LoadLibrary函數(shù)地址,暫時(shí)為0xffffffff〃由程序動(dòng)態(tài)改成真實(shí)函數(shù)地址moveax,0xffffffff//要加載的DLL的名字地址,暫時(shí)為0xffffffff〃由程序動(dòng)態(tài)改成真實(shí)地址movebx,0xffffffffpushebx〃調(diào)用LoadLibrary,加載自已的DLL〃這樣DLL就注入到目標(biāo)進(jìn)程了calleaxpopa//恢復(fù)0X1002A02處的代碼,并跳回去執(zhí)行〃選執(zhí)eax寄存器是因?yàn)?X1002A02后面的代碼沒有直接使用到eaxmoveax,CODE_OFFSETmovdwordptr[eax],0x129815FFmovdwordptr[eax+4],0x458D0100jmpeax}}#pragmapack(push)//保存對(duì)齊狀態(tài)#pragmapack(1)〃設(shè)定為1字節(jié)對(duì)齊structJmpCode{byteop;char*address;WORDjmp;};#pragmapack(pop)intmain(){〃找記事本主窗口句柄HWNDwnd=FindWindow(NULL,"無標(biāo)題-記事本");if(!IsWindow(wnd)){cout<<”記事窗口沒找到"<<std::endl;return1;}〃讀取進(jìn)程ID,和進(jìn)程句柄DWORDpid;HANDLEph;GetWindowThreadProcessId(wnd,&pid);ph=OpenProcess(PROCESS_ALL_ACCESS,false,pid);//在記事本進(jìn)程中分配一頁可讀寫可執(zhí)行的虛擬內(nèi)存void*address=VirtualAllocEx(ph,NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE);〃寫代碼的地址(寫在字符串后面)char*code=(char*)address+strlen(dllname)+1;if(NULL==address){cout<<”分配遠(yuǎn)端內(nèi)存失敗”<<std::endl;return1;}DWORDws;//把代碼寫到內(nèi)存頁中WriteProcessMemory(ph,code,&loaddll,4000,&ws);//把DLL名寫到內(nèi)存頁中WriteProcessMemory(ph,address,dllname,strlen(dllname),&ws);//把loadlibrary的地址寫到Ueax0xfffffff處,把0xffffffff替換為真正的地址//code+9為eax0xffffffff中0xffffffff處的偏移,通過反匯編工具查看+9是為了跳過〃編譯器給loadll函數(shù)生成的框架HMODULEmodule=LoadLibrary("kernel32.dll");FARPROCpro=GetProcAddress(module,"LoadLibraryA");WriteProcessMemory(ph,code+9,&pro,4,&ws);//把dllname的地址寫到ebx0xffffffff處,把dllname作為參數(shù)WriteProcessMemory(ph,code+14,&address,4,&ws);//修改記事本消息循環(huán)處的代碼.JmpCodejmp;jmp.op=0xB8;jmp.address=code+6;〃這段代碼是moveax,地址jmp.jmp=0xE0FF;//jmpeaxaddress=(void*)COD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論