Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог DumpBin 
:(
    Опции темы
Poseidon
Дата 19.5.2005, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Иногда на форуме проскакивает такой вопрос: "Как можно поглядеть экспортируемые ф-ии какой либо длл'ины?". 
Можно конечно же воспользоваться стандартными утилитами, но можно попробовать написать и что нить свое. 
Сейчас я попробую показать такой пример. Напишем пример, который делает именно это - вытаскивает экспорт модуля. 
Подробно расписывать тут ничего не буду, тут идет разбор элементов PE заголовка - нахождение таблицы экспорта, 
перечисление ф-ий. Недостаток этого примера в том, что он работает уже с подгруженными модулями, т.к. для нахождения 
базы используется GetModuleHandle(). 
Вставка: 
The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address 
space of the calling process. 
Для расширения возможностей - простмотра всех модулей, надо использовать 
что нить другое, например "мэпирование" (CreateFileMapping() итд). Ведь надо хоть что нить самому сделать.... 

Код

program ExpDump; 

uses windows; 

var 
    ImageBase : DWord; 
    DosHeader : PImageDosHeader; 
    PeHeader  : PImageNtHeaders; 
    PExport   : PImageExportDirectory; 
    pname     : PDWord; 
    name      : PChar; 
    i         : Integer; 
    cmdline   : string; 

//#### ?-??: ????? ? ???? 
function Dump(const log: PChar): boolean; 
Var hFile     : THandle; 
    dwError   : DWord; 
    dwWritten : DWord; 
    buffer    : PChar; 
begin 
 hFile := CreateFile(PChar(cmdline + '_fexport.txt'), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
 if (hFile = INVALID_HANDLE_VALUE) then begin 
  result := FALSE; 
  exit; 
 end; 

 dwError := SetFilePointer(hFile, 0, nil, FILE_END); 
 if (dwError = $FFFFFFFF) then begin 
  CloseHandle(hFile); 
  result := FALSE; 
  exit; 
 end; 

 buffer := PChar(log + #13#10); 
 WriteFile(hFile, buffer^, length(buffer), dwWritten, nil); 
 if (dwWritten < DWord(length(buffer))) then begin 
  CloseHandle(hFile); 
  result := FALSE; 
  exit; 
 end; 
 CloseHandle(hFile); 
 result := TRUE; 
end; 
//#### 

//#### Start 
begin 
  if (ParamCount < 1) then halt(0) else cmdline := ParamStr(1); 

  ImageBase := GetModuleHandle(PChar(cmdline)); 
  if (ImageBase = 0) then begin 
    MessageBox(0, 'Error Load Module', 'Error', MB_OK); 
    halt(0); 
  end; 

  DosHeader := PImageDosHeader(ImageBase); 
  if (DosHeader^.e_magic <> IMAGE_DOS_SIGNATURE) then begin 
    MessageBox(0,'Error Dos Header','Error',MB_OK); 
    halt(0); 
  end; 

  PEHeader := PImageNtHeaders(DWord(ImageBase) + DWord(DosHeader^._lfanew)); 
  if (PEHeader^.Signature <> IMAGE_NT_SIGNATURE) then begin 
    MessageBox(0,'Error PE Header', 'Error', MB_OK); 
    halt(0); 
  end; 

  PExport := PImageExportDirectory(ImageBase + DWord(PEHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)); 
  pname   := PDWord(ImageBase + DWord(PExport^.AddressOfNames)); 


  Dump(PChar('Programm ExpDump =)')); 
  Dump(PChar(cmdline + ' functions:')); 
  Dump(PChar(#13#10)); 

  For i := 0 to PExport^.NumberOfNames - 1 do begin 
   name := PChar(PDWord(DWord(ImageBase)  + PDword(pname)^)); 
   if (not Dump(name)) then halt(0); 
   inc(pname); 
  end; 
end. 
//#### End  



Пример использования: 

ExpDump.Exe User32.dll 

В рехультате: 

Programm ExpDump =) 
user32.dll functions: 


ActivateKeyboardLayout 
AdjustWindowRect 
AdjustWindowRectEx 
AlignRects 
AllowForegroundActivation 
AllowSetForegroundWindow 
AnimateWindow 
AnyPopup 
AppendMenuA 
AppendMenuW 
ArrangeIconicWindows 
AttachThreadInput 
BeginDeferWindowPos 
BeginPaint 
BlockInput 
... 


Для улучшения можно доделать так: 
Код

ImageBase := GetModuleHandle(PChar(cmdline)); 
  if (ImageBase = 0) then begin 
    ImageBase := LoadLibrary(PChar(cmdline)); 
    if (ImageBase = 0) then begin 
     MessageBox(0, 'Error Load Module', 'Error', MB_OK); 
     halt(0); 
    end; 
  end; 

И не забудте в конце FreeLibrary() 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.