2009-12-18 26 views
1

我不知道程序集,所以我不知道如何去做這件事。使用__asm從十六進制偏移調用函數

我有一個掛鉤到另一個程序。我已經獲得的偏移量,其中功能位於鉤程序的.exe

#define FuncToCall 0x00447E5D 

所以現在我怎麼能使用__asm {}內調用該函數?

回答

1

我想你也可以將該地址轉換爲函數指針並以此方式進行調用。這可能會更好。

+0

所以像((* void)FuncToCal)(); ? – 2009-12-18 03:02:15

+0

是的,但我認爲這是UB。 – 2009-12-18 03:06:50

+0

我不是100%的,所以我不想編輯我的帖子,但是如果你知道函數的簽名(你應該這樣做),你可能可以做類似於: typedef int(* pt2Function) (float,char,char); (void *)FuncToCall)(3.0,'a','b'); – Mongoose 2009-12-18 03:07:48

3

那麼簡短的答案是,如果你不知道集會你不應該這樣做,哈哈。但是,如果你的意圖是在牆上黑客,我的意思是,修改一個合法程序的操作,你不能只是一個地址,並稱它爲好。您需要查找符號(如果在開心linux領域)或使用sig掃描(或兩個D =)來查找實際功能。

一旦你這樣做,那麼它比較簡單,你只需要寫一個mov和jmp。假設你有訪問正在運行的進程已經和你的簽名掃描儀找到了正確的地址,這段代碼會得到你想要你想要

mov eax, 0×deadbeef 
jmp eax 

現在,如果你想要這個功能是一個類的方法..你需要做更多的學習。但是這個程序集可以運行任何你想要的靜態函數。

對於不同的調用約定也有一些混亂,所以沒有評論者試圖打電話給我,對於這個問題來說這是遠遠不夠的。

編輯: 順便說一句,我不使用調用,因爲當使用調用時,你必須擔心堆棧幀和其他非常混亂的東西。該代碼將跳轉到任何地址並開始執行。

如果你想回到你的代碼那是另一回事,但會得到你的目標函數,只要去其正確調用約定,而不是一個類的方法,等等等等

+0

這是一個很好的介紹信號掃描http://wiki.amxmodx.org/Signature_Scanning – Charles 2009-12-18 03:10:25

1

感謝的答案,但我弄清楚了。這是我在做什麼:

#define FuncToCall 0x00447E5D 
DWORD myfunc = FuncToCall; 
__asm call dword ptr [myfunc]; 

如果它的工作不解決它,並通過golly它的工作。

0

這是一個棘手的問題: 你可以使用它的參數和返回值。它只是將所有的函數轉發給你想要調用的函數,這個函數是由一個指針(FuncToCall)給出的。

void call_FuncToCall(.......) 
{ 
    __asm__ 
    ("call label1\n label1:\n" 
    "pop %eax\n" 
    "movl FuncToCall, %eax\n" 
    "leave\n" 
    "jmp *%eax"); 
}