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...