Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.04.2014, 10:07
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
Стрелка Подмена функций

Доброго времени суток форумчане. Пытаюсь реализовать программу которая будет ловить пакеты сообщений передаваемых от программы на моём компе к серверу. программа явно многопоточная, перехват реализовываю следующим образом:

Код:
library mydll;

uses
  Windows,psapi,winsock,sysutils;

type
 OldCode = packed record
  One: dword;
  two: word;
 end;

far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;

 TSocket=integer;
var
 hhPort:HWND;

 Jmp_Recv,Jmp_Send: far_jmp;
 Old_Recv,Old_Send: OldCode;
 Recv_Adr,Send_Adr: Pointer;
 FHandle:THandle;

 SendText:PChar=#13#10'Send ';
 RecvText:PChar=#13#10'Recv ';

Procedure Unhook();
var
 Bytes: dword;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Old_Recv, SizeOf(OldCode), Bytes);
  WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Old_Send, SizeOf(OldCode), Bytes);
end;

var
  sendok:boolean=false;
  recvok:boolean=false;

function New_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
  Written:dword;
  i:integer;
  buf2:string;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr,@Old_Recv, SizeOf(OldCode), Written);
  Result:=Recv(s,Buf,len,flags);
  {if(not recvok)then
  begin
    recvok:=true;
    ShowMessage('Recv');
  end;}
  if(len<30)then
  begin
    WriteFile(FHandle,RecvText^,7,Written,nil);
    WriteFile(FHandle,buf,Cardinal(len),Written,nil);
 { end
  else
  begin  
    buf2:=RecvText;
    for i:=0 to len-1 do
      buf2:=buf2+IntToStr(byte(Pointer(cardinal(@buf)+i)^))+' ';
    WriteFile(FHandle,buf2[1],length(buf2),Written,nil);//}
  end;
  WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr,@Jmp_Recv, SizeOf(far_jmp), Written);
  //
end;

function New_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
  Written:dword;
  i:integer;
  buf2:string;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr,@Old_Send, SizeOf(OldCode), Written);
  {if(not sendok)then
  begin
    sendok:=true;
    ShowMessage('Send');
  end;}
  if(len<30)then
  begin
    WriteFile(FHandle,SendText^,7,Written,nil);
    WriteFile(FHandle,buf,Cardinal(len),Written,nil);
  {end
  else
  begin
    buf2:=SendText;
    for i:=0 to len-1 do
      buf2:=buf2+IntToStr(byte(Pointer(cardinal(@buf)+i)^))+' ';
    WriteFile(FHandle,buf2[1],length(buf2),Written,nil);//}
  end;
  Result:=Send(s,Buf,len,flags);
  WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr,@Jmp_Send, SizeOf(far_jmp), Written);
end;

//----------------------------------------------------------------------
//*******************************************************************************
Procedure SetHook();
var
 hkernel32: dword;
 Bytes: dword;
 s:string;
begin
//  if(LowerCase(ExtractFileName(ParamStr(0)))=AppName)then
  begin
    hkernel32 := GetModuleHandle('wsock32.dll');
    Recv_Adr:=GetProcAddress(hkernel32, 'recv');
    Send_Adr:=GetProcAddress(hkernel32, 'send');
    ReadProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Old_Recv, SizeOf(OldCode), Bytes);
    ReadProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Old_Send, SizeOf(OldCode), Bytes);
    with Jmp_Recv do
    begin
      PuhsOp  := $68;
      PushArg := @New_Recv ;
      RetOp   := $C3;
    end;
    with Jmp_Send do
    begin
      PuhsOp  := $68;
      PushArg := @New_Send ;
      RetOp   := $C3;
    end;
    WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Jmp_Recv, SizeOf(far_jmp), Bytes);
    WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Jmp_Send, SizeOf(far_jmp), Bytes);
    s:=ParamStr(0);
    FHandle:=CreateFile(PChar(s+'.log'),GENERIC_WRITE,0,nil,OPEN_ALWAYS,0,0);
    //ShowMessage(s);
  end;
end;
//*******************************************************************************

//*******************************************************************************
Function MessageProc(code : integer; wParam : word;
                    lParam : longint) : longint; stdcall;
begin
 CallNextHookEx(0, Code, wParam, lparam);
 Result := 0;
end;

var
  HookH:HHOOK=0;
  hMutex: dword=0;
  dwThreadId:Cardinal=0;

//*******************************************************************************
Procedure SetGlobalHookProc();
begin
 HookH:=SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, dwThreadId);
 Sleep(INFINITE);
end;
//*******************************************************************************

Procedure SetGlobalHook(TID:cardinal);
var
 TrId: dword;
begin
 dwThreadId:=TID;//ГЛАВНЫЙ ПОТОК НУЖНОЙ ПРОГРАММЫ
 hMutex := CreateMutex(nil, false, {'AdvareHook'}'java');
 if GetLastError = 0 then
  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId)
 else
  CloseHandle(hMutex);
end;

//*******************************************************************************
procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: SetHook();
    DLL_PROCESS_DETACH: UnHook();
  end;
end;

procedure RemoveGlobalHook; stdcall;
begin
  if HookH<>0 then
  begin
    UnHookWindowsHookEx(HookH);
    CloseHandle(hMutex);
    HookH:=0;
  end;
end;

exports
  SetGlobalHook,RemoveGlobalHook;
//*******************************************************************************
begin
 DllProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

библиотека запускается вызовом функции SetGlobalHook, в аргументах которой передаю главный поток нужного приложения

файл логов создается и что то даже записывается, но большая часть пакетов пропускается, грешу на многопоточность, в чём моя ошибка, не посылайте на литературу, не новичёк, а реально подскажите, заранее благодарен)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter