2011-01-03 5 views
4

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에 대해 의심을했습니다?

답변

4

과제를 해결한다. 문제를 만들어 줄 내가

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

로 변경하고 지금은 모든 것이 잘 작동

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

했다. 감사합니다 모두 :)

+3

docs : * "SetExclusiveACL()은 독점 ACL을 설정합니다. 즉, InACL을 통해 열거 된 모든 스레드는 다른 모든 스레드는 차단하지 않습니다. 또한 : * "스레드 ID ** ** 제로 ** 자동으로 현재 스레드 ID로 바뀝니다"*. 그래서''SetExclusiveACL (new Int32 [] {0});''실제로 스레드가 훅에 대한 업데이트를받지 못하도록합니다. ''SetInclusiveACL()''메소드는 정확히 반대입니다 : 쓰레드가 훅을 가로 챌 수있는 유일한 객체가되도록합니다. 그래서 이것이 효과가있었습니다. 빈 배열을''SetExclusiveACL()''에 건네도 작동합니다. –

+1

그건 그렇고, EasyHook docs 어디에도 언급되어 있지 않습니다 : * ACL *은 [* Access Control List *] (http://en.wikipedia.org/wiki/Access_control_list)를 나타냅니다. –

2

소켓과 함께 사용되는 많은 다른 기능이 있습니다. 플러그인이 recv이라는 함수를 사용하고 있지 않을 수도 있습니다. 내 머리 꼭대기에서 나는 recvfrom, recvmsg, WSARecv, WSARecvFrom, WSARecvMsg, ReadFile, ReadFileEx을 생각할 수 있습니다.

그런 다음 플러그인은 I/O가 중복 된 요청을 수행 할 수 있습니다 (완료 루틴 또는 완료 포트로 복잡 할 수 있음).이 경우 데이터는 예를 들어. ReadFile 함수 호출하지만 나중에 시간이. 그것들을 구부리는 것은 훨씬 더 어려울 것입니다.

+0

나는 생각했다. 그렇다면 왜 spystudio와 동일한 기능을 후크하는 것이 그 패킷에 대한 액세스를 얻고, 단지 recv를 걸리는가? – kaharas

+0

SpyStudio가'recv' 만 연결하는 어딘가에 문서화되어 있습니까? 사용자 친화적 인 방법으로 전체 고리 그룹에 하나의 이름을 붙일 수 있습니다. –

+0

이것은 가능할 수 있지만 recv를 제외하고 언급 한 모든 기능을 연결하면 어떤 패킷도 수신되지 않습니다. 내가 recv에 걸리면 갑자기 패킷을보기 시작합니다. 그래서, 일부 기능을 테스트하지 못했거나 패킷이 실제로 수신되었습니다. 진짜 문제는 LocalHook가 플러그인 recv 호출을 잡기에 충분하거나 글로벌 recv 훅을 설정해야한다는 것입니다. – kaharas

2

저는 C#에서 sharppcs를 사용하여 http를 덤프하는 도구를 작성했습니다. winpcap 드라이버를 사용합니다. 나는 그것이 더 신뢰할 수있는 tan apihooks라고 생각한다.

HTTPSaver (with sources)

SharpPcap
Winpcap

+0

필자가 작성하고있는 프로그램이 재배포 가능해야하며 모든 네트워크 카드가 promiscous 모드 (예 : 광산)로 설정 될 수는 없으므로 패킷 스니핑을 사용할 수 없습니다. 나는 API 후킹을 사용해야한다 :) – kaharas

+0

@kaharas, 무차별 모드는 당신의 컴퓨터와 무관 한 패킷을 캡쳐하기 위해서만 필요하다. 나는 모든 네트워크 카드가 그 카드가 보내거나받은 카드를 지원한다고 믿는다. – sisve

+0

아마 바보 같아서 ...하지만 Wireshark를 작동시키는 방법을 찾을 수 없었습니다. 그는 카드에 promiscous mode가 필요하다고 계속 말했습니다.java winpcap wrapper를 사용하여 "로컬 스니퍼"를 작성하려고 할 때도 같은 일이 발생했습니다. – kaharas