Вопросы про EXE и DLL

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by criz, 14 Jan 2009.

  1. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Всем драсьте =)
    Есть процесс, я получил список длл-ок, которые она использует. Как мне получить список функций, используемые процессом?
    P.S. кто-нить качал сорцы отсюда?
     
    #1 criz, 14 Jan 2009
    Last edited: 14 Jan 2009
  2. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    2 года прошло!!! Здохли? :(
    Ты на дату посмотри!!!!... :(
     
    #2 KaZ@NoVa, 14 Jan 2009
    Last edited: 14 Jan 2009
  3. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    это шутко)))
    Сабж?
     
  4. cash$$$

    cash$$$ Banned

    Joined:
    6 Jan 2008
    Messages:
    385
    Likes Received:
    246
    Reputations:
    10
    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;
     
  5. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    cash$$$, нет. Мне надо получить список функций, которые использует процесс
     
  6. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    смотри в таблицу импорта exe-файла процесса.
     
  7. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Как? :)
    P.S. нашел функцию ImageLoad()...
     
  8. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Есть плагин для Тотал командера им можно посмотреть таблицу импорта

    Называется PEViewer
     
    #8 St0nX, 14 Jan 2009
    Last edited: 14 Jan 2009
  9. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    St0nX, замечательная вещь. Еще есть у Руссиновича ProccessExplorer и dumpbin(или как-то так) у VC++ :)
    Только вот мне свое хочется.
     
    #9 criz, 14 Jan 2009
    Last edited: 14 Jan 2009
  10. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    в статье есть примеры по работе с таблицей импорта
    http://wasm.ru/article.php?article=green2red02
     
    1 person likes this.
  11. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    спасиб, будем разбираться :)
     
  12. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Сделал вывод названий секций и их виртуальных адресов(VA). Результат:
    Последняя секция без названия...это нормально? :)
     
  13. FoX's

    FoX's Дохлый

    Joined:
    26 Dec 2004
    Messages:
    169
    Likes Received:
    29
    Reputations:
    0
    в названиях может быть любой мусор. ОС их не проверяет :)
     
  14. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а) импорт - читай описание PE-формата
    б) прога может быть упакована и восстановлять таблицу импорта в начале своей работы
    в) прога может динамически подгружать функции - тогда у тебя немного шансов их найти, не реверся её
     
  15. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    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;
    
    тут вылетает экзепшн
     
  16. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    ППЦ! Сделал :) Вывыодится импорт :)
    Осталось разобраться че я сделал)))
    P.S. кому интересно, идите по ссылке , которую bons дал
     
    #16 criz, 16 Jan 2009
    Last edited: 17 Jan 2009
  17. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Как определить тип файла(ехе или длл)?
    Пробую вот так:
    Code:
    	if(hPE->FileHeader.Characteristics == IMAGE_FILE_EXECUTABLE_IMAGE)
    		printf("File type: exe\n");
    
     
  18. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    FileHeader->Characteristics->Dll
     
  19. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Не, так низя :)
    Есть такой способ:
    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.
     
  20. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а я что сказал? я указал не объектное обращение к загруженному файлу на сях, а куда смотреть в пе-заголовке.