Применение подключения (Winsock) от C ++ / C # #
Вопрос
Я получил (старое) приложение, которое вызывает функцию Winsocket:
struct hostent* FAR gethostbyname(
__in const char *name
);
В настоящее время он импортирует его как ws32_dll. # 52 вместо этого требуемое имя вызывает.
Мое намерение - это просто чтобы иметь возможность сделать что-то вроде открытия сообщения Message, когда происходит поиск хоста (который должен быть в начале приложения).
Я пытался создать C ++ DLL с комментариями Pragma, указывая на # 52 и помещаю его в приложение DIR (включая файлы «exe.local» и «exe.manifest», чтобы попытаться перенаправить его), но он загрузил C: Windows System32 вместо этого.
После этого я создал проект AC #, запускающий сам процесс (отсюда, получая 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).
Дело в том, что я не знаю, что мне нужно сделать зацепляющую это методы <-> сама приложение.
Я имею в виду .. Какие левки просто делают зацепление с C # EasyHook (при условии, что приложение «Foo.e.exe»)? Нужно ли мне создать пользовательскую DLL для EasyHook? (В этом случае какой контент мне нужно определить внутри?)
Я нашел это немного ... «Комплекс» для крючка HellowOrld, хе-хе.
Заранее спасибо ;)
Решение
В конце концов, используя «Grey Hack Python», книга «У меня», как сделать все это с меньшим количеством линий, а только то же самое хотелось.
Нет exe, но ... Вот и все.
Используя Pydbg + крючки.