Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2014, 10:12   #1
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
Стрелка Подмена функций

Доброго времени суток форумчане. Пытаюсь реализовать программу которая будет ловить пакеты сообщений передаваемых от программы на моём компе к серверу. программа явно многопоточная, перехват реализовываю следующим образом:
Код:
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(len<30)then
  begin
    WriteFile(FHandle,RecvText^,7,Written,nil);
    WriteFile(FHandle,buf,Cardinal(len),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(len<30)then
  begin
    WriteFile(FHandle,SendText^,7,Written,nil);
    WriteFile(FHandle,buf,Cardinal(len),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
    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);
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, в аргументах которой передаю главный поток нужного приложения

файл логов создается и что то даже записывается, но большая часть пакетов пропускается, грешу на многопоточность, в чём моя ошибка, не посылайте на литературу, не новичёк, а реально подскажите, заранее благодарен)
Biohazard вне форума Ответить с цитированием
Старый 06.04.2014, 11:46   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Не делайте под Маякоского, делайте под себя.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.04.2014, 02:23   #3
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
litrovith вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подмена IP Maincore Win Api 3 11.02.2013 14:09
Delphi: аппроксимация функций методом базиса из финитных функций Denna Помощь студентам 1 12.03.2012 19:23
Построение графиков функций С++ (методы аппроксимации функций) amdbodia Общие вопросы C/C++ 0 24.05.2009 15:28
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
Подмена IP ? KAKTYC PHP 2 28.10.2008 00:14