HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1661  
Старый 30.05.2008, 20:52
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

как можно защитить программу от внедрения библиотеки методом CreateRemoteThread? на Delphi
 
Ответить с цитированием

  #1662  
Старый 30.05.2008, 21:03
cash$$$
Banned
Регистрация: 06.01.2008
Сообщений: 413
Провел на форуме:
1301036

Репутация: 1334
Отправить сообщение для cash$$$ с помощью ICQ
По умолчанию

Для загрузки библиотеки можно использовать функцию LdrLoadDll из ntdll.dll.
Код:
function LdrLoadDll(szcwPath: PWideChar;
                    pdwLdrErr: dword;
                    pUniModuleName: PUnicodeString;
                    pResultInstance: PDWORD): NTSTATUS;
                       stdcall; external 'ntdll.dll';
Нас интересует параметр pUniModuleName представляющий из себя указатель на строку типа UnicodeString в которой передается имя загружаемой DLL. По указателю pResultInstance будет сохранен адрес MZ заголовка загруженной DLL (параметр hInstance).
Следующий код загружает DLL аналогично функции kernel32 LoadLibraryW:
Код:
Function MyLoadLibrary(lpLibFileName: PWideChar): HMODULE;
var
 uName: TUnicodeString;
begin
 RtlInitUnicodeString(@uName, lpLibFileName);
 if (LdrLoadDll(nil, 0, @uName, @Result) > 0) then Result := 0;
 RtlFreeUnicodeString(@uName);
end;
Для получения адреса функции cледует использовать LdrGetProcedureAddress.
Код:
function LdrGetProcedureAddress(hModule: dword;
                                dOrdinal: DWORD;
                                 psName: PAnsiString;
                                 ppProcedure: ppointer): NTStatus;
                                  stdcall; external 'ntdll.dll';
Если необходимо обеспечить максимальную скрытность перехвата, то вообще лучше использовать во внедряемом коде только функции Native API.
Процедура копирования участка памяти в процесс:
Код:
function InjectMemory(Process: dword; Memory: pointer; Size: dword): pointer;
var
  BytesWritten: dword;
begin
  Result := VirtualAllocEx(Process, nil, Size, MEM_COMMIT or MEM_RESERVE,
                           PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(Process, Result, Memory, Size, BytesWritten);
end;
Эта процедура предельно проста, она принимает хэндл открытого процесса, указатель на данные в текущем процессе и размер данных, а возвращает указатель на данные в целевом процессе.

Внедрение процедуры в целевой процесс:
Код:
program InjectCode;

uses
  Windows,
  advApiHook;

type
  TRemoteInfo = record
    LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
    GetProcAddress: function(hModule: HMODULE;
                             lpProcName: LPCSTR): FARPROC; stdcall;
    Kernel32    : array[0..16] of Char;
    User32      : array[0..16] of Char;
    MessageBoxA : array[0..16] of Char;
    nExitThread : array[0..16] of Char;
    Text        : array[0..16] of Char;
    Title       : array[0..16] of Char;
  end;

{ Процедура внедряемая в процесс }
procedure RemoteThread(RemoteInfo: pointer); stdcall;
var
 MessageBox: function(hWnd: HWND; lpText,
                      lpCaption: PChar; uType: UINT): Integer; stdcall;
 ExitThread: procedure(uExitCode: UINT); stdcall;
begin
  with TRemoteInfo(RemoteInfo^) do
  begin
    @MessageBox := GetProcAddress(LoadLibrary(User32), MessageBoxA);
    @ExitThread := GetProcAddress(LoadLibrary(Kernel32), nExitThread);
    MessageBox(0, Text, Title, 0);
    ExitThread(0);
  end;
end;
procedure RemoteThreadEnd; begin end; //метка конца кода 

var
  RemoteInfo: TRemoteInfo;
  pInfo, CodeAdr: pointer;
  TID: dword;
  Process: dword;
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;

begin
  //Запускаем процесс
  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateProcess(nil, 'notepad.exe', nil, nil, False, 0,
                nil, nil, StartInfo, ProcInfo);
  Process := ProcInfo.hProcess;
  //Заполняем структуру передаваемую внедряемому коду
  lstrcpy(RemoteInfo.User32, 'user32.dll');
  lstrcpy(RemoteInfo.Kernel32, 'kernel32.dll');
  lstrcpy(RemoteInfo.MessageBoxA, 'MessageBoxA');
  lstrcpy(RemoteInfo.nExitThread, 'ExitThread');
  lstrcpy(RemoteInfo.Text, 'Hello World!');
  lstrcpy(RemoteInfo.Title, 'Injected MessageBox');
  //получаем адреса используемых API
  @RemoteInfo.LoadLibrary    := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                               'LoadLibraryA');
  @RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                               'GetProcAddress');
  //копируем в процесс структуру с данными
  pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo));
  //копируем в процесс внедряемый код
  CodeAdr := InjectMemory(Process, @RemoteThread,
                          dword(@RemoteThreadEnd) - dword(@RemoteThread));
  //запускаем внедренный код
  CreateRemoteThread(Process, nil, 0, CodeAdr, pInfo, 0, TID);
end.
Перед внедрением кода процедуры, необходимо скопировать в память целевого процесса структуру с данными используемыми внедряемым кодом. В этой структуре необходимо передать адреса функций LoadLibary и GetProcAddress, через которые внедряемый код будет загружать используемые библиотеки и получать адреса используемых функций.
введем еще одну процедуру:
Код:
function InjectThread(Process: dword; Thread: pointer; Info: pointer;
                      InfoLen: dword; Results: boolean): THandle;
var
  pThread, pInfo: pointer;
  BytesRead, TID: dword;
begin
  pInfo   := InjectMemory(Process, Info, InfoLen);
  pThread := InjectMemory(Process, Thread, SizeOfProc(Thread));
  Result  := CreateRemoteThread(Process, nil, 0, pThread, pInfo, 0, TID);
  if Results then
    begin
      WaitForSingleObject(Result, INFINITE);
      ReadProcessMemory(Process, pInfo, Info, InfoLen, BytesRead);
    end;
end;
Эта процедура копирует в целевой процесс внедряемый код и структуру с данными для него, после чего запускает внедренный код.
Принимаемые параметры:
Process - хэндл открытого процесса.
Thread - указатель на внедряемый код в текущем процессе.
Info - указатель на структуру с данными.
InfoLen - размер структуры с данными.
Results - необходимость возврата результата. (если true, то функция ожидает завершения удаленного потока и копирует обратно структуру с данными) .
 
Ответить с цитированием

  #1663  
Старый 30.05.2008, 21:09
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

не внедрение библиотеки, а защита от внедрения. интересует именно от createremotethread
 
Ответить с цитированием

  #1664  
Старый 30.05.2008, 21:49
Nick_Rimer
Новичок
Регистрация: 12.05.2008
Сообщений: 19
Провел на форуме:
28051

Репутация: 2
По умолчанию

для cash$$$
спасибо за столь подробный ответ!! правда, я уже давно знаю, как создавать ресурсы посредством brcc32.exe и файлов *.rc
меня именно шрифты интересовали. Спасибо большое еще раз, буду пробовать!

------------

теперь другой вопрос.. я использую компонент TntRichEdit
можно ли в нем сделать текст по ширине? если да, то как? если нет, то вопрос отпал..
 
Ответить с цитированием

  #1665  
Старый 30.05.2008, 21:49
НTL
Постоянный
Регистрация: 26.01.2008
Сообщений: 796
Провел на форуме:
5209663

Репутация: 357


Отправить сообщение для НTL с помощью ICQ
По умолчанию

begin_end, сделал библиотеку иконок сохранил как icc как теперь поменять значек?
 
Ответить с цитированием

  #1666  
Старый 30.05.2008, 22:27
Nightmarе
Познавший АНТИЧАТ
Регистрация: 29.04.2007
Сообщений: 1,189
Провел на форуме:
5749763

Репутация: 1680


Отправить сообщение для Nightmarе с помощью ICQ
По умолчанию

Народ! Опять я со своими ламоразмами, в общем как мне сделать у программы такую форму, которую я сам нарисую в фотожопе и она отобразится как обычная форма со всеми компонентами, там кнопки и т.д... которые я на неё кину.

Например есть картинка простой вытянутый круг, круг зелёного цвета а всё лишнее белого например, как из неё форму сделать?
Если нужно в фотожопе юзать альфа-каналы или ещё что, эт я знаю как юзать.
Кто знает, напишите код, желательно не большой, а то я как всегда не пойму...
 
Ответить с цитированием

  #1667  
Старый 30.05.2008, 22:50
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
По умолчанию

https://forum.antichat.ru/showpost.p...&postcount=746

(https://forum.antichat.ru/thread64446.html)

Последний раз редактировалось Jes; 30.05.2008 в 22:53..
 
Ответить с цитированием

  #1668  
Старый 30.05.2008, 23:11
Nightmarе
Познавший АНТИЧАТ
Регистрация: 29.04.2007
Сообщений: 1,189
Провел на форуме:
5749763

Репутация: 1680


Отправить сообщение для Nightmarе с помощью ICQ
По умолчанию

Цитата:
Сообщение от Jes  
https://forum.antichat.ru/showpost.p...&postcount=746

(https://forum.antichat.ru/thread64446.html)
Это типа команда с помощью которой форма и превращяется в нужную картинку?
SetWindowsRgn(Form1.Handle, True);

Выскакивает ошибка, может в uses чё приинклудить надо?
 
Ответить с цитированием

  #1669  
Старый 30.05.2008, 23:20
Dr.KoD
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме:
140772

Репутация: 72
По умолчанию

Nightmarе Вообще юзай компонент динамикскинформ( в нем вообще редактор есть для создания собственных скинов) или SUIPack и не заморачивайся.
 
Ответить с цитированием

  #1670  
Старый 30.05.2008, 23:21
xaker-boss
Участник форума
Регистрация: 06.03.2007
Сообщений: 283
Провел на форуме:
1547094

Репутация: 120
Отправить сообщение для xaker-boss с помощью ICQ
По умолчанию

Кто знает как программно нажать на кнопку 'Enter' ?
Если незатруднит напишите кодом, плиз
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[jQuery] - Задай вопрос, получи ответ Isis PHP 62 25.12.2009 03:25



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ