سؤال

حصلت على تطبيق (قديم) يدعو إلى وظيفة WinSocket:

struct hostent* FAR gethostbyname(
  __in  const char *name
);

انها حاليا تستوردها كما WS32_DLL.#52 بدلا من ذلك الاسم العادي استدعاء.

نيتي هي فقط أن أكون قادرًا على القيام بشيء مثل فتح مراسلة الرسائل عند حدوث بحث مضيف (والذي يجب أن يكون في App Start).

حاولت إنشاء DLL C ++ مع تعليقات 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.exe")؟ هل أحتاج إلى إنشاء DLL مخصص لـ EasyHook؟ (في هذه الحالة ، ما هو المحتوى الذي أحتاج إلى تحديده في الداخل؟)

لقد وجدت ذلك قليلاً ... "مجمع" لخطاف HelloWorld ، هههههههههههههههههههههههههههههه

شكرا مقدما ؛)

هل كانت مفيدة؟

المحلول

في النهاية ، باستخدام كتاب "Gray Hack Python" Taugh Me كيفية صنع كل هذا بخطوط أقل ، ونفس الشيء الذي أردته.

لا exe بعد ولكن ... هذا كل شيء.

باستخدام PYDBG + الخطافات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top