簡體   English   中英

如何訪問另一個進程的內存並調用其函數?

[英]How can you access memory of another process and call its functions?

我想學習如何讀取其他進程內存並讓我的程序調用其他進程函數,而不是我自己的參數和東西。 我用谷歌搜索它,似乎你需要使用像ReadProcessMemory這樣的東西,但我找不到任何好的教程來解釋如何使用它們。 誰能指出我正確的方向來學習這樣的事情? 我希望在Windows上使用C ++(或者如果可能的話)使用Java(如果重要的話,可以使用7和64位)。

另外,我知道這聽起來很主觀,可以用於惡意目的,但我保證不會因為任何有害的原因而使用從中獲得的任何知識。 我純粹想要學習這個以獲得樂趣並自學一些新東西。

您無法直接調用其他進程中的函數,因為您的進程和其他進程具有不同的地址空間。 解決此問題的一種方法是在進程中創建一個遠程線程(使用CreateRemoteThread或RtlCreateUserThread),但這只允許您將一個參數傳遞給該函數。 您可以嘗試創建遠程線程,將參數寫入其堆棧並使用SetThreadContext更改其寄存器。 另一種方法是注入自己的DLL來調用該函數。

另一個問題是找到要調用的函數。 您可能需要為不導出所需功能的EXE或DLL加載符號。

有關Windows內部的一般問題,請嘗試詢問Sysinternals論壇

編輯:在事先不知道圖像文件中的指令和數據布局的情況下,在程序中很難做到你所說的(讀取進程檢查用戶輸入的字符串)。 例如,如果你有一個crackme程序,你可以使用像IDA Pro這樣的靜態分析工具,也可以在調試器下運行程序。 無論哪種方式,這些東西通常需要人為輸入,並且很難自動完成。

過程 ,通過設計和根據定義,彼此隔離。 他們有獨立的地址空間。

操作系統將其進程分開並分配所需的資源,以便它們不太可能相互干擾......

他們當然可以通過某種形式的進程間通信進行通信,但只有在他們選擇時才進行通信

但是, 線程 (有時稱為輕量級進程)共享其地址空間並可以讀取彼此的數據結構。

不確定,你的意思是什么

調用其他進程函數

函數f()可以編譯成多個進程的可執行代碼。 進程A和進程B可以在其上下文中獨立調用f()

否則,進程A可以“通信”到進程B以執行某些動作,例如可以在B中的函數g()中實現.B可以在其上下文中執行它並且將結果“通信”回到A.

我無法看到任何有益的用途,但無論如何。 至少有兩種方法可以讓另一個進程調用一些東西:

1) CreateRemoteThread() ,將在進程中創建一個線程。

2) QueueUserAPC()將使該進程中的現有線程調用回調函數。

如果禁用ASLR,那么調用不帶參數的函數就足夠了。 否則,您還需要VirtualQueryEx()ReadProcessMemory()WriteProcessMemory()

是的,這不是在java :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM