2011-08-28 89 views
3

我想鉤一個C++函數。但我不想使用ms distort的蹦牀機制,而不是我想完全修補它。我可以得到函數所在的DLL的句柄,並且我有正確的偏移量(imageBase的東西...)。那麼如何掛鉤呢?我不知道參數的數據類型(var_4和arg_0),還是不需要它們?總的來說,我想替換下我自己的一個功能(我的功能幾乎是一樣的,有隻改線):如何掛鉤C++函數與asm

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 

它的壞,我只能掛接函數,我知道有MS檢測,其名少走彎路。我無法將這些asm函數掛鉤,因爲我需要爲創建函數結構傳遞參數的數據類型!

編輯::::

「有什麼不好的彎路,到底是什麼?」

我寫道:「我不想用ms蹦牀的蹦牀機制,而不是我想完全修補它。」和「這很糟糕,我只能使用hook函數,這些函數的名字是我用ms detours所知道的,我不能使用繞行函數來掛接這些asm函數,因爲我需要爲創建函數結構傳遞的參數的數據類型!而我沒有C++文件的源代碼。我只有十六進制轉儲。

「蹦牀是一個實際的術語:)我只是想知道爲什麼@lua不能使用它。」

我寫:再讀一遍我的句子,如果你還不明白爲什麼,我的英文不好。

「重寫只是命名函數應該工作,當然你可能需要重新實現整個DLL(取決於它是否對你有任何進一步的用處)。給定你對彙編器的掌握,你可能會忽略使用一個十六進制編輯器來編輯(你想要顛覆的)原始DLL的副本。「

我想掛鉤函數,因爲我不想編輯文件。我不能覆蓋我的函數,因爲我不知道參數和函數名稱的數據類型。

@asveikau:感謝您的真正幫助,但我不想使用蹦牀機制,我想覆蓋該功能。

+0

走彎路有什麼問題呢? – bdonlan

+0

@bdonlan,我在這裏顯然低估了lua。我雖然蹦牀被用來作爲毫秒機制膨脹的貶義詞。似乎彎路實際上是一個我一無所知的着名程序。 – John

+1

蹦牀是一個實際的術語:)我只是想知道爲什麼@lua不能使用它。 – bdonlan

回答

0

覆蓋只是命名函數應該工作,當然,您可能需要重新實現整個DLL(取決於它是否有任何進一步的使用)。鑑於您對彙編程序的掌握,您可能會使用十六進制編輯器編輯您想要破壞的原始DLL的(副本)。

1

一個好的技巧是用它來取代最初的幾個指令:

push dword xxxx ; where xxx = new code location 
ret 

這有點像一個模糊jmp。我這樣寫,因爲這個組合版本很容易在運行時用指針替換push操作數。它彙編爲:

68 XX XX XX XX c3 

其中「XX XX XX XX」是您在小端的地址。

然後,您可以「調用舊版本的函數」代碼位置,其中前幾個指令是您用上面的序列替換的那些指令,然後跳轉到原始代碼中的下一個有效指令。

+2

當然,難的部分是正確地重新安置原來的指示,當可能的功能可能跳回到它的自己開始等... – bdonlan

+0

還要注意,這與走彎路使用基本相同。 – bdonlan

+0

@bdonlan - 是的,這很可能是繞行做的,是的,如果通過跳轉或其他方式再次引用指令的前6個字節,它的確有一定的侷限性。如果我不得不猜測,後者在C代碼中並不常見,因爲大多數函數都是以枯燥的東西開始,比如設置幀指針。因人而異。 – asveikau