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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 22:53   #11
Reimscher
Пользователь
 
Регистрация: 01.02.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
У меня получилось получить хенделы сокетов определенной программы, для примера я взял Скайп и Оперу и внедрил в них эту DLL. Этот код показывает в диалоговом окне все сокеты программы в которую внедрили эту DLL.
Внедрять DLL умеете в чужую программу?
Хах, недавно закончил написание идентичного кода!! И уже удалось таки "от имени" игры отправить сообщения, сервер с радостью скушал и ответил. Сейчас в процессе код для управления dll'кой, т.к. send работает только внутри неё. А вот от кода инъекции я не отказался бы, т.к. в этом слабоват. Код, конечно, у меня есть, но там много лишнего, хотелось бы от этого избавиться.

UPD: Кстати! Я убрал exit из цикла, и заметил, что на каждый socket по 3 handle. Но для работы требуется всегда первый. Почему их три?

UPD2: Выяснил, что код внедрения у меня вполне хороший. Но если у вас есть готовый пример — буду рад взглянуть.

Последний раз редактировалось Reimscher; 04.08.2015 в 23:06.
Reimscher вне форума Ответить с цитированием
Старый 04.08.2015, 23:24   #12
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Код по внедрению DLL в нужную программу

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TlHelp32;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Функция внедрения DLL в процесс
Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then
  Exit;

  fillChar(Inject, SizeOf(Inject), 0);
  Code := dword(Memory);

  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);

  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);

  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then
  Exit;
  CloseHandle(hThread);
  Result := True;
end;

//Функция получения ID программы
Function GetProcessPID(ExeFileName: String): Cardinal;
Var
ContinueLoop: Bool;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
Begin
Result:=0;
FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.DwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
While Integer(ContinueLoop) <> 0 Do
Begin
If ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
AnsiUpperCase(ExeFileName)) Or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
AnsiUpperCase(ExeFileName))) Then
Result:=FProcessEntry32.Th32ProcessID;
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
End;
CloseHandle(FSnapshotHandle);
End;

//Функция получения из ID программы его хендел
Function GetProcessHandle(ProcessId: Dword): THandle;
Begin
Result:=OpenProcess(Process_All_Access, True, ProcessId);
End;


//Использование
procedure TForm1.Button1Click(Sender: TObject);
var
H: Dword;
begin
H:= GetProcessHandle(GetProcessPID('skype.exe'));
if (H <> 0) and InjectDll(H, '\Project2.dll') then
begin
Showmessage('Успешно');
CloseHandle(H);
end;
end;

Последний раз редактировалось Aliens_wolfs; 04.08.2015 в 23:29.
Aliens_wolfs вне форума Ответить с цитированием
Старый 05.08.2015, 02:34   #13
Reimscher
Пользователь
 
Регистрация: 01.02.2011
Сообщений: 33
По умолчанию

Всё понятно, кроме одной строчки:
Код:
inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
И использую такой код:
Код:
procedure InjectDll(PID: DWORD; DLL: PAnsiChar);
var
  BytesWritten: SIZE_T;
  hProcess, hThread, TID: Cardinal;
  Parameters: Pointer;
  pThreadStartRoutine: Pointer;
begin
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  Parameters := VirtualAllocEx(hProcess, nil, Length(DLL) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
  WriteProcessMemory(hProcess, Parameters, Pointer(DLL), Length(DLL) + 1, BytesWritten);
  pThreadStartRoutine := GetProcAddress(GetModuleHandle('KERNEL32.dll'), 'LoadLibraryA');
  hThread := CreateRemoteThread(hProcess, nil, 0, pThreadStartRoutine, Parameters, 0, TID);
  CloseHandle(hProcess);
end;
В чём разница между ними? Насколько понял, в вашем в программу пишутся ассемблерные инструкции?

Последний раз редактировалось Reimscher; 05.08.2015 в 02:37.
Reimscher вне форума Ответить с цитированием
Старый 05.08.2015, 17:14   #14
Reimscher
Пользователь
 
Регистрация: 01.02.2011
Сообщений: 33
По умолчанию

Задача решена.
Для тех, кому интересно как, опишу свои действия:
1. Весь трафик мониторю через модифицированный код от magenta (программа sockmon)
2. Делаю инъекцию dll в клиент, создавая там socket, через который управляю своей dll удалённо (из своего приложения)
3. Моя dll выявляет все socket'ы внутри клиента, и отправляет пакеты через них по моим командам
Сперва хотел выложить все исходники, но потом решил, что они слишком ценны/опасны, что бы вот так их тут выкладывать (кому очень надо — сам всё сделает, как это сделал я, а кто не сможет — тому оно значит и не надо). Кто-нибудь наверняка сможет придумать как их использовать в личных целях, для получения выгоды, поэтому выкладывать не стану.

P.S. Aliens_wolfs'у огромное спасибо за помощь в решении задачи, чем позволил сэкономить порядка двух суток.
Reimscher вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как разрешить запуск второй копии чужого приложения s1s1s1 Общие вопросы Delphi 4 02.11.2011 01:47
как запретить сворачивание чужого приложения 856100 Общие вопросы Delphi 11 23.07.2010 01:36
Нужно найти или написать прогу, на подобие WPE Pro ZBEP Фриланс 4 22.03.2010 17:03
Как скопировать текст чужого приложения? Nikolay-niw32 Общие вопросы Delphi 17 12.03.2009 21:28
Как определить путь чужого приложения? VVM Win Api 3 02.12.2008 18:22