PDA

View Full Version : Hook winsock, bắt Link khi duyệt web như thế nào?



AlexF
05-06-2009, 07:49 AM
Mình muốn lấy Link mà Người dùng đang chuẩn bị vào để chặn vài trang web,vậy để bắt được link khi mà ta đang load vào web thì ta phải hook hàm nào của winsock vậy ???

kirimaru80
15-06-2009, 04:28 PM
Chặn hàm gethostbyname


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

Hàm này dùng để resolve địa chỉ 1 trang web thành địa chỉ IP.
Nếu name có chứa các từ khóa cần chặn thì trả về NULL :)

AlexF
15-06-2009, 04:43 PM
thank bạn nhé,để mình thử Hook nó xem :D,thêm nữa cho mình hỏi,với các ứng dụng kiểu như FireFox hay opera chúng được làm bởi các thư viện cross-platform không rõ có sử dụng được cách này không

kirimaru80
15-06-2009, 05:24 PM
Bạn cứ thử xem, ứng dụng cross-platform bao giờ cũng gồm 2 phần: platform independant (sử dụng chung cho tất cả các platform) & platform dependant (phải viết riêng cho từng platform). Nên mình nghĩ Opera hay Firefox đều phải sử dụng thư viện winsock :). Cách chặn trang web này cũng được một số virus sử dụng để ngăn truy cập vào các trang web anti-virus

Nếu chưa được nữa thì hook luôn hàm getaddrinfo :D

AlexF
15-06-2009, 05:43 PM
ồ OK,kết quả rất mỹ mãn,mình vừa thử hook
struct hostent* FAR gethostbyname(
__in const char *name
);thì thấy là Firefox cũng dùng được,còn opera thì chưa có để thử ^^!,khi nào thử down về chạy thử xem


Cách chặn trang web này cũng được một số virus sử dụng để ngăn truy cập vào các trang web anti-viruscái này chắc virus nó chỉ cần đọc Title của cửa sổ,cửa sổ nào có dấu hiệu virus thì nó SendMessage quit luôn

lạ thật,thử hook hàm
struct hostent* FAR gethostbyname(
__in const char *name
); thì không bắt được link của IE

meoconlongvang
20-06-2009, 12:30 AM
Hàm này có 2 phiên bản A và W, bạn hook phiên bản nào ?

sovietw0rm
20-06-2009, 03:27 AM
http://www.nektra.com/products/deviare/index.php
muốn hook hàm nào vác cái này ra kiểm tra trước xem có hiệu quả không rồi thì hook :D

AlexF
20-06-2009, 09:06 AM
Hàm này có 2 phiên bản A và W, bạn hook phiên bản nào ?

http://upanh.com/uploads/20-June-2009/igyqueww9kzsjc3tzbn2.jpg

meoconlongvang
20-06-2009, 01:35 PM
Ờ nhỉ, mình nhầm. Đề mình ngâm cứu rồi sẽ trả lời cho bạn.

kirimaru80
20-06-2009, 07:49 PM
Thế bạn đã thử hook thêm hàm getaddrinfo chưa? Nếu chưa thì thử đi nhé :)

gianghoplus
21-06-2009, 03:21 PM
Sẵn tiện cho mình hỏi. Có bạn nào hook được các gói dữ liệu trong WinSock (MSWINSCK.OCX) không (Xác định dữ liệu bên trong các gói và replace). Bên madshi.net có bàn về vấn đề này nhưng code nó viết = Dephi đọc ko hiểu gì cả

sovietw0rm
21-06-2009, 04:01 PM
mấy hôm trước có thử hook hàm send() để bắt dữ liệu. Dữ liệu của hàm send() và recv() là kiểu char* mà bạn có thể chỉnh sửa được chứ
int send(Socket s, char* Buf, int len,int flag) nếu chỉ replace bạn chỉ cần sửa cái Buf nếu mà chỉnh sửa mà kích thước gói tin thay đổi bạn phải sửa cái len nữa, với hàm recv cũng tương tự vậy. Đây là 2 hàm để nhận và gửi dữ liệu với giao thức tcp.

trần trân
21-06-2009, 04:26 PM
mấy hôm trước có thử hook hàm send() để bắt dữ liệu. Dữ liệu của hàm send() và recv() là kiểu char* mà bạn có thể chỉnh sửa được chứ
int send(Socket s, char* Buf, int len,int flag) nếu chỉ replace bạn chỉ cần sửa cái Buf nếu mà chỉnh sửa mà kích thước gói tin thay đổi bạn phải sửa cái len nữa, với hàm recv cũng tương tự vậy. Đây là 2 hàm để nhận và gửi dữ liệu với giao thức tcp.

dữ liệu của nó còn được mã hóa cơ mà bạn,muốn sửa trước hết phải decode nó đã

sovietw0rm
21-06-2009, 04:41 PM
nếu nó dùng ssl thì khác còn nếu bình thường có mã hóa gì đâu?

gianghoplus
21-06-2009, 10:02 PM
có ví dụ nè. Nhưng viết bằng Delphi :(



  Delphi Winsock Hooking Example by Aphex
  {
   Delphi Winsock Hooking Example by Aphex
   http://www.iamaphex.cjb.net
   unremote@knology.net
   This example shows you how to hook winsock functions
   of a target process and control incomming and outgoing
   data. It is based on send and recv but it will work the
   same way applied to sendto and recvfrom.
   The output file is a CPL (Control Panel Extension) which
   is simply a special DLL that is loaded when it is double
   clicked. This saves us from having to write a seperate
   loader for the hook library.
   The example shows how to hook the needed functions and
   perform some simple manipulation of the data, using two
   different methods of accessing the data. The second, which
   uses pointers, is more flexible but also more complex.
  }
  library Project1;
  uses
   Windows,
   Winsock,
   SysUtils,
   madCodeHook;
  {$R *.RES}
  {$E CPL}
  var
   sendNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
   recvNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
   DataSocket: TSocket;
  const
   szTargetExe: string = 'GAME.EXE';
  function ConvertDataToAscii(Buffer: pointer; Length: Word): string;
  var
   Iterator: integer;
   AsciiBuffer: string;
  begin
   AsciiBuffer := '';
   for Iterator := 0 to Length - 1 do
   begin
   if char(pointer(integer(Buffer) + Iterator)^) in [#32..#127] then
   AsciiBuffer := AsciiBuffer + ' ' + char(pointer(integer(Buffer) + Iterator)^) + ' '
   else
   AsciiBuffer := AsciiBuffer + ' . ';
   end;
   Result := AsciiBuffer;
  end;
  function ConvertDataToHex(Buffer: pointer; Length: Word): string;
  var
   Iterator: integer;
   HexBuffer: string;
  begin
   HexBuffer := '';
   for Iterator := 0 to Length - 1 do
   begin
   HexBuffer := HexBuffer + IntToHex(Ord(char(pointer(integer(Buffer) + Iterator)^)), 2) + ' ';
   end;
   Result := HexBuffer;
  end;
  function recvHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  var
   AsciiBuffer: string;
   HexBuffer: string;
   DataBuffer: pchar;
  begin
   //call the real winsock function
   Result := recvNextHook(s, Buf, len, flags);
   //allocate memory for our copy of the data
   GetMem(DataBuffer, Result);
   try
   //get our copy of the data
   CopyMemory(DataBuffer, @Buf, Result);
   //using the data as a byte array
   DataBuffer[0] := chr(10); //changing first byte
   DataBuffer[1] := chr(20); //changing second byte
   DataBuffer[2] := chr(30); //changing thrid byte
   //using the data as a pointer to other data sizes
   word(pointer(DataBuffer)^) := 10; //changing first 2 bytes
   dword(pointer(integer(DataBuffer) + 2)^) := 20; //changing next 4 bytes
   word(pointer(integer(DataBuffer) + 6)^) := 30; //changing next 2 bytes
   //overwrite the original data with our new data
   CopyMemory(@Buf, DataBuffer, Result);
   finally
   FreeMem(DataBuffer);
   end;
   //convert data to readable ascii suitable for logging
   AsciiBuffer := ConvertDataToAscii(@Buf, Result);
   //convert data to readable hex suitable for logging
   HexBuffer := ConvertDataToHex(@Buf, Result);
  end;
  function sendHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  var
   AsciiBuffer: string;
   HexBuffer: string;
   DataBuffer: pchar;
  begin
   Result := 0;
   //save the socket so we can send data too
   DataSocket := s;
   //allocate memory for our copy of the data
   GetMem(DataBuffer, Result);
   try
   //get our copy of the data
   CopyMemory(DataBuffer, @Buf, Result);
   //using the data as a byte array
   DataBuffer[0] := chr(10); //changing first byte
   DataBuffer[1] := chr(20); //changing second byte
   DataBuffer[2] := chr(30); //changing thrid byte
   //using the data as a pointer to other data sizes
   word(pointer(DataBuffer)^) := 10; //changing first 2 bytes
   dword(pointer(integer(DataBuffer) + 2)^) := 20; //changing next 4 bytes
   word(pointer(integer(DataBuffer) + 6)^) := 30; //changing next 2 bytes
   //overwrite the original data with our new data
   CopyMemory(@Buf, DataBuffer, Result);
   finally
   FreeMem(DataBuffer);
   end;
   //convert data to readable ascii suitable for logging
   AsciiBuffer := ConvertDataToAscii(@Buf, Result);
   //convert data to readable hex suitable for logging
   HexBuffer := ConvertDataToHex(@Buf, Result);
   //call the real winsock function
   Result := sendNextHook(s, Buf, len, flags);
  end;
  procedure EntryPoint(Reason: dword); stdcall;
  var
   lpFileName: array [0..MAX_PATH - 1] of char;
   StartInfo: TStartupInfo;
   ProcInfo: TProcessInformation;
  begin
   if Reason = DLL_PROCESS_ATTACH then
   begin
   //check if we are injected inside the target
   if lstrcmpi(pchar(Copy(ParamStr(0), Length(ParamStr(0)) - Length(szTargetExe) + 1, Length(szTargetExe))), pchar(szTargetExe)) = 0 then
   begin
   //if we are then we hook the needed functions
   DataSocket := 0;
   HookCode(@send, @sendHookProc, @sendNextHook);
   HookCode(@recv, @recvHookProc, @recvNextHook);
   end
   else
   begin
   //if not then load the target and inject ourself
   GetModuleFileName(hInstance, @lpFileName, MAX_PATH);
   ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
   ZeroMemory(@ProcInfo, SizeOf(TProcessInformation));
   StartInfo.dwFlags := STARTF_USESHOWWINDOW;
   StartInfo.wShowWindow := SW_SHOW;
   CreateProcess(PChar(ExtractFilePath(lpFileName) + szTargetExe), nil, nil, nil, False, 0, nil, nil, StartInfo, ProcInfo);
   Sleep(3000);
   InjectLibrary(ProcInfo.hProcess, lpFileName);
   end;
   end;
  end;
  begin
   DLLProc := @EntryPoint;
   EntryPoint(DLL_PROCESS_ATTACH);
  end.

RadiRadic
11-08-2009, 12:11 AM
như conficker nó chặn 3 hàm sau
DnsQuery_A--> chặn vào các trang web tên miền virus,ms...
DnsQuery_UTF8--> chặn vào các trang web tên miền virus,ms...
DnsQuery_W--> chặn vào các trang web tên miền virus,ms...

sauitbk
24-05-2012, 04:55 PM
Anh AlexF có thể share code C++ được không ak.
Em mới bắt đầu nghiên cứu nên không dành lắm

totden
22-06-2012, 04:16 AM
Chuẩn luôn o![]!oo![]!o, có đợt mình thử hook mấy hàm kia thì ko ngon, nhưng sau hook mấy hàm DnsQuery thì được hết. gethostbyname cũng đi qua bạn này.


như conficker nó chặn 3 hàm sau
DnsQuery_A--> chặn vào các trang web tên miền virus,ms...
DnsQuery_UTF8--> chặn vào các trang web tên miền virus,ms...
DnsQuery_W--> chặn vào các trang web tên miền virus,ms...