Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Как получить список и адреса функций типа 0x0150E828 из откомпилированного DLL
Посл.ответ Сообщение

Ранг: 8.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 28 мая 2014 21:09
· Личное сообщение · #1

В качестве подопытного кролика будем использовать библиотеку NVAPI.DLL (драйвер Nvidia)
Статья:
http://eliang.blogspot.ru/2011/05/getting-nvidia-gpu-usage-in-c.html
Code:
  1. // some useful internal functions that aren't exported by nvapi.dll
  2. NvAPI_Initialize = (NvAPI_Initialize_t) (*NvAPI_QueryInterface)(0x0150E828);
  3. NvAPI_EnumPhysicalGPUs = (NvAPI_EnumPhysicalGPUs_t) (*NvAPI_QueryInterface)(0xE5AC921F);
  4. NvAPI_GPU_GetUsages = (NvAPI_GPU_GetUsages_t) (*NvAPI_QueryInterface)(0x189A1FDF);


Вкратце смысл такой: разработчики не ввели в nvapi.h описание функции NvAPI_GPU_GetUsages, и вызвать эту секретную функцию можно через LoadLibrary и затем указать её hex адрес.
Задача - получить весь список спрятанных функций



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 28 мая 2014 21:17
· Личное сообщение · #2

Если нет отладочных символов, то только поиском по коду или константам



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2014 22:55
· Личное сообщение · #3

Code:
  1.     ordinal hint RVA      name
  2.  
  3.          11    0 000010B0 NvClose
  4.          31    1 000011D0 NvConfigGet
  5.          32    2 00001200 NvConfigSet
  6.          33    3 00001230 NvConfigUpdate
  7.          30    4 000011B0 NvConfigVersion
  8.          35    5 000012B0 NvDeviceBaseGet
  9.          36    6 000012E0 NvDeviceLimitGet
  10.          37    7 00001310 NvDeviceSelectorGet
  11.          16    8 00001120 NvErrorMsg
  12.          18    9 00001190 NvGetFlatCodeSelector
  13.          17    A 00001170 NvGetFlatDataSelector
  14.          34    B 00001260 NvGetHardwarePointers
  15.          15    C 000010E0 NvNotifyMsg
  16.          10    D 00001090 NvOpen
  17.          41    E 00001360 NvSysClose
  18.          40    F 00001340 NvSysOpen
  19.          12   10 00001160 NvWait
  20.          50   11 0000201C THK_ThunkData32

NVidia Resource Manager, Version FCS 2.00 4.0.0.0
может это внутренние подпрограммы дллки, к которым обращаются апи функции



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 01 июня 2014 00:23 · Поправил: dosprog
· Личное сообщение · #4

ArchiStenton пишет:
В качестве подопытного кролика будем использовать библиотеку NVAPI.DLL (драйвер Nvidia)
Статья:
http://eliang.blogspot.ru/2011/05/getting-nvidia-gpu-usage-in-c.html


Требуйте у автора статьи тот файл, который рассматривается в статье.
Тот, что имеется, "NVidia Resource Manager, Version FCS 2.00 4.0.0.0", - не годится,
поскольку не экспортирует функцию <nvapi_QueryInterface>.

То-есть, строка программы:
Code:
  1. // nvapi_QueryInterface is a function used 
  2. to retrieve other internal functions in nvapi.dll
  3. NvAPI_QueryInterface = (NvAPI_QueryInterface_t) GetProcAddress(hmod, "nvapi_QueryInterface");

- приведёт к тому, что NvAPI_QueryInterface=NULL со всеми вытекающими последствиями.

Этот парень - какой-то хун-лян-ханг натуральный. Без проверок тут же прыгает по этому адресу в NULL:

Code:
  1.  // some useful internal functions that aren't exported by nvapi.dll
  2. NvAPI_Initialize = (NvAPI_Initialize_t) (*NvAPI_QueryInterface)(0x0150E828);



--- ДОБАВЛЕНО ---

А вот NVAPI.DLL - та библиотека, о которой идёт речь в статье китайца.





Ранг: 8.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2014 18:33
· Личное сообщение · #5

Адреса оказывается есть в интернете:
http://www.cyberforum.ru/csharp-net/thread376413.html
Code:
  1. if (NvAPI_Initialize() == NvStatus.OK) {
  2.         GetDelegate(0xE3640A56, out NvAPI_GPU_GetThermalSettings);
  3.         GetDelegate(0xCEEE8E9F, out _NvAPI_GPU_GetFullName);
  4.         GetDelegate(0x9ABDD40D, out NvAPI_EnumNvidiaDisplayHandle);
  5.         GetDelegate(0x34EF9506, out NvAPI_GetPhysicalGPUsFromDisplay);
  6.         GetDelegate(0xE5AC921F, out NvAPI_EnumPhysicalGPUs);
  7.         GetDelegate(0x5F608315, out NvAPI_GPU_GetTachReading);
  8.         GetDelegate(0x1BD69F49, out NvAPI_GPU_GetAllClocks);
  9.         GetDelegate(0x60DED2ED, out NvAPI_GPU_GetPStates);
  10.         GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);
  11.         GetDelegate(0xDA141340, out NvAPI_GPU_GetCoolerSettings);
  12.         <b>GetDelegate(0x774AA982, out NvAPI_GPU_GetMemoryInfo);</b>
  13.         GetDelegate(0xF951A4D1, out NvAPI_GetDisplayDriverVersion);
  14.         GetDelegate(0x01053FA5, out _NvAPI_GetInterfaceVersionString);

Мой код:
Code:
  1.  
  2. // function pointer types
  3. typedef int *(*NvAPI_QueryInterface_t)(unsigned int offset);
  4. typedef int (*NvAPI_Initialize_t)();
  5. typedef int (*NvAPI_EnumPhysicalGPUs_t)(int **handles, int *count);
  6. typedef int (*NvAPI_GPU_GetUsages_t)(int *handle, unsigned int *usages);
  7. typedef int (*NvAPI_GPU_GetMemoryInfo_t) (int *handle, NV_DISPLAY_DRIVER_MEMORY_INFO *PMemoryInfo);
  8. <...>
  9. NvAPI_Status status;
  10. NvAPI_ShortString errorDesc;
  11. HMODULE hmod = LoadLibraryA("nvapi.dll");
  12. if (hmod == NULL) ShowMessage( "Не удалось загрузить nvapi.dll");
  13. else ShowMessage ( "Библиотека nvapi.dll подгружена в память");
  14.  
  15. // nvapi.dll internal function pointers
  16. NvAPI_QueryInterface_t NvAPI_QueryInterface = NULL;
  17. NvAPI_Initialize_t NvAPI_Initialize = NULL;
  18. NvAPI_EnumPhysicalGPUs_t NvAPI_EnumPhysicalGPUs = NULL;
  19. NvAPI_GPU_GetUsages_t NvAPI_GPU_GetUsages = NULL;
  20. NvAPI_GPU_GetMemoryInfo_t NvAPI_GPU_GetMemoryInfo = NULL;
  21.  
  22. // nvapi_QueryInterface is a function used to retrieve other internal functions in nvapi.dll
  23. NvAPI_QueryInterface = (NvAPI_QueryInterface_t) GetProcAddress(hmod, "nvapi_QueryInterface");
  24.  
  25. // some useful internal functions that aren't exported by nvapi.dll
  26. NvAPI_Initialize = (NvAPI_Initialize_t) (*NvAPI_QueryInterface)(0x0150E828);
  27. NvAPI_EnumPhysicalGPUs = (NvAPI_EnumPhysicalGPUs_t) (*NvAPI_QueryInterface)(0xE5AC921F);
  28. NvAPI_GPU_GetUsages = (NvAPI_GPU_GetUsages_t) (*NvAPI_QueryInterface)(0x189A1FDF);
  29. NvAPI_GPU_GetMemoryInfo = (NvAPI_GPU_GetMemoryInfo_t) (*NvAPI_QueryInterface)(0x774AA982);
  30.  
  31. (*NvAPI_Initialize)();
  32.  
  33. int gpuCount = 0;
  34. int *gpuHandles[NVAPI_MAX_PHYSICAL_GPUS] = { NULL };
  35. unsigned int gpuUsages[NVAPI_MAX_USAGES_PER_GPU] = { 0 };
  36.  
  37. (*NvAPI_EnumPhysicalGPUs)(gpuHandles, &gpuCount);
  38.  
  39. NV_DISPLAY_DRIVER_MEMORY_INFO *PMemoryInfo;
  40. status=(*NvAPI_GPU_GetMemoryInfo)(gpuHandles[0],PMemoryInfo);
  41. int videomem=PMemoryInfo->systemVideoMemory ;
  42. Memo1->Lines->Add("Videomemory: "+IntToStr(videomem));


Выдает неправильные значения.




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 05 июня 2014 22:46 · Поправил: neomant
· Личное сообщение · #6

Если функция экспортируется, то GetProcAddress.
Если не экспортируется, привязываться к абсолютным адресам не стоит, ASLR.
Вместо этого ищем смещение функции относительно базы и суммируем с хендлом библиотеки. Желательно ещё проверить версию библиотеки.

-----
Следуй за белым кроликом




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 06 июня 2014 04:00 · Поправил: dosprog
· Личное сообщение · #7

ArchiStenton,

а где в памяти у вас расположена эта структура NV_DISPLAY_DRIVER_MEMORY_INFO?
Куда указывает <PMemoryInfo> ?

У меня нет ни такой карты, ни установленных драйверов для неё.
Вот, проверьте у себя, будет ли работать вот это 7a60_06.06.2014_EXELAB.rU.tgz - NV_TEST.RAR





Ранг: 8.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2014 13:44
· Личное сообщение · #8

Вот тут написано,как из LIB файла эти адреса достать:
http://stackoverflow.com/questions/13291783/how-to-get-the-id-memory-address-of-dll-function

А насчет nvapi.dll я честно говоря всё-равно не понимаю. Куда нажимать в IDA Pro ,чтобы увидеть "магические циферки"?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 11 июня 2014 15:06 · Поправил: Veliant
· Личное сообщение · #9

Если откроете NVAPI.dll в любом hex-редакторе или дизассемблере, то увидите, что в начале секции .data идет большой массив из структур вида
Code:
  1. typedef struct {
  2.   LPVOID lpFunction;
  3.   DWORD dwMagic;
  4. };

Поэтому можно даже без экспорта искать в памяти dll нужный dword и получать адрес соответствующей ему функции

Дальше открываем Lib файл и смотрим все вызовы queryinterface, и в некоторых случаях имеем связку DWORD=имя


-------------
В аттаче список функций


5b32_11.06.2014_EXELAB.rU.tgz - funcs.txt



Ранг: 8.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2014 19:06
· Личное сообщение · #10

Ну там не все функции. Вот этой например нет:
NvAPI_GPU_GetCoolerSettings, адрес 0хDA141340

А для чего разработчик прячет это всё, какой смысл в этом? Есть же официальный nvapi.h , почему-то кастрированный на 60-70%, а оказывается можно и без него обойтись.

И самый главный вопрос, если функция приватная, ну допустим нашел я её адрес. А прототип где взять,аргументы? Если в хидере ничего нет...



Ранг: 50.0 (постоянный), 31thx
Активность: 0.090.1
Статус: Участник

Создано: 11 июня 2014 19:39
· Личное сообщение · #11

ArchiStenton пишет:
А прототип где взять,аргументы? Если в хидере ничего нет...

Тут надо следовать чОткому правилу - никогда не дизасмить функу, это может дать ненеужное и неверное представление о числе и типе параметров. Только хардкор, только брутфорс - по эксепшнам и резалту поймешь чего ждет и хочет функа. Это путь истенного обивана.

| Сообщение посчитали полезным: dosprog, 2nd
 eXeL@B —› Программирование —› Как получить список и адреса функций типа 0x0150E828 из откомпилированного DLL
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати