我有一个调用winsocket函数的(旧)应用程序:
struct hostent* FAR gethostbyname(
__in const char *name
);
它目前将其导入为 ws32_dll。#52 ,而不是正常的名称调用。
我的目的只是为了能够在主机搜索发生时打开一个消息框(应该在应用程序启动时)。
我尝试创建一个c ++ dll,其中pragma注释指向#52并将其放在app dir上(包括“exe.local”和“exe.manifest”文件以尝试重定向它)但是它加载了c:\ windows \ system32而不是。
之后,我创建了一个c#项目启动进程本身(因此从Process对象获取PID),将easyhook dll添加到它。
我在http://www.codeproject.com/KB/DLL/EasyHook64.aspx
检查了示例将通话更改为:
FileMon.FileMonInterface Interface;
LocalHook CreateFileHook;
Stack<String> Queue = new Stack<String>();
public Main(
RemoteHooking.IContext InContext,
String InChannelName)
{
// connect to host...
Interface =
RemoteHooking.IpcConnectClient<FileMon.FileMonInterface>(InChannelName);
}
public void Run(
RemoteHooking.IContext InContext,
String InChannelName)
{
// install hook...
try
{
CreateFileHook = LocalHook.Create(
LocalHook.GetProcAddress("ws2_32.dll", "gethostbyname"),
new DCreateFile(GetHostByName_Hooked),
this);
CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
}
catch (Exception ExtInfo)
{
Interface.ReportException(ExtInfo);
return;
}
Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());
// wait for host process termination...
try
{
while (true)
{
Thread.Sleep(500);
// transmit newly monitored file accesses...
if (Queue.Count > 0)
{
String[] Package = null;
lock (Queue)
{
Package = Queue.ToArray();
Queue.Clear();
}
Interface.OnCreateFile(RemoteHooking.GetCurrentProcessId(), Package);
}
else
Interface.Ping();
}
}
catch
{
// NET Remoting will raise an exception if host is unreachable
}
}
[UnmanagedFunctionPointer(CallingConvention.StdCall,
CharSet = CharSet.Auto,
SetLastError = true)]
delegate IntPtr DGetHostByName(
String name);
// just use a P-Invoke implementation to get native API access
// from C# (this step is not necessary for C++.NET)
[DllImport("ws2_32.dll",
CharSet = CharSet.Auto,
SetLastError = true,
CallingConvention = CallingConvention.StdCall)]
static extern IntPtr gethostbyname(
String name);
// this is where we are intercepting all file accesses!
static IntPtr GetHostByName_Hooked(
String name)
{
try
{
Main This = (Main)HookRuntimeInfo.Callback;
MessageBox.Show("hi!");
}
catch
{
}
// call original API...
return GetHostByName(
name);
}
}
}
(可能在这里写了一个拼写错误,但项目成功编译@ home)。
问题是,我不知道我需要做什么来挂钩这个方法&lt; - &gt;应用程序本身。
我的意思是......用c#easyhook挂钩(假设应用程序是“foo.exe”)是什么左派? 我是否需要为easyhook创建自定义dll?(在这种情况下,我需要在内部定义哪些内容?)
我发现它有点......对于一个helloworld钩子来说“复杂”,呵呵。
提前致谢;)
答案 0 :(得分:0)
最后,使用“Grey hack python”这本书教会了我如何使用更少的线条来制作所有这些,并且就像我想要的一样。
还没有exe,但......就是这样。
使用pydbg + hooks。