利用DEBUG API編寫Loader Path

2021-04-22 22:40:43 字數 4682 閱讀 3328

loader並不是什麼很神秘的技術,微軟提供了一組debug api來方便第三方監視程式.這裡我用debug api製作了乙個簡單的loader程式.

這個loader要幹的事有:

1.啟動目標程式.

2.讀取/修改目標程式的記憶體 或 暫存器

用到的debug api有:

createprocess —— 用於建立被除錯程序

waitfordebugevent —— debug loop(除錯迴圈)的主要構成函式

continuedebugevent —— 用於構成debug loop

getthreadcontext—— 得到被除錯程序的暫存器資訊

setthreadcontext —— 設定被除錯程序的暫存器資訊

readprocessmemory —— 得到被除錯程序的記憶體內容

writeprocessmemory —— 設定被除錯程序的記憶體內容

相應的資料結構如下

context —— 暫存器結構

startupinfo —— start資訊

process_information —— 程序相關資訊

debug_event —— debug event(除錯事件)結構

loader具體**如下:

//memoryreader.cpp : 定義控制台應用程式的入口點。

//antidebug:isdebugpresent如何避開?

//加殼處理不完善

//#include 

"stdafx.h

"#include 

"windows.h

"#include 

"commdlg.h

"#include 

"winnt.h

"byte int3 

=0xcc;//

寫入前的

byte old;

//頁面屬性

dword oldprotect;

//是否已寫入int3

bool

hasint3 

=false

;bool

isfirstint3 

=true

;dword breakpoint 

=0x00452191

;byte org[8] 

=;//判斷是否解壓完成

bool

isunpacked(process_information pi)

return

false;}

//寫int3

bool

writeint3(process_information pi)

//改回去

bool

cleanint3(process_information pi)

context context;

zeromemory(

&context,

sizeof

(context));

context.contextflags 

=context_full 

|context_debug_registers;

getthreadcontext(pi.hthread,

&context);

context.eip--;

setthreadcontext(pi.hthread,

&context);

printf(

"已經改回去了,eax:%x/n

",context.eax);

return

ret;}//

隱藏debug

void

hidedebug(process_information pi)

intmain(

intargc, 

char

*argv)

//anti-anti-debug

hidedebug(pi);

debug_event devent;

intdllcount =0

;while

(true)

printf(

"program stopped at what we want/n");

char

key[

256];

virtualprotectex(pi.hprocess,(lpvoid)breakpoint,

1,page_readwrite, 

&oldprotect);

readprocessmemory(pi.hprocess,(lpcvoid)context.edx,key,

sizeof

(key),null);

virtualprotectex(pi.hprocess,(lpvoid)breakpoint,

1,oldprotect,

&oldprotect);

printf(

"讀出來的東西是 %s/n

",key);        

}resumethread(pi.hthread);

}    

break

;case

exception_single_step:

printf(

"2 exception_single_step/n");

break

;case

exception_access_violation:

printf(

"讀寫位址出錯/n");

printf(

"%d,%x/n

",devent.u.exception.exceptionrecord.exceptioninformation[

0],devent.u.exception.exceptionrecord.exceptionaddress);

continuedebugevent(pi.dwprocessid,pi.dwthreadid,dbg_exception_not_handled);

/*char nop[3];

nop[0] = 0x90;

nop[1] = 0x90;

nop[2] = 0x90;

pvoid pathaddress;

pathaddress = devent.u.exception.exceptionrecord.exceptionaddress;

virtualprotectex(pi.hprocess,pathaddress,3,page_readwrite, &oldprotect);

writeprocessmemory(pi.hprocess,pathaddress,nop,3,null);

virtualprotectex(pi.hprocess,(lpvoid)breakpoint,1,oldprotect,&oldprotect);

continuedebugevent(pi.dwprocessid,pi.dwthreadid,dbg_exception_not_handled);        

*/break

;default

:break;}

break

;case

load_dll_debug_event:

//獲取dll name太複雜,暫時做不到

dllcount ++;

printf(

"%d,program loads a dll from baseimage:%x,imagename:%x/n

",dllcount,devent.u.loaddll.lpbaseofdll,devent.u.loaddll.lpimagename);                if(

!hasint3)

}break

;case

unload_dll_debug_event:

printf(

"unload a dll from baseimage:%x,imagename:%x/n

",devent.u.loaddll.lpbaseofdll,devent.u.loaddll.lpimagename);                if(

!hasint3)

}break

;case

output_debug_string_event:

break

;case

exit_process_debug_event:

printf(

"除錯程式已退出");

break

;default

:printf(

"%d/n

",devent.dwdebugeventcode);

break;}

continuedebugevent(pi.dwprocessid,pi.dwthreadid,dbg_continue);

}else}//

keymake中不要這兩句

closehandle(pi.hprocess);

closehandle(pi.hthread);

return0;

}目前版本功能:

1.啟動目標程式

2.向指定位置寫入int3斷點

3.讀取/設定指定位置暫存器值

4.讀取/修改指定位置記憶體值

5.解壓一些壓縮和加密殼

6.一些anti-anti-debug功能

利用VC編寫MFC OpenGL嚮導

mfc opengl使用者嚮導原程式工程,此次修正了沒有中文支援的錯誤。3.執行build命令,整合開發環境會生成mfc opengl.awx,並自動拷貝到 c program files microsoft visual studio common msdev98 template 目錄下。編輯o...

LoadRunner利用ODBC編寫MySql指令碼

分類 4.軟體設計 架構 測試舉報 loadrunner mysql 指令碼資料庫 sqlserver測試 最近做了幾周的loadrunner測試,有一些心得,記錄下來,以便以後查詢。loadrunner測試資料庫是模擬客戶端去連線資料庫伺服器,因此,需要協議 或者說驅動的支援 loadrunner...

利用MATLAB編寫高斯積分

function m intgauss n n代表所求節點的個數 syms x for i 1 n for j 1 n y i,j int log x x i 1 x n j 0,1 積分的權函式不同則log x 會改變 endend y y表示權函式與正交函式與w x 的積分值所構成的方陣 for...