recv 기능을 후킹하는 준 작업 EasyHook 예제를 작성할 수있었습니다. 양식을 작성하고 WebBrowser 구성 요소를 추가 한 다음 응용 프로그램을 시작했습니다. 문제는, 나는 HTTP 패킷을 얻지 만 소켓이 있다면 recv가 "hooking"을 멈추는 것 같다. 문제는 Spystudio라는 외부 응용 프로그램을 통해 recv에 연결할 수 있다는 것입니다. 그래서 나는 무엇을 놓치고 있습니까?EasyHook 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");
}
}
}
편집 :
# TID Module API Return Error
5 2696 Flash10l.ocx recv (1992, 0x07080000, 65536, 0) 1
그래서, 누군가가 나를 도울 수
: 여기가 apimonitor가 나에게 말한다 것입니다, RECV에 대해 의심을했습니다?
docs : * "SetExclusiveACL()은 독점 ACL을 설정합니다. 즉, InACL을 통해 열거 된 모든 스레드는 다른 모든 스레드는 차단하지 않습니다. 또한 : * "스레드 ID ** ** 제로 ** 자동으로 현재 스레드 ID로 바뀝니다"*. 그래서''SetExclusiveACL (new Int32 [] {0});''실제로 스레드가 훅에 대한 업데이트를받지 못하도록합니다. ''SetInclusiveACL()''메소드는 정확히 반대입니다 : 쓰레드가 훅을 가로 챌 수있는 유일한 객체가되도록합니다. 그래서 이것이 효과가있었습니다. 빈 배열을''SetExclusiveACL()''에 건네도 작동합니다. –
그건 그렇고, EasyHook docs 어디에도 언급되어 있지 않습니다 : * ACL *은 [* Access Control List *] (http://en.wikipedia.org/wiki/Access_control_list)를 나타냅니다. –