EasyHook RECVは、すべてのパケットを「フック」しません
質問
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を使用します。より信頼性の高い日焼けアピホークだと思います。
所属していません StackOverflow