Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | Работа с памятью чужого процесса, перехват API

Ответить
Настройки темы
Delphi - Delphi | Работа с памятью чужого процесса, перехват API

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вопрос в PM пришел:
Цитата DillerInc:
Привет!
Как не трудно догадаться,данная функция возвращает False,и я не уверен,всё ли правильно я делаю.
Итак:

var
eax : Pointer;
OldProtect : DWORD;
begin
VirtualProtectEx(processInfo.hProcess, eax, 2, PAGE_EXECUTE_READWRITE, @OldProtect);
end;

Указатель eax получен от GetProcAddress и имеет значение 7C5901D5 (адрес загрузки функции LoadLibraryA).
В общем,в отладчике можно наблюдать следующие ошибки :
C0000018 - STATUS_CONFLICTING_ADDRESSES
ERROR_INVALID_ADDRESS (GetLastError)
Что делать ?!
Вторым парметром должен идти адрес в памяти, зарезервированной функциями VirtualAlloc(Ex) c параметром MEM_RESERVE, а не указатель, полученный "от GetProcAddress и имеющий значение 7C5901D5 (адрес загрузки функции LoadLibraryA)".
Цитата:
lpAddress
[in] Pointer to the base address of the region of pages whose access protection attributes are to be changed.
All pages in the specified region must be within the same reserved region allocated when calling the VirtualAlloc or VirtualAllocEx function using MEM_RESERVE. The pages cannot span adjacent reserved regions that were allocated by separate calls to VirtualAlloc or VirtualAllocEx using MEM_RESERVE.

Отправлено: 20:15, 21-07-2005

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 21:10, 21-07-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
Не могу не спросить - каковы причины?
Может есть другое решение?

Кстати, нужные адреса можно и через VirtualQueryEx() получить. Ща попробуем....

Отправлено: 22:18, 21-07-2005 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Цитата:
Не могу не спросить - каковы причины?
...т.е. всей моей затеи что-ли ?
Мне необходимо поймать на крючок вызов функции LoadLibraryA из библиотеки Kernel32.dll в чужом процессе, иными словами,иметь возможность поместить в нужное место в нужное время два байта ( EB FE ), если я вообще правильно понял всю эту катавасию.
Цитата:
нужные адреса можно и через VirtualQueryEx() получить
...типа так:
Код: Выделить весь код
var
 memInfo : _MEMORY_BASIC_INFORMATION
 address : Pointer;
begin
 VirtualQueryEx(processInfo.hProcess, address, memInfo, SizeOf(memInfo));
end;
...только что мы поставим в качестве переменной address - ведь там тоже "Pointer to the base address..." ?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 23:08, 21-07-2005 | #4


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Когда мне надо посмотреть или проверить как работает та или иная функция, то обычно я пишу небольшую программку, которая эту самую функцию активно использует
Итак, представленная ниже программа (если я все правильно сделал) должна:
1) найти все запущенные процессы
2) в области виртуальной памяти каждого процесса найти используемые им части (регионы/блоки) и вывести по ним информацию
Если выводить в файл, то он получается размером в 2,37 мб ))
Код: Выделить весь код
program vpe;

{$APPTYPE CONSOLE}

uses
  Windows, PsAPI;

var
  hProcess: Cardinal;
  Buf: Memory_Basic_Information;
  tmp: array[0..200] of Cardinal; // буыер под 201 процесс =))
  i, k, j: Cardinal;
//  si: System_Info;

label
  l;

function Int2Hex( Value : DWord; Digits : Integer ): ShortString;
{ this function is copyrighted by KSer}
asm
        MOV       [ECX], DL
        XADD      EDX, ECX
@@loop1:
        PUSH      EAX
        db   $24, $0F    // and  al,$0F
        AAM
        //AAD
        DB $D5, $11
        db   $04, $30    // add  al,$30
        MOV       [EDX], AL
        POP       EAX
        SHR       EAX, 4
        DEC       EDX
        LOOP      @@loop1
end;

function GetAProtect(const i: Cardinal): String;
var
  temp: Cardinal;
const
  PAGE_WRITECOMBINE = $400;
begin
  Result := '';

  if i = 0 then begin
    Result := 'unknown (0)'; Exit; end;
     
  temp := i and $000000FF;
  case temp of
    PAGE_NOACCESS:          Result := 'PAGE_NOACCESS';
    PAGE_READONLY:          Result := 'PAGE_READONLY';
    PAGE_READWRITE:         Result := 'PAGE_READWRITE';
    PAGE_WRITECOPY:         Result := 'PAGE_WRITECOPY';
    PAGE_EXECUTE:           Result := 'PAGE_EXECUTE';
    PAGE_EXECUTE_READ:      Result := 'PAGE_EXECUTE_READ';
    PAGE_EXECUTE_READWRITE: Result := 'PAGE_EXECUTE_READWRITE';
    PAGE_EXECUTE_WRITECOPY: Result := 'PAGE_EXECUTE_WRITECOPY';
  end;

  if i and PAGE_GUARD <> 0 then
     Result := Result + ' && PAGE_GUARD';
  if i and PAGE_NOCACHE <> 0 then
     Result := Result + ' && PAGE_NOCACHE';
  if i and PAGE_WRITECOMBINE <> 0 then
     Result := Result + ' && PAGE_WRITECOMBINE';
     
  if Result = '' then Result := '!!! Error';
end;

function GetState(const i: Cardinal): String;
begin
  case i of
    MEM_COMMIT:  Result := 'MEM_COMMIT';
    MEM_FREE:    Result := 'MEM_FREE';
    MEM_RESERVE: Result := 'MEM_RESERVE';
    else         Result := '!!! Error';
  end;
end;

function GetType(const i: Integer): String;
begin
  case i of
    0:           Result := 'unknown (0)';
    MEM_IMAGE:   Result := 'MEM_IMAGE';
    MEM_MAPPED:  Result := 'MEM_MAPPED';
    MEM_PRIVATE: Result := 'MEM_PRIVATE';
    else         Result := '!!! Error';
  end;
end;

begin
// Через GetSystemInfo можно узнать размер страницы в памяти и так как
// Вам нужно добраться до определенной страницы, то ее адрес вычисляется
// просто: Base_Address + si.dwPageSize * PageNumber_In_Allocation_Region
//  GetSystemInfo(si);
  if not EnumProcesses(@tmp, sizeof(tmp), i) then Exit;
  for k := 0 to (i div 4) - 1 do begin
    WriteLn(#10#13'* * * * * // PID = ', tmp[k]);
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, True, tmp[k]);
    j := 0;
l:  if VirtualQueryEx(hProcess, Ptr(j), Buf, sizeof(Buf)) > 0 then begin
      WriteLn('Base Address: 0x' + Int2Hex(Cardinal(Buf.BaseAddress), 8) + ' (', Cardinal(Buf.BaseAddress), ')');
      WriteLn('Allocation Base: 0x' + Int2Hex(Cardinal(Buf.AllocationBase), 8) + ' (', Cardinal(Buf.AllocationBase), ')');
      WriteLn('Allocation Protect: ', GetAProtect(Buf.AllocationProtect));
      WriteLn('Region Size: 0x' + Int2Hex(Buf.RegionSize, 8) + ' (', Buf.RegionSize, ')');
      WriteLn('State: ', GetState(Buf.State));
      WriteLn('Protect: ', Buf.Protect);
      WriteLn('Type: ', GetType(Buf.Type_9));
      if (Cardinal(Buf.BaseAddress) + Buf.RegionSize < $FFFFFFFF) and (Buf.RegionSize > 0) then begin
        WriteLn;
        j := Cardinal(Buf.BaseAddress) + Buf.RegionSize;
        goto l; // loop
      end;
    end;                           
  end;

  ReadLn;
end.
Эх, млин чуть-чуть не успел, вот и пост DillerInc'a появился...

Цитата:
Мне необходимо поймать на крючок вызов функции LoadLibrary
Это уже хуки. Если не ошибаюсь, то подробности в гугле по Hooking Windows API .

Цитата:
EB FE
хех. цикл. бесконечный. очень любимый всякими патчами/кряками ("замораживание" процесса). н-да...

Отправлено: 23:20, 21-07-2005 | #5


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вот на Делфи - http://forum.sources.ru/index.php?sh...=43286&hl=hook

Добавлено:
В этой статье (ближе к концу) тоже есть полезности (на асме).

Перехват APi функций в WinNT+

Добавлено:
Статьи о перехвате вызовов API, используя Delphi:
Перехват API функций в Windows NT (часть 1). Основы перехвата.
Перехват API функций в Windows NT (часть 2). Методы внедрения кода.
Перехват API функций в Windows NT (часть 3). Нулевое кольцо.

Последний раз редактировалось Savant, 27-07-2005 в 11:15.


Отправлено: 23:24, 21-07-2005 | #6


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Спасибо за ссылки - будем разбираться.
Если что, буду тогда сюда постить,если ты не против.
Цитата:
очень любимый всякими патчами/кряками
...а кто ж его не любит - экспериментируем,экспериментируем... .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 00:14, 22-07-2005 | #7


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Вообще,как то странно это...к примеру:
Код: Выделить весь код
var
 EntryPoint : LPDWORD;
 Temp_Protect : Cardinal;
begin
 VirtualProtectEx(pInfo.hProcess, PPointer(EntryPoint), 2, PAGE_EXECUTE_READWRITE, Temp_Protect);
end;
...работает на ура,а этот вариант:
Код: Выделить весь код
var
 ProcAddress : LPDWORD;
 Temp_Protect : Cardinal;
begin
 ProcAddress := LPDWORD(GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA'));
 VirtualProtectEx(pInfo.hProcess, PPointer(ProcAddress), 2, PAGE_EXECUTE_READWRITE, Temp_Protect);
end;
...продолжает упорно возвращать STATUS_CONFLICTING_ADDRESSES, хотя если взять последнюю предоставленную ссылку,то там описывается как раз аналогичный вариант с внедрением своего кода в начало системной функции (только там сразу применяется функция ReadProcessMemory,что кстати странно, т.к. кто гарантирует,что у нас есть право записи в эту страницу памяти ).
Вопрос: почему первый вариант работает,а второй нет ?
Как можно поправить ситуацию ?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 21:31, 23-07-2005 | #8


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Нет,ну это просто проказа какая-то :
беру любое смещение из адресного простанства чужого процесса,вставляю его как второй параметр в функцию VirtualProtectEx - всё работает без каких-либо проблем!
Как только использую адрес начала системной функции - всё идёт крахом, из-за чего рушится и вся остальная конструкция.
Может быть проблема заключается именно в попытке обращения к импортируемой библиотеке,но в указанных примерах (по ссылкам) предлагали же непосредственное внедрение своих команд в начало системной функции ...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 00:12, 25-07-2005 | #9


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Ну,неужели ни у кого нету никаких соображений по этому поводу,никаких советов ?
Может причина "недосягаемости" адресного пространтсва импортируемых библиотек заключается где-то в атрибутах,свойствах открытия файла или создания процесса из последнего...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 22:32, 26-07-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | Работа с памятью чужого процесса, перехват API

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Перехват API функций ники Лечение систем от вредоносных программ 23 09-04-2009 11:21
Перехват API на выключение компьютера __sa__nya Программное обеспечение Windows 3 11-06-2008 13:54
Delphi - Delphi | перехват проводника Crowner Программирование и базы данных 5 06-02-2007 18:30
Win32 API | Граббинг контента чужого TreeView Scorpion666 Программирование и базы данных 1 26-01-2006 11:03
WinAPI | Изменение контекстного меню чужого процесса megad Программирование и базы данных 8 17-08-2005 21:42




 
Переход