[英]How to hook C++ functions with asm
我想掛鈎一個C ++函數。 但我不想使用ms繞道的蹦床機制,而不是我想要完全修補它。 我可以得到DLL的句柄,函數所在的位置,我有正確的偏移量(imageBase東西......)。 那怎么掛鈎呢? 我不知道參數的數據類型(var_4和arg_0),還是不需要它們? 一般來說我想用我自己的函數替換下面的函數(我的函數幾乎相同,只有一行更改):
sub_39001A40 proc near
var_4 = dword ptr -4
arg_0 = dword ptr 4
push ecx
cmp dword_392ADAB4, 0
jnz short loc_39001A4F
call loc_39024840
loc_39001A4F:
push esi
mov esi, [esp+8+arg_0]
lea eax, [esp+8+var_4]
push eax
push esi
call dword_392ADA98
mov ecx, [esp+10h+var_4]
add esp, 8
add dword_392ADA80, ecx
adc dword_392ADA84, 0
add dword_392ADA90, esi
pop esi
adc dword_392ADA94, 0
add dword_392ADA7C, 1
pop ecx
retn
sub_39001A40 endp
這很糟糕,我只能掛鈎功能,我知道這些名字有很多東西。 我無法通過繞道鈎住那些asm函數,因為我需要為創建函數結構傳遞的參數的數據類型!
編輯::::
“走彎路有什么問題?”
我寫道:“我不想使用ms繞行的蹦床機制,而不是我想完全修補它。” 並且“這很糟糕,我只能掛鈎函數,我知道這些函數有很多東西。我不能用繞道來掛鈎那些asm函數,因為我需要為創建函數結構而傳遞的參數的數據類型!” 我沒有C ++文件的源代碼。 我只有hex-dump。
“蹦床是一個實際的技術術語:)我只是想知道為什么@lua不能使用它。”
我寫道:再讀一遍我的句子,如果你還不明白為什么,我的英語很糟糕。
“只覆蓋命名函數應該可以工作,當然你可能需要重新實現整個DLL(取決於它是否對你有任何進一步的用處)。鑒於你對匯編程序的掌握,你可能會使用十六進制編輯器來實現編輯(副本)您想要破壞的原始DLL。“
我想掛鈎該功能,因為我不想編輯該文件。 我無法覆蓋我的函數,因為我不知道參數的數據類型和函數的名稱。
@asveikau:感謝您的真正幫助,但我不想使用蹦床機制,我想覆蓋該功能。
一個很好的技巧是用這個替換前幾個指令:
push dword xxxx ; where xxx = new code location
ret
這有點像混淆的jmp
。 我這樣寫它是因為組裝版本很容易在運行時用指針替換push
操作數。 它組裝成:
68 XX XX XX XX c3
“XX XX XX XX”是您在little-endian的地址。
然后你可以做一個“調用函數的舊版本”代碼位置,其中前幾個指令是你用上面的序列替換的指令,然后跳轉到原始代碼中的下一個有效指令。
覆蓋命名函數應該可以工作,當然您可能需要重新實現整個DLL(取決於它是否對您有任何進一步的用途)。 鑒於您對匯編程序的掌握,您可能會使用十六進制編輯器來編輯(您的副本)您想要破壞的原始DLL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.