|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | Работа с памятью чужого процесса, перехват API |
|
|
Delphi - Delphi | Работа с памятью чужого процесса, перехват API
|
Старожил Сообщения: 300 |
Профиль | Сайт | Отправить PM | Цитировать Вопрос в PM пришел:
Цитата DillerInc:
Цитата:
|
|||
Отправлено: 20:15, 21-07-2005 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Ну,тогда я сдаюсь . Дело в том,что мне необходимо изменить защитные атрибуты определённой страницы чужого процесса,к примеру: поменять на PAGE_EXECUTE_READWRITE ,но теперь я совсем запутался... |
------- Отправлено: 21:10, 21-07-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать DillerInc
Не могу не спросить - каковы причины? Может есть другое решение? Кстати, нужные адреса можно и через VirtualQueryEx() получить. Ща попробуем.... |
Отправлено: 22:18, 21-07-2005 | #3 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Цитата:
Мне необходимо поймать на крючок вызов функции LoadLibraryA из библиотеки Kernel32.dll в чужом процессе, иными словами,иметь возможность поместить в нужное место в нужное время два байта ( EB FE ), если я вообще правильно понял всю эту катавасию. Цитата:
...только что мы поставим в качестве переменной address - ведь там тоже "Pointer to the base address..." ? |
||
------- Отправлено: 23:08, 21-07-2005 | #4 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить 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. Цитата:
Цитата:
|
|||
Отправлено: 23:20, 21-07-2005 | #5 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить 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 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Спасибо за ссылки - будем разбираться. Если что, буду тогда сюда постить,если ты не против. Цитата:
|
|
------- Отправлено: 00:14, 22-07-2005 | #7 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить 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; Вопрос: почему первый вариант работает,а второй нет ? Как можно поправить ситуацию ? |
------- Отправлено: 21:31, 23-07-2005 | #8 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Нет,ну это просто проказа какая-то :
беру любое смещение из адресного простанства чужого процесса,вставляю его как второй параметр в функцию VirtualProtectEx - всё работает без каких-либо проблем! Как только использую адрес начала системной функции - всё идёт крахом, из-за чего рушится и вся остальная конструкция. Может быть проблема заключается именно в попытке обращения к импортируемой библиотеке,но в указанных примерах (по ссылкам) предлагали же непосредственное внедрение своих команд в начало системной функции ... |
------- Отправлено: 00:12, 25-07-2005 | #9 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Ну,неужели ни у кого нету никаких соображений по этому поводу,никаких советов ?
Может причина "недосягаемости" адресного пространтсва импортируемых библиотек заключается где-то в атрибутах,свойствах открытия файла или создания процесса из последнего... |
------- Отправлено: 22:32, 26-07-2005 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Перехват 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 |
|