Вверх ↑
Этот топик читают: Гость
Ответов: 1341
Рейтинг: 31
#1: 2019-11-17 13:53:55 ЛС | профиль | цитата
Есть готовые решения мб у кого нибудь?

давно уже думаю над этим, а с интернета что либо собрать не удаётся
нужно получить базовый адрес и размер того или иного модуля в памяти стороннего процесса
возможно создание и выкуп компонента с возможностями получения всего списка загруженных модулей и информация о них: имя модуля, базовый адрес, размер выделенный под мод модуль
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4621
Рейтинг: 746
#2: 2019-11-18 11:40:46 ЛС | профиль | цитата
Типа такого?



Редактировалось 1 раз(а), последний 2019-11-18 11:41:24
карма: 26

0
Ответов: 1341
Рейтинг: 31
#3: 2019-11-19 16:23:25 ЛС | профиль | цитата
Netspirit писал(а):
Типа такого?


Да да да, оно и надо, только еще размер выделенный для модуля, но не столь обязательно
карма: 2

0
Ответов: 4621
Рейтинг: 746
#4: 2019-11-19 16:44:10 ЛС | профиль | цитата
И насколько оно тебе нужно?
карма: 26

0
Ответов: 1341
Рейтинг: 31
#5: 2019-11-19 18:30:11 ЛС | профиль | цитата
Netspirit писал(а):
И насколько оно тебе нужно?


Как понять?)

Давно хотел такой инструмент в своих творениях)
карма: 2

0
Ответов: 4621
Рейтинг: 746
#6: 2019-11-20 12:13:13 ЛС | профиль | цитата
Функции EnumProcessModules() и GetModuleFileNameEx() из psapi.dll.
карма: 26

0
Ответов: 1341
Рейтинг: 31
#7: 2019-11-20 13:27:03 ЛС | профиль | цитата
Netspirit писал(а):
Функции EnumProcessModules() и GetModuleFileNameEx() из psapi.dll.



эти функции и пробовал вызывать, вот только я никогда не работал с массивами в коде, ввиду этого и не выходит ничего

GetModule

Add(MainForm,2953706,77,105)
{
Width=495
Height=447
Point(Handle)
link(onCreate,15780893:doWinInfo,[(121,125)(121,149)(65,149)(65,174)])
}
Add(InlineCode,3935702,147,168)
{
@Hint=#22:Запрос NamePC Name Bit|
@Color=16777130
WorkPoints=#6:doEnum|
EventPoints=#6:onEnum|
DataPoints=#3:pid|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: onEnum: THI_Event;|20: pid: THI_Event;|51: procedure doEnum(var _Data:TData; Index:word);|5: end;|1: |4:type|42: TModuleArray = array[0..400] of HMODULE;|50: TModuleOption = (moRemovePath, moIncludeHandle);|40: TModuleOptions = set of TModuleOption;|0:|39:function GetLoadedDLLList(sl: TStrings;|51:Options: TModuleOptions = [moRemovePath]): Boolean;|0:|0:|14:implementation|0:|39:function GetLoadedDLLList(sl: TStrings;|51:Options: TModuleOptions = [moRemovePath]): Boolean;|4:type|67:EnumModType = function (hProcess: Longint; lphModule: TModuleArray;|54:cb: DWord; var lpcbNeeded: Longint): Boolean; stdcall;|3:var|18:psapilib: HModule;|18:EnumProc: Pointer;|17:ma: TModuleArray;|11:I: Longint;|37:FileName: array[0..MAX_PATH] of Char;|10:S: string;|5:begin|16:Result := False;|44:if Win32Platform VER_PLATFORM_WIN32_NT then|5:Exit;|37:psapilib := LoadLibrary('psapi.dll');|20:if psapilib = 0 then|5:Exit;|3:try|59:EnumProc := GetProcAddress(psapilib, 'EnumProcessModules');|30:if not Assigned(EnumProc) then|5:Exit;|9:sl.Clear;|38:FillChar(ma, SizeOF(TModuleArray), 0);|60:if EnumModType(EnumProc)(GetCurrentProcess, ma, 400, I) then|5:begin|20:for I := 0 to 400 do|16:if ma[i] 0 then|5:begin|32:FillChar(FileName, MAX_PATH, 0);|45:GetModuleFileName(ma[i], FileName, MAX_PATH);|57:if CompareText(ExtractFileExt(FileName), '.dll') = 0 then|5:begin|14:S := FileName;|31:if moRemovePath in Options then|24:S := ExtractFileName(S);|34:if moIncludeHandle in Options then|31:sl.AddObject(S, TObject(ma[I]))|4:else|10:sl.Add(S);|4:end;|4:end;|4:end;|15:Result := True;|7:finally|22:FreeLibrary(psapilib);|4:end;|4:end;|0:|29:procedure THiAsmClass.doEnum;|5:begin|26: _hi_onEvent(onEnum, '');|4:end.|
link(pid,15780893:ProcessID,[(153,156)(125,156)(125,212)(97,212)])
}
Add(WinInfo,15780893,77,168)
{
Point(ProcessID)
link(onWinInfo,3935702:doEnum,[])
link(Handle,2953706:Handle,[])
}
Add(StringTableMT,14860205,280,168)
{
Left=25
Top=25
Width=425
Height=360
Columns=#7:mod=200|6:ad=100|7:siz=100|
IconsCheck=[]
MiscIcons=[]
Icons=[]
}

Редактировалось 2 раз(а), последний 2019-11-20 13:50:13
карма: 2

0
Ответов: 4621
Рейтинг: 746
#8: 2019-11-20 15:18:13 ЛС | профиль | цитата

Add(InlineCode,11970995,560,385)
{
WorkPoints=#67:doEnumProcModules=Перечисляет модули, используемые процессом ProcID|
EventPoints=#35:onEnumModules=Выдаёт хендлы модулей|60:onError=Происходит при ошибках и выдает системный код ошибки|
VarPoints=#30:ModuleName=Содержит имя модуля|
DataPoints=#64:ProcID=Идентификатор процесса, модули которого нужно перечислить|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: KOL, Share, Debug, Windows;|0:|4:type|41: THModArray = array [0..1023] of HModule;|2: |28: THiAsmClass = class(TDebug)|10: private|22: FModName: string;|9: public|23: ProcID: THI_Event;|30: onEnumModules: THI_Event;|24: onError: THI_Event;|64: procedure doEnumProcModules(var _Data: TData; Index: Word);|58: procedure ModuleName (var _Data: TData; Index: Word);|5: end;|1: |79: function EnumProcessModules(hProcess: THandle; lphModule: Pointer; cb: DWORD;|116: var lpcbNeeded: DWORD): BOOL; stdcall; external 'psapi.dll' name 'EnumProcessModules';|32: |67: function GetModuleFileNameEx(hProcess: THandle; hModule: HMODULE;|159: lpFilename: PChar; nSize: DWORD): DWORD; stdcall; external 'psapi.dll' name 'GetModuleFileNameExA'; |14:implementation|0:|73:procedure THiAsmClass.doEnumProcModules(var _Data: TData; Index: Word); |3:var|15: PID: Integer;|24: HModArray: THModArray;|17: HProc: THandle;|18: cbNeeded: DWORD;|13: I: Integer;|12: S: string;|14: Sz: Integer;|5:begin|17: FModName := '';|2: |39: PID := ReadInteger(_Data, ProcID, 0);|2: |80: HProc := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, PID);|20: if HProc <> 0 then|7: begin|79: if EnumProcessModules(HProc, @HModArray, SizeOf(THModArray), cbNeeded) then|9: begin|25: SetLength(S, 1024);|58: for I := 0 to (cbNeeded div SizeOf(HModule)) - 1 do|11: begin|78: Sz := GetModuleFileNameEx(HProc, HModArray[I], Pointer(S), Length(S));|22: if Sz > 0 then|13: begin|55: //FModName := Copy(S, 1, StrLen(Pointer(S)));|31: FModName := PChar(S);|11: end|12: else|25: FModName := '';|8: |58: _hi_OnEvent(onEnumModules, Integer(HModArray[I]));|10: end;|7: end|8: else|63: _hi_CreateEvent(_Data, @onError, Integer(GetLastError)); |23: CloseHandle(HProc);|5: end|6: else|61: _hi_CreateEvent(_Data, @onError, Integer(GetLastError)); |4:end;|0:|65:procedure THiAsmClass.ModuleName(var _Data: TData; Index: Word); |5:begin|28: dtString(_Data, FModName);|4:end;|0:|4:end.|
}
карма: 26

0
Ответов: 1341
Рейтинг: 31
#9: 2019-11-20 18:25:15 ЛС | профиль | цитата
выдаёт ошибку

299: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично.

целевой процесс x64 , почему то не хочет работать, в то время как х32 работает.


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

печально, как оказалось что х32 процесс не может прочитать модули у х64 процесса, есть ли выход?

----------------------------------
откомпилировав код через компилятор x64, вполне работает, осталось только переделать Int в Int64

Редактировалось 2 раз(а), последний 2019-11-20 18:51:46
карма: 2

0
Ответов: 4621
Рейтинг: 746
#10: 2019-11-20 18:54:20 ЛС | профиль | цитата
Rysik писал(а):
есть ли выход?
Поскольку для получения списка модулей используется функция API, то ей "выход" неизвестен. А так, для чтения памяти 64-битного процесса из 32-битного, вроде, существует какой-то костыль.
карма: 26

0
Ответов: 1341
Рейтинг: 31
#11: 2019-11-20 18:57:27 ЛС | профиль | цитата
вобщем откомпилировав приложение в FPC64, и изменив тип переменной I на Int64, получилось успешно прочитать модули процесса x64, далее планирую сделать DLL библиотеку на hiasm, загружать её из памяти)

Netspirit, спасибо

--- Добавлено в 2019-11-20 19:19:49

dll не работает в 32), видимо тоже что то не совместимо

Редактировалось 2 раз(а), последний 2019-11-20 19:19:49
карма: 2

0
Ответов: 4621
Рейтинг: 746
#12: 2019-11-21 11:42:47 ЛС | профиль | цитата
64-битная DLL в 32-битном процессе и не должна работать.
карма: 26

0
Ответов: 1341
Рейтинг: 31
#13: 2019-11-24 09:15:43 ЛС | профиль | цитата
Сделал просто мини утилиту фоновую и передачу параметров через MailSlot, работает корректно.
карма: 2

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)