簡體   English   中英

如何使用asm掛鈎C ++函數

[英]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.

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