編寫病毒程式時,由於各種原因不能直接呼叫函式,所以需要手動獲取到函式然後呼叫它。最常見手動獲取函式位址的方法是通過獲取kernel32.dll控制代碼,然後遍歷kernel32.dll的匯出表找到它的getprocaddress()函式,再通過向這個函式傳遞函式名就可以獲取函式的位址了,最後通過乙個函式指標就可以呼叫獲取的函式。
1.通過fs暫存器獲取到teb的位址
2.通過teb+0x30獲取到peb
3.通過peb+0x0c獲取到peb_ldr_data結構體指標
4.peb_ldr_data結構體偏移0x1c處為成員ininitializationordermodulelist,即初始化模組鍊錶,通過這個鍊錶可以找到按順序載入到程序中的模組,第乙個載入的通常是ntdll.dll,第二個是kernel32.dll或者是kernelbase.dll。無論是kernel32.dll還是kernelbase.dll,它們的匯出表中都有getprocaddress函式的位址。
5.經過上面的步驟可以找到kernel32.dll,對應**如下:
__asm
6.找到kernel32.dll的匯出表,遍歷匯出表找到loadlibrary和getprocaddress,需要loadlibrary的原因是有些程式預設沒有載入user32.dll(或其他dll),而想要手動呼叫的函式大多數都在這些dll當中,比如說messagebox就屬於user32.dll,所以需要呼叫loadlibrary將user32.dll載入到程序空間中,否則呼叫messagebox會失敗。對應**如下:
for (int i = 0; i < pied->numberofnames;i++)
if (strcmp((char *)(*(dword *)name + hmodule),"getprocaddress") == 0)
name += 4;
}
7.找到loadlibrary和getprocaddress以後就可以呼叫需要的函式了。
#include
"stdafx.h"
#include
typedef
hmodule
(winapi *myloadlibrary)
(_in_ lpctstr lpfilename)
;typedef
farproc
(winapi *mygetprocaddress)
(_in_ hmodule hmodule, lpcstr lpprocname)
;typedef
int(winapi *mymessagebox)
(hwnd hwnd, lpctstr lptext, lpctstr lpcaption, uint utype)
;int
_tmain
(int argc, _tchar* argv)
image_dos_header *pdos =
(image_dos_header *
)hmodule;
image_nt_headers *pnt =
(image_nt_headers *
)(hmodule + pdos->e_lfanew)
; image_data_directory *pidd =
(image_data_directory *)(
(dword)pnt +
0x78);
//+0x78指向資料目錄表中的匯出表
image_export_directory *pied =
(image_export_directory *
)(hmodule + pidd->virtualaddress)
; dword *arrayaddress =
(dword *
)(hmodule + pied->addressoffunctions)
;//函式位址表
dword name = hmodule + pied->addressofnames;
//函式名稱表
short *ordinals =
(short *
)(pied->addressofnameordinals + hmodule)
; bool isfound = false;
for(
int i =
0; i < pied->numberofnames;i++)if
(strcmp((
char*)
(*(dword *
)name + hmodule)
,"getprocaddress")==
0)name +=4
;}if(lib != invalid_handle_value && lib !=
null
)else
system
("pause");
return0;
}
手動配置IP位址
更改介面卡屬性 選擇乙個網路,單擊右鍵 屬性 internet 協議版本 4 tcp ipv4 屬性 進入如下介面,開始配置 ip位址用於網路通訊,根據我的位址找到我 根據機器的ip位址找到這台機器在網路中的位置,確定了位置就可以向這台機器發資訊互動了。前2位是192.168,後2位可自己取,0,2...
獲取成員函式位址的方法
關於通過成員函式指標來獲得成員函式位址的方法確實比較困難。它的困難點在於必須繞過c 編譯器的型別檢查。像vc對成員函式指標型別檢查的很嚴,即使是void 型別都不能轉,也無法通過reinterpret cast dynamic cast之類的來轉。因此我這裡將採取暴力手段來獲取 include us...
linux c函式獲取系統IP位址
一,通過分析 etc hosts檔案裡對映關係獲取ip位址。include include int main gethostname hostname,sizeof hostname he gethostbyname hostname printf hostname s n hostname pri...