「改變」外部DLL中的代碼並不容易,但是如果你想修改一個參數或返回的結果並不難。攔截調用以修改輸入或輸出的過程稱爲「Hooking」。
在C#中有一個易於使用的庫,可以完成大部分工作,稱爲EasyHook,這將允許您攔截調用並用您自己的結果替換返回值。
static IntPtr CreateFile_Hooked(
String InFileName,
UInt32 InDesiredAccess,
UInt32 InShareMode,
IntPtr InSecurityAttributes,
UInt32 InCreationDisposition,
UInt32 InFlagsAndAttributes,
IntPtr InTemplateFile)
{
try
{
Main This = (Main)HookRuntimeInfo.Callback;
lock (This.Queue)
{
if (This.Queue.Count < 1000)
This.Queue.Push(InFileName);
}
}
catch
{
}
// call original API...
return CreateFile(
InFileName,
InDesiredAccess,
InShareMode,
InSecurityAttributes,
InCreationDisposition,
InFlagsAndAttributes,
InTemplateFile);
}
在上面的代碼需要傳遞的參數InFileName
並記錄您的外部mointoring程序中以後使用。你可以很容易地捕獲從CreateFile
(或你調用的任何真正的dll函數)返回的結果,將其修改爲任何你想要的,然後返回修改後的值。
對於原始函數的調用者,他們不知道他們從DLL調用中獲得的值在他們收到之前已被修改。
只是爲了澄清,你想做'你的應用程序---->外部DLL函數調用 - >外部DLL函數調用結果 - (修改結果值在這裏) - >你的應用程序' –
也看對我來說是廣泛的...是的,可以改變現在正在運行的任何代碼(除了已經在CPU管道中的微小部分)。要獲得實際的答案(即黑客工具之外的東西) - 請解釋你的真正目標是什麼。 –
我想改變原來的dll的返回值,而不需要重新編譯,或者反彙編/修改/重組等。基本上,通過用新代碼注入外部DLL來改變應用程序的源代碼。我只是想知道在這一點上是否可能,我對如何不感興趣。 說明:通過在運行時更改源代碼,我不希望它在關閉應用程序時保持原樣。只是一次性更改(除非每次都注入)。 – Gallaxhar