EasyHook RECVは、すべてのパケットを「フック」しません

StackOverflow https://stackoverflow.com/questions/4589328

  •  14-10-2019
  •  | 
  •  

質問

RECV機能をフックするセミワーキングイージーフックの例を書くことができました。フォームを書き、ウェブブラウザーコンポーネントを追加し、アプリケーションを開始しました。問題は、HTTPパケットを取得することですが、ソケットがある場合、RECVは「フック」を停止するようです。問題は、外部アプリケーションで、Spystudioを使用すると、recvを接続できることです。それで、私は何が欠けていますか?

using System;
using System.Collections.Generic;
using System.Data;
using System.Runtime.InteropServices;
using System.Threading;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Ipc;
using EasyHook;

namespace flashing
{
    public partial class Form1 : Form,EasyHook.IEntryPoint
    {
        public LocalHook CreateRecvHook;

        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("Ws2_32.dll")]
        static extern int recv(
                    IntPtr socketHandle,
                    IntPtr buf,
                    int count,
                    int socketFlags
            );


        [UnmanagedFunctionPointer(CallingConvention.StdCall,
            CharSet = CharSet.Unicode,
            SetLastError = true)]


        delegate int Drecv(
                    IntPtr socketHandle,
                    IntPtr buf,
                    int count,
                    int socketFlags
            );


        static int recv_Hooked(
                    IntPtr socketHandle,
                    IntPtr buf,
                    int count,
                    int socketFlags)
        {
            int bytesCount = recv(socketHandle, buf, count, socketFlags);
            if (bytesCount > 0)
            {
                byte[] newBuffer = new byte[bytesCount];
                Marshal.Copy(buf, newBuffer, 0, bytesCount);
                string s = System.Text.ASCIIEncoding.ASCII.GetString(newBuffer);
                TextWriter tw = new StreamWriter("log.txt");
                tw.Write(s);
                tw.Close();
                Debug.WriteLine("Hooked:>" + s);
            }
            return bytesCount;
        }


        private void bottonHook_Click(object sender, EventArgs e)
        {
            try
            {
                CreateRecvHook = LocalHook.Create(
                    LocalHook.GetProcAddress("Ws2_32.dll", "recv"),
                    new Drecv(recv_Hooked),
                    this);

                CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
            }
            catch (Exception ExtInfo)
            {
                Debug.WriteLine("Error creating the Hook");
                return;
            }
            RemoteHooking.WakeUpProcess();
        }

        private void buttonLoader_Click(object sender, EventArgs e)
        {
            axShockwaveFlash1.LoadMovie(0, "test.swf");
        }
    }    
}

編集 :私はRECVについて疑いの余地がありません、ここでそれはApimonitorが私に言ったことです:

# TID Module API Return Error
5 2696 Flash10l.ocx recv ( 1992, 0x07080000, 65536, 0 ) 1

だから、誰かが私を助けることができますか?

役に立ちましたか?

解決

問題が解決しました。トラブルを引き起こしたラインはそうでした

CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });

私はそれを変更しました

CreateRecvHook.ThreadACL.SetInclusiveACL(new Int32[] { 0 });

そして今、すべてがうまく機能します。みんなありがとう:)

他のヒント

ソケットで使用されるさまざまな機能があります。たぶん、プラグインは名前付き関数を使用していません recv. 。私の頭の上から私は考えることができます recvfrom, recvmsg, WSARecv, WSARecvFrom, WSARecvMsg, ReadFile, ReadFileEx.

次に、プラグインは、EGの間にデータが保存されない場合、重複するI/O(おそらく完了ルーチンまたは完了ポートによって複雑になる可能性があります)でリクエストを実行できます。 ReadFile 関数呼び出しが、後ではしばらくしてください。それらを引っ掛けることはかなり挑戦的です。

C#でSharppcsを使用してHTTPをダンプするツールを書きました。 Winpcap-driverを使用します。より信頼性の高い日焼けアピホークだと思います。

httpsaver(ソース付き)
Sharppcap
winpcap

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top