遠端注入手段 及 記憶體操作

2021-07-07 07:27:24 字數 3067 閱讀 1596

有兩個函式可以用來實現上述功能:virtualallocex和createremotethread。這兩個函式都只能在windows nt下使用。

virtualallocex函式可以用來在其他程序的位址空間內申請記憶體,當然申請到的記憶體也是位於目標程序的位址空間內的,將這個函式和writeprocessmemory函式配合就可以在目標程序的位址空間中「造」出任何東西來。

virtualallocex函式是virtualalloc的擴充,相比之下,virtualallocex函式多了乙個引數hprocess,其他引數定義和使用的方法都和virtualalloc函式相同,新增的hprocess引數用來指定要申請記憶體的程序控制代碼,如果需要在目標程序中使用virtualallocex函式,那麼必須對程序擁有process_vm_operation許可權。

如果記憶體申請成功,函式返回乙個指標,指向申請到的記憶體塊,當然這個指標是針對目標程序的位址空間的。如果記憶體申請失敗,函式返回null。

createremotethread函式用來在其他程序內建立乙個執行緒,當然建立的執行緒是執行於目標程序的位址空間內的,它和目標程序自己建立的執行緒並沒有什麼區別。

該函式是createthread函式的擴充,與createthread相比,createremotethread函式多了乙個hprocess引數,其他所有引數的定義和用法都與createthread的引數相同。hprocess用來指定要建立執行緒的目標程序控制代碼。注意:lpstartaddress指向的執行緒函式的位址是位於目標程序的位址空間內的。如果需要在目標程序中使用createremotethread函式,那麼必須對程序擁有process_create_thread許可權。

使用virtualallocex和createremotethread函式,再配合writeprocessmemory函式,就能夠讓一段**在其他程序中執行,由於遠端執行緒是屬於目標程序的,所以在任務管理器中不會產生新的程序,事實上,誰也不會發現列出的某個程序中會多了乙個不屬於它自己控制的執行緒。整個實現的過程歸納如下:

(1)使用virtualallocex函式在目標程序中申請一塊記憶體,記憶體塊的長度必須能夠容納執行緒使用的**和資料,記憶體塊的屬性應該是page_execute_readwrite,這樣拷貝到記憶體塊中的**就可以被執行。

(2)使用writeprocessmemory函式將需要在遠端執行緒中執行的**(包括它使用的資料)拷貝到第(1)步申請到的記憶體塊中。

(3)使用createremotethread函式建立遠端執行緒。

readprocessmemory與writeprocessmemory

首先介紹乙個函式virtualprotectex,它用來改變乙個程序的虛擬位址中特定頁裡的某一區域的保護屬性,這句話有些咬嘴,直接從msdn中翻譯過來的,簡單來說就是改變某一程序中虛擬位址的保護屬性,如果以前是唯讀的,那改變屬性為page_execute_readwrite後,就可以更改這部分記憶體了。

具體看它的實現

bool winapi virtualprotectex(

__in   handle hprocess,

__in   lpvoid lpaddress,

__in   size_t dwsize,

__in   dword flnewprotect,

__out  pdword lpfloldprotect

);第乙個引數是程序的控制代碼,這個控制代碼可以使用由createprocess()函式得到的process_information結構中的hprocess成員,createprocess()這個函式相信大家用的很多了,我就不詳細介紹了。如果僅僅知道hprocess的id,那麼可以通過openprocess()函式得到,openprocess()有三個引數,最後乙個引數就是程序的id,它的返回值為程序的控制代碼。如果想得到執行緒的控制代碼,同樣可以採用這兩種方式,利用結構體process_information重的hthread成員或使用函式openthread()。

第二個引數lpaddress就是頁中要改變保護屬性的位址。第三個引數dwsize改變保護屬性區域的大小,以位元組為單位。通過這兩個變數就可以確定要改變包括屬性的區域了。

第四個引數fnewprotect是要改變的保護屬性。包含page_execute_readwrite,page_readonly等,但先看第五個引數lpfoldprotect,是用來儲存為改變之前的記憶體區域的保護屬性,也就是說我們可以先備份之前的保護屬性,然後將屬性更改為page_execute_readwrite,然後對記憶體區域進行一些操作,然後再將內區域更改回來。

接下來看readprocessmemory()函式

bool winapi readprocessmemory(

__in   handle hprocess,

__in   lpcvoid lpbaseaddress,

__out  lpvoid lpbuffer,

__in   size_t nsize,

__out  size_t *lpnumberofbytesread

);第乙個引數hprocess為程序的控制代碼,第二個引數lpbaseaddress為要讀取內容的基位址,當然你事先要了解你要讀取內容的基位址。第三個引數lpbuffer為接收所讀取內容的基位址。第四個引數為要讀取內容的大小,以位元組為單位。最後乙個引數lpnumberofbytesread為接收讀取內容的buffer中收到的位元組數。一般都設為null,這個該引數將被忽略掉。

使用readprocessmemory()函式,可以獲得該程序記憶體空間中的資訊,或是用於監測程序的執**況,或是將程序內的資料備份,然後呼叫writeprocessmemory()進行修改,必要時再還原該程序的資料。

bool winapi writeprocessmemory(

__in   handle hprocess,

__in   lpvoid lpbaseaddress,

__in   lpcvoid lpbuffer,

__in   size_t nsize,

__out  size_t *lpnumberofbyteswritten

);該函式與readprocessmemory的引數基本相同,只不過第三個引數lpbuffer為要寫入程序的內容。

將記憶體的內容更改後,別忘了呼叫virtualprotectex()恢復記憶體原來的保護屬性。

sql注入手段整理

注入產生原因 使用者引數中夾帶sql語句,未加識別就被帶入到後台資料庫查詢。相關知識點 mysql資料庫中有information schema庫,當中有表 1.schemata 儲存該使用者建立的所有資料庫庫名,欄位為 schema name 2.tables 儲存庫名和表名,欄位為 table ...

ado sql操作及防止注入

sql.format t delete from sellinfo where merchandise s m name m pconnection execute bstr t sql,null,adcmdtext m list.deleteitem pos sql connectionptr s...

Python的記憶體管理機制及調優手段

記憶體管理機制 引用計數 垃圾 記憶體池 引用計數 引用計數是一種非常高效的記憶體管理手段,當乙個python物件被引用時其引用計數增加1,當其不再被乙個變數引用時則計數減1,當引用計數等於0時物件被刪除。弱引用不會增加引用計數 垃圾 1.引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀 ...