程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> WINDOWS黑客基礎(5):利用內存來進行獲取計算結果

WINDOWS黑客基礎(5):利用內存來進行獲取計算結果

編輯:C++入門知識

在前面的注入代碼的章節中,我們利用了VirtualAllocEx來在對方的進程開辟了一塊內存,並且將代碼復制進對方進程的內存裡面,從而執行那段內存的代碼,但是這裡有一個問題,就是代碼不是執行在我們進程內的,所以我們無法像在本進程編程那樣直接利用返回值或者傳入指針來獲取計算結果,這個時候我們可能需要到很多通訊手段,但是這樣將會讓我們的注入代碼變得非常復雜,所以我自己想了一個方法,就是利用VirtualAllocEx開辟的內存區域來進行通訊

 

整體的步驟是這樣的:

1.在對方的內存開始一塊內存,

2.復制代碼進去

3.根據代碼計算出我們的結果應該放在哪裡,比如我們申請了100字節的內存,其中50字節是代碼,那麼我們應該想辦法把我們的結果放在50字節以後的地方

4.假設根據上面的步驟,我們的結果放在了內存偏移地址為60的地方,那麼我們可以將指向這快內存的指針向後移動60個字節,那麼這個就是我們存放結果的地方

 

上面的這種方法當然只是適合存放小數據的,如果有大的數據需要傳出來,我們還是需要其他的手段,比如開辟共享內存,利用SOCKET等手段

 

有人也會說專門開辟一塊內存存放數據,這樣的話我們就可以把內存放在這個地方,而不是把代碼跟計算結果混淆,但是要知道,因為內存映射的原因,指向同一塊物理內存的不同進程對應的虛擬內存地址不一定是一樣的,也就是說,我們把代碼從A進程注入了B進程,此時我們的在A進程向B進程VirtualAllocEx了一塊內存,在A進程的地址是1000,我們的代碼也是把數據寫入到虛擬內存地址1000的,但是這段代碼是在B進程執行的,那麼B進程虛擬內存地址1000是什麼東西??沒人會知道

 

在這個方法中還有一個比較重要的就是取得當前代碼運行的地址,本來寄存器是有EIP這個寄存器可以讓我們看到究竟程序運行到了哪個內存地址的代碼,但是我們在編譯器中無法使用EIP,也無法讀取,所以我們使用另外一種方法,就是call 命令,CPU在執行CALL命令後,會把我們的下一段代碼的地址push到棧裡面,這個時候我們可以利用這樣獲取下一段代碼的地址

call  Next

Next:pop eax

這樣,eax裡面就是我們next:pop eax這段代碼的地址了

但是後來我想了下,這種方法不是很安全,原因跟上面說的那個一樣,指向同一塊物理內存的不同進程對應的虛擬地址不一定是一樣的,而編譯器在給我們編譯cal next的時候已經把地址寫死了,我試驗了下,兩個不同進程的虛擬內存地址是一樣的,但是我沒找到肯定的說明,所以沒辦法確定,因此這種方法不是很安全

 

我本來還想用另外一種方法就是CONTEXT,windows下有GetThreadContxt可以獲取當前線程的context,但是這個方法也沒辦法拿到正確的EIP,因為如果一個線程沒有停止運行,EIP會變,但是我想了下,在我們debug的時候有辦法拿到函數調用棧,那麼應該也有辦法獲取函數的調用棧,這個辦法也許雖然不能拿到EIP,但是卻可以拿到線程一些函數的地址,後面也可以通過函數地址+offset來將數據放到內存的某個地方

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved