Четверг, 28.03.2024, 13:15 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Anton93  
delphicode » Delphi » Процедуры и функции Delphi » Поиск адреса функции в чужом процессе. (Delphi.)
Поиск адреса функции в чужом процессе.
Волк-1024Дата: Понедельник, 27.08.2012, 02:18 | Сообщение # 1
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Вот на днях я заинтересовался данной темой. И в инете по данной тематике очень мало информации. Долго и упорно я искал. И случайно наткнулся вот на эту замечательную статью: http://www.rsdn.ru/article/baseserv/runcode.xml За что автору большая благодарность. И там было почти то, что нужно. Получилось очень не плохо. cool Т.е код работает. biggrin Я долгое время не хотел выкладывать этот код, ибо много парился, но всё-таки решился.

Данный код теперь даже умеет обрабатывать forwarded экспорт. cool

И в качестве приза функция для поиска адреса загрузки модулей в процессах (Реализацию подсмотрел в коде Zeus'а) biggrin

Остальные функции делайте сами biggrin (Для справки: функция ExtractOnlyFileName извлекает из пути файла только имя файла без расширения. Сделано это для того, чтобы искать модули по не полным именам, как это делает GetModuleHandle).
© By Wolk-1024.


Сообщение отредактировал dolphin - Вторник, 26.03.2013, 19:50
 
Волк-1024Дата: Понедельник, 27.08.2012, 02:26 | Сообщение # 2
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Блин. Код не очень красиво влез. sad
 
xXxSh@dowxXxДата: Понедельник, 27.08.2012, 09:49 | Сообщение # 3
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Quote (Волк-1024)
Блин. Код не очень красиво влез

Нормально smile

Quote (Волк-1024)
долгое время не хотел выкладывать этот код, ибо много парился,

Так может быть тогда в приват его?
 
Don_DiegoДата: Понедельник, 27.08.2012, 14:45 | Сообщение # 4
Продвинутый
Зарегистрирован: 16.04.2012
Группа: Пользователи
Сообщений: 253
Статус: Offline
Может это сказывается мое хроническое недосыпание (3 часа в сутки), но для чего можно применить эту функцию? Простите за глупый вопрос конечно surprised
 
Волк-1024Дата: Понедельник, 27.08.2012, 19:11 | Сообщение # 5
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Quote
Так может быть тогда в приват его?
Да нет. Не стоит. Здесь нету ничего особо приватного.

Quote
для чего можно применить эту функцию?

Много для чего. Ну, например, для перехвата API или самопал функций в стороннем процессе. Так же для инжекта кода, т.к библиотеки могут быть загружены по разным адресам, соответственно у api функций будет иной адрес. Ну а GetModuleHandleInProcess уж всяко пригодится.

Quote
хроническое недосыпание (3 часа в сутки)
Так нельзя. Это очень вредно.
 
Don_DiegoДата: Понедельник, 27.08.2012, 21:18 | Сообщение # 6
Продвинутый
Зарегистрирован: 16.04.2012
Группа: Пользователи
Сообщений: 253
Статус: Offline
Quote (Волк-1024)
т.к библиотеки могут быть загружены по разным адресам

Ну для этих целей я знаю такую функцию (1-й параметр - ID процесса, 2-й имя искомой библиотеки):

Code
uses TlHelp32;

function GetModuleBase(hProcID: Cardinal; lpModName: PChar):Cardinal;
var
   hSnap: Cardinal;
   tm: TModuleEntry32;
begin
   result := 0;
   hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, hProcID);
   if hSnap <> 0 then
     begin
       tm.dwSize := sizeof(TModuleEntry32);
       if Module32First(hSnap, tm) = true then
         begin
           while Module32Next(hSnap, tm) = true do
             begin
               if lstrcmpi(tm.szModule, lpModName) = 0 then
                 begin
                   result := Cardinal(tm.modBaseAddr);
                   break;
                 end;
             end;
         end;
       CloseHandle(hSnap);
     end;
end;

Возвращает адрес первого байта в памяти *.dll
 
Волк-1024Дата: Воскресенье, 02.09.2012, 22:41 | Сообщение # 7
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Вот нашел очень серьезный баг в функции NativeGetProcAddressEx. Баг связан с тем, что индексация имен функций в библиотеках начинается с ноля, а не с единицы, что в свою очередь приводило бы к серьёзным последствиям, таким как, например, если попытаться искать не существующую функцию, то функция вернет адрес последней функции в библиотеке, например, в Kernel32.dll это функция lstrlenW. sad Осталось еще одна не решенная проблема: NativeGetProcAddressEx не ищет адреса функций с ординалом 1, ищет только начиная от 2 и выше, а GetProcAddress всё находит. Есть варианты, как это исправить? sad

Сообщение отредактировал Волк-1024 - Вторник, 04.09.2012, 19:32
 
xXxSh@dowxXxДата: Понедельник, 03.09.2012, 22:25 | Сообщение # 8
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Волк-1024 а может быть данный баг можно как то использовать в своих целях?
 
Волк-1024Дата: Понедельник, 03.09.2012, 23:52 | Сообщение # 9
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Quote (xXxSh@dowxXx)
а может быть данный баг можно как то использовать в своих целях?


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

P.S. Функции стоило бы переименовать во что-то типа того: GetProcAddressInOtherProcess и GetModuleHandleInOtherProcess. А то как-то полевому звучит. smile


Сообщение отредактировал Волк-1024 - Понедельник, 03.09.2012, 23:55
 
xXxSh@dowxXxДата: Вторник, 04.09.2012, 09:47 | Сообщение # 10
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Аа, так этот баг затрагивает конкретно твой код, я не так понял сначала, прошу прощения biggrin
 
XSPYДата: Вторник, 26.03.2013, 15:45 | Сообщение # 11
Продвинутый
Зарегистрирован: 28.01.2010
Группа: Пользователи
Сообщений: 263
Статус: Offline
молодец,довольно интересно!

Я не крекер,а программист!
Я не преступник-я свободный человек!
Лучше один раз накодить,чем сто раз качать билды!
 
Волк-1024Дата: Пятница, 29.03.2013, 18:21 | Сообщение # 12
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Хмммм... Заметил, что после двойного переезда форума, пропал пост с исправленным вариантом кода...

Восполняю утрату:

Доступно только для пользователей


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Пятница, 29.03.2013, 18:27
 
reqyzДата: Суббота, 11.05.2013, 10:07 | Сообщение # 13
Новичок
Зарегистрирован: 11.05.2013
Группа: Пользователи
Сообщений: 2
Статус: Offline
Цитата (Волк-1024)
MemoryBasicInformation

возможно глупость спрошу, но у меня делфи 7 не хочет код компилировать, ругается на MemoryBasicInformation
в (NtQueryVirtualMemory(ProcessHandle, (Pointer(BaseAddress)), MemoryBasicInformation, @MemoryInformation,
(SizeOf(TMemoryBasicInformation)), @ReturnLength)=STATUS_SUCCESS)and(ReturnLength=(SizeOf(MemoryInformation)))

третье значение это длинное целое должно быть, чему там равен MemoryBasicInformation?
 
Волк-1024Дата: Суббота, 11.05.2013, 15:13 | Сообщение # 14
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
TMemoryBasicInformation - это структура. а MemoryBasicInformation это номер класса.
Все недостающие структуры и прототипы Native функций легко находятся в Гугле. smile

Код

    _MEMORY_INFORMATION_CLASS=(
       MemoryBasicInformation,
       MemoryWorkingSetList,
       MemorySectionName,
       MemoryBasicVlmInformation
       );
    MEMORY_INFORMATION_CLASS=_MEMORY_INFORMATION_CLASS;
    TMemoryInformationClass=MEMORY_INFORMATION_CLASS;

    _MEMORY_BASIC_INFORMATION=record
       BaseAddress: Pointer;
       AllocationBase: Pointer;
       AllocationProtect: DWORD;
       RegionSize: DWORD;
       State: DWORD;
       Protect: DWORD;
       Type_: DWORD;
    end;
    MEMORY_BASIC_INFORMATION=_MEMORY_BASIC_INFORMATION;
    PMEMORY_BASIC_INFORMATION=^MEMORY_BASIC_INFORMATION;
    TMemoryBasicInformation=MEMORY_BASIC_INFORMATION;
    PMemoryBasicInformation=^TMemoryBasicInformation;


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Суббота, 11.05.2013, 15:18
 
reqyzДата: Воскресенье, 12.05.2013, 12:44 | Сообщение # 15
Новичок
Зарегистрирован: 11.05.2013
Группа: Пользователи
Сообщений: 2
Статус: Offline
ясно)

Сообщение отредактировал reqyz - Воскресенье, 12.05.2013, 13:04
 
delphicode » Delphi » Процедуры и функции Delphi » Поиск адреса функции в чужом процессе. (Delphi.)
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz