2014-11-06 94 views
0

我試圖在運行時和遠程啓動駐留在另一個程序中的函數。遠程調用函數設置EAX和ECX

使用ollydbg我得到了函數地址和即時通訊使用CreateRemoteThread來啓動這個函數,它實際上運行這個函數,但它收回兩個參數,沒有這些參數程序崩潰。

的問題是,這種機能的研究得到的參數/從EAX和ECX參數都推到這個功能,它被稱爲前(這兩個值是去從1到576這兩個矩陣coordenates ~~)

Function its called at 10038B1 and recives ECX and EAX

Createremotethread沒有爲inseting參數工作,我試圖使用結構使用多個(2)參數,但寄存器的值不會改變。

我該如何通過從另一個不同的程序啓動並設置這兩個寄存器來使其他程序運行此功能?

這就是我所說的線程0x01003084

struct tagRemoteThreadParams //didnt worked 
    { 
     int Param1; 
     int Param2; 
    } RemoteThreadParams, *PRemoteThreadParams; 


    RemoteThreadParams.Param1 = 0x00000001;//didnt worked 
    RemoteThreadParams.Param2 = 0x00000001;//didnt worked 


    int address=0x010038B1; // 0x01003084 -- 0x01002FE0 -- 0x01003512 //Some addresses 

    RedrawWindow(Find,NULL,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_INTERNALPAINT|RDW_FRAME); //my program stuff 

    DWORD rc; 

    //this is where i call the function 
    CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)address,&RemoteThreadParams,0,&rc); 

    rc = WaitForSingleObject(hProcess, 30000); 
    CloseHandle(hProcess); 
    VirtualFreeEx(hProcess, (LPVOID)address, 0, MEM_RELEASE | MEM_DECOMMIT); 

記住,我不希望使用DLL注入到執行該功能具有代碼(這不是什麼即時搜索),我實際上只想用一個代碼來做這件事。 謝謝。

+0

直接處理寄存器是OS /目標特定?您是否錯過了指定縮小的標籤? – 2014-11-06 20:24:01

+0

這是在Windows,IA32 – Ollegn 2014-11-06 20:31:02

+0

許多編譯器允許在C/C++代碼中嵌入彙編指令,但不同編譯器之間的語法差別很大。你使用什麼編譯器?你有沒有閱讀過文檔? – Paulo1205 2014-11-06 21:08:55

回答

1

您唯一的解決方案的確是將代碼注入到另一個進程中,該進程可以正確設置寄存器,然後調用您想要調用的函數。 CreateRemoteThread具有嚴格的調用約定,因此您不能強制它在輸入時具有特定的寄存器值。

另一種方法是在Windows中使用debug functionality來更改寄存器內容,但這需要您在正確的位置停止代碼並在繼續之前設置寄存器。這是棘手的,大多數應用程序(假設我們正在玩遊戲等)有防止調試功能與他們的狀態「搞亂」的保護。

1

那麼,您不能將該函數作爲CreateRemoteThread的線程處理函數傳遞,因爲該函數沒有正確的簽名。所以,你需要傳遞一個具有正確簽名的函數。

一個很常見的方法是通過LoadLibrary的地址。你需要提供你自己的DLL。該DLL的DllMain然後可以創建一個調用您的函數的新線程。

但你說你不想涉及另一個DLL。所以在我看來,留下一個選擇。在目標進程的虛擬地址空間中分配一些內存。使該內存具有可執行的保護。在該內存中寫入一個具有CreateRemoteThread正確簽名的線程程序。然後在這個線程過程中,最後調用所需的函數。