手動獲取函式位址

2021-09-02 01:14:19 字數 2480 閱讀 6038

編寫病毒程式時,由於各種原因不能直接呼叫函式,所以需要手動獲取到函式然後呼叫它。最常見手動獲取函式位址的方法是通過獲取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...