[Из песочницы] Простая прокси-DLL своими руками

Понадобилось мне перехватывать вызовы GDS32.DLL. Решил написать прокси-dll.Пишем исследовательский стенд Первое, что нам нужно — это получить список всех экспортируемых функций из настоящей dll. Сделаем это следующим кодом:1. program GetFuncsDll; 2. {$APPTYPE CONSOLE} 3. uses Windows; 4. var 5. ImageBase: DWORD; //адрес образа dll 6. pNtHeaders: PImageNtHeaders; // PE заголовок dll 7. IED: PImageExportDirectory; // адрес таблицы экспорта 8. ExportAddr: TImageDataDirectory; // таблица экспорта 9. I: DWORD; // переменная для цикла 10. NamesCursor: PDWORD; // указатель на адрес имени функции 11. OrdinalCursor: PWORD; // указатель на адрес номера функции 12. LIB_NAME: AnsiString; // имя dll 13. BEGIN 14. LIB_NAME:='MiniLib.dll'; 15. loadlibraryA (PAnsiChar (LIB_NAME)); 16. ImageBase:= GetModuleHandleA (PAnsiChar (LIB_NAME)); 17. pNtHeaders:= Pointer (ImageBase + DWORD (PImageDosHeader (ImageBase)^._lfanew)); 18. ExportAddr:= pNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; 19. IED:= PImageExportDirectory (ImageBase+ExportAddr.VirtualAddress); 20. NamesCursor:= Pointer (ImageBase + DWORD (IED^.AddressOfNames)); 21. OrdinalCursor:= Pointer (ImageBase + DWORD (IED^.AddressOfNameOrdinals)); 22. For I:=0 to Integer (IED^.NumberOfNames-1) do begin 23. WriteLn (output, PAnsiChar (ImageBase + PDWORD (NamesCursor)^),'=', OrdinalCursor^ + IED^.Base); 24. Inc (NamesCursor); 25. Inc (OrdinalCursor); 26. end; 27. Readln; 28. end. Листинг 1 Здесь трудностей вроде нет. Добираемся последовательно до таблицы экспорта (строка 19) указателей на массив имен (NamesCursor) и массива номеров (OrdinalCursor) и читаем функцию за функцией, имена и номера. Количество функций находится в поле NumberOfNames. Этот код был добыт на просторах интернета, потом доработан и упрощён.Читать дальше →

© Habrahabr.ru