Импорт функции из dll

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
pots
Сообщения: 43
Зарегистрирован: 14 июн 2006, 14:18

14 июн 2006, 14:29

Здравствуйте
Ситуация следующая
Есть dll библиотека, из нее необходимо достать только 1 функцию, но к сожалению нет ее прототипа, можно ли как-нить его вырыть из длл?
Буду очень признателен за совет :)
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

14 июн 2006, 17:46

Имя функции - легко, а вот набор/тип параметров - видимо, нет.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

20 июн 2006, 21:16

Прототип функции из dll не достать. Если это не COM.
Впрочем, если исходный язык поддерживает т.н. name mangling (С++) - шансы есть :)
psix
Сообщения: 52
Зарегистрирован: 29 июл 2004, 13:53
Откуда: Россия, Москва
Контактная информация:

31 июл 2006, 21:33

Чтобы определить число параметров следует воспользоваться отладчиком и/или дизассемблером.
Ida Pro например справляется на ура.
lkurts
Сообщения: 1
Зарегистрирован: 22 дек 2006, 19:35
Контактная информация:

22 дек 2006, 21:03

&quot писал(а):Прототип функции из dll не достать. Если это не COM.
Впрочем, если исходный язык поддерживает т.н. name mangling (С++) - шансы есть
Ещё как есть. Для MS компиляторов - пример небольшой программки, которая "деманглит" декорированное имя функции:

Код: Выделить всё

#include <stdlib.h>
#include <iostream>

typedef void *(*MallocFuncT)(size_t);
typedef void (*FreeFuncT)(void *);


//определение - в msvcrt и тп. либах
extern "C"  
{
  char* __unDName(
    char * OutStr, 
    const char* mangled, 
    int OutStrLen, 
    MallocFuncT, 
    FreeFuncT, 
    unsigned short int flags);
}


int main()
{
  char buf[10000];
  __unDName(buf, "??$TemplFooo@H@@YAXXZ", 10000, malloc, free, 0);
  std::cout <<buf;
}

Взято тут: http://www.rsdn.ru/forum/?mid=759659


А вот ещё немного инфы по этому поводу:

Код: Выделить всё

--- wine/dlls/msvcrt/main.c	2004-01-07 07:36:19.000000000 +0100
+++ mywine/dlls/msvcrt/main.c	2004-01-13 19:15:00.000000000 +0100
@@ -123,30 +123,32 @@
 }
 
 /*********************************************************************
- *		__unDName (MSVCRT.@)
+ *		__unDNameEx (MSVCRT.@)
  *
  * Demangle a C++ identifier.
  *
  * PARAMS
- *  unknown  [I] Not yet determined
+ *  OutStr   [O] If not NULL, the place to put the demangled string
  *  mangled  [I] Mangled name of the function
- *  unknown2 [I] Not yet determined
+ *  OutStrLen[I] Length of OutStr
  *  memget   [I] Function to allocate memory with
  *  memfree  [I] Function to free memory with
+ *  unknown  [?] Unknown, possibly a call back
  *  flags    [I] Flags determining demangled format
  *
  * RETURNS
  *  Success: A string pointing to the unmangled name, allocated with memget.
  *  Failure: NULL.
  */
-char* MSVCRT___unDName(int unknown, const char* mangled, int unknown2,
+char* MSVCRT___unDNameEx(char * OutStr, const char* mangled, int OutStrLen,
                        MSVCRT_malloc_func memget,
                        MSVCRT_free_func memfree,
-                       unsigned int flags)
+                       void * unknown,
+                       unsigned short int flags)
 {
-  char* ret;
-
-  FIXME("(%d,%s,%d,%p,%p,%x) stub!\n", unknown, mangled, unknown2, memget, memfree, flags);
+static int ctr;
+  FIXME("(%p,%s,%d,%p,%p,%p,%x) stub!\n",
+          OutStr, mangled, OutStrLen, memget, memfree, unknown, flags);
 
   /* FIXME: The code in tools/winebuild/msmangle.c is pretty complete and
    * could be used here.
@@ -164,17 +166,23 @@
    * 0x2000 - Unknown, passed by type_info::name()
    */
   /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
-  ret = memget(strlen(mangled) + 1);
-  strcpy(ret, mangled);
-  return ret;
+  if( OutStr == NULL) {
+      OutStrLen = strlen(mangled) + 1;
+      OutStr = memget( OutStrLen);
+  }
+  strncpy( OutStr, mangled, OutStrLen);
+  return OutStr;
 }
 
 
 /*********************************************************************
- *		__unDNameEx (MSVCRT.@)
- * Function not really understood but needed to make the DLL work
+ *		__unDName (MSVCRT.@)
  */
-char* MSVCRT___unDNameEx(void)
+char* MSVCRT___unDName(char * OutStr, const char* mangled, int OutStrLen,
+                       MSVCRT_malloc_func memget,
+                       MSVCRT_free_func memfree,
+                       unsigned short int flags)
 {
-   return NULL;
+   return MSVCRT___unDNameEx( OutStr, mangled, OutStrLen, memget, memfree,
+           NULL, flags);
 }
--- wine/dlls/msvcrt/msvcrt.spec	2004-01-13 09:23:08.000000000 +0100
+++ mywine/dlls/msvcrt/msvcrt.spec	2004-01-13 14:52:17.000000000 +0100
@@ -137,8 +137,8 @@
 @ cdecl __threadhandle() kernel32.GetCurrentThread
 @ cdecl __threadid() kernel32.GetCurrentThreadId
 @ cdecl __toascii(long) MSVCRT___toascii
-@ cdecl __unDName(long str ptr ptr long) MSVCRT___unDName
-@ cdecl __unDNameEx() MSVCRT___unDNameEx #FIXME
+@ cdecl __unDName(str str long ptr ptr long) MSVCRT___unDName
+@ cdecl __unDNameEx(str str long ptr ptr ptr long) MSVCRT___unDNameEx
 @ extern __unguarded_readlc_active MSVCRT___unguarded_readlc_active
 @ extern __wargv MSVCRT___wargv
 @ cdecl __wgetmainargs(ptr ptr ptr long ptr)
--- wine/dlls/msvcrt/msvcrt.h	2004-01-13 09:23:08.000000000 +0100
+++ mywine/dlls/msvcrt/msvcrt.h	2004-01-13 14:45:29.000000000 +0100
@@ -75,7 +75,8 @@
 typedef void* (*MSVCRT_malloc_func)(MSVCRT_size_t);
 typedef void (*MSVCRT_free_func)(void*);
 
-extern char* MSVCRT___unDName(int,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,unsigned int);
+extern char* MSVCRT___unDName(char *,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,unsigned short int);
+extern char* MSVCRT___unDNameEx(char *,const char*,int,MSVCRT_malloc_func,MSVCRT_free_func,void *,unsigned short int);
 
 /* Setup and teardown multi threaded locks */
 extern void msvcrt_init_mt_locks(void);



pots
Сообщения: 43
Зарегистрирован: 14 июн 2006, 14:18

28 дек 2006, 16:36

оо, спасибо :)
а то как то запустил уже эту траблу
придется вернуться :)
Ответить