Всем драсьте =) Есть процесс, я получил список длл-ок, которые она использует. Как мне получить список функций, используемые процессом? P.S. кто-нить качал сорцы отсюда?
criz Для получения списка всех процессов в системе, если я не ошибаюсь можно получить так: Code: type TPROCESS = packed record ProcessId : dword; ImageName : array [0..15] of Char; pEPROCESS : dword; ParrentPid: dword; end; PSYS_PROCESSES = ^TSYS_PROCESSES; TSYS_PROCESSES = packed record ProcessesCount: dword; Process: array[0..0] of TPROCESS; end; { Получение списка процессов прямым доступом к структурам ядра. } function GetProcesses(): PSYS_PROCESSES; var Eprocess: array [0..$600] of byte; CurrentStruct: dword; CurrSize: dword; OldPriority: dword; begin CurrSize := SizeOf(TSYS_PROCESSES); GetMem(Result, CurrSize); ZeroMemory(Result, CurrSize); ZeroMemory(@Eprocess, $600); CurrentStruct := UndocData.BaseProcStrAdr + UndocData.ActivePsListOffset; OldPriority := GetThreadPriority($FFFFFFFE); SetThreadPriority($FFFFFFFE, THREAD_PRIORITY_TIME_CRITICAL); repeat CurrentStruct := CurrentStruct - UndocData.ActivePsListOffset; Ring0CopyMemory(pointer(CurrentStruct), @Eprocess, $220); if pdword(dword(@Eprocess) + UndocData.ppIdOffset)^ > 0 then begin Inc(CurrSize, SizeOf(TPROCESS)); ReallocMem(Result, CurrSize); Result^.Process[Result^.ProcessesCount].ProcessId := pdword(dword(@Eprocess) + UndocData.PidOffset)^; Result^.Process[Result^.ProcessesCount].pEPROCESS := CurrentStruct; lstrcpyn(@Result^.Process[Result^.ProcessesCount].ImageName, PChar(dword(@Eprocess) + UndocData.NameOffset), 16); Result^.Process[Result^.ProcessesCount].ParrentPid := pdword(dword(@Eprocess) + UndocData.ppIdOffset)^; Inc(Result^.ProcessesCount); end; CurrentStruct := pdword(dword(@Eprocess) + UndocData.ActivePsListOffset)^; if CurrentStruct < $80000000 then break; until CurrentStruct = UndocData.BaseProcStrAdr + UndocData.ActivePsListOffset; SetThreadPriority($FFFFFFFE, OldPriority); end;
St0nX, замечательная вещь. Еще есть у Руссиновича ProccessExplorer и dumpbin(или как-то так) у VC++ Только вот мне свое хочется.
Сделал вывод названий секций и их виртуальных адресов(VA). Результат: Последняя секция без названия...это нормально?
а) импорт - читай описание PE-формата б) прога может быть упакована и восстановлять таблицу импорта в начале своей работы в) прога может динамически подгружать функции - тогда у тебя немного шансов их найти, не реверся её
2 desTiny: а) читаю, мноооого чего читаю. б) она не упакована, обычный "hello, world" з.Ы. пытаюсь получить имя из IMAGE_IMPORT_DESCRIPTOR, пока ниче не выходит Code: PIMAGE_IMPORT_DESCRIPTOR Import; PLOADED_IMAGE pli; pli = ImageLoad("C:\\test.exe", NULL); Import = (PIMAGE_IMPORT_DESCRIPTOR) pli->FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; тут вылетает экзепшн
ППЦ! Сделал Вывыодится импорт Осталось разобраться че я сделал))) P.S. кому интересно, идите по ссылке , которую bons дал
Как определить тип файла(ехе или длл)? Пробую вот так: Code: if(hPE->FileHeader.Characteristics == IMAGE_FILE_EXECUTABLE_IMAGE) printf("File type: exe\n");
Не, так низя Есть такой способ: Code: if(PE->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) printf("File type: EXE\n"); if(PE->FileHeader.Characteristics & IMAGE_FILE_DLL) printf("File type: DLL\n"); В случае с ехе-файлом все норм, выводится File type: EXE,а если файл является dll'кой, то выводится и File type: EXE, и File type: DLL.
а я что сказал? я указал не объектное обращение к загруженному файлу на сях, а куда смотреть в пе-заголовке.