在知道dll的路径和要调用的倒出函数名称的情况下,我想知道这个函数的返回值等类型信息(参数类型等),哪位高手能出手。
多谢多谢了!!! 100分不够再加!

解决方案 »

  1.   

    一般情况下很难的。不过可以用一些调试、反汇编的手段。现在使用W32DSM来具体说明:
    1。先打开需要分析的DLL,然后通过菜单功能-》出口来找到需要分析的函数,双击就可以了。
    它可以直接定位到该函数。
    2。看准该函数的入口,一般函数是以以下代码作为入口点的。
    push ebp
    mov ebp, esp
    ...
    3。然后往下找到该函数的出口,一般函数出口有以下语句。
    ...
    ret xxxx;//其中xxxx就是函数差数的所有的字节数,为4的倍数,xxxx除以4得到的结果
    就是参数的个数。
    其中参数存放的地方:
    ebp+08 //第一个参数
    ebp+0C //第二个参数
    ebp+10 //第三个参数
    ebp+14 //第四个参数
    ebp+18 //第五个参数
    ebp+1C //第六个参数

    -------------------------------------------
    还有一种经常看到的调用方式:
    sub esp,xxxx //开头部分
    //函数的内容

    //函数的内容
    add esp,xxxx
    ret //结尾部分
    其中xxxx/4的结果也是参数的个数。 
    -------------------------------------------------
    还有一种调用方式:
    有于该函数比较简单,没有参数的压栈过程,
    里面的
    esp+04就是第一个参数
    esp+08就是第二个参数

    esp+xx就是第xx/4个参数
    你说看到的xx的最大数除以4后的结果,就是该函数所传递的参数的个数
      

  2.   

    具体可以参考:http://vip.6to23.com/NowCan1/tech/dll_crk.htm
    另外有一个水木清华的帖子:
    以下内容只适合COM进程内组件,对于普通DLL,从函数名通常无法看出参数类型。 
        DLL函数内部记录格式初探(针对COM进程内组件) 
        某接口定义如下: 
        class IAdTran: public IUnKnown 
        { 
         public: 
         virtual HRESULT Initialize(void)=0; // Func1 
         virtual HRESULT InitializeTrace(ITrace* pTrace)=0; // Func2 
         virtual HRESULT GetDestAddress(CsmStatus* pCsm)=0; // Func3 
         virtual HRESULT ReloadDB(void)=0; // Func4 
         virtual ULONG GetEntryCount(void)=0; // Func5 
         virtual void DeleteEntry(TranTblEntry* pEntry)=0; // Func6 
         virtual void AddEntry(TranTblEntry* pEntry)=0; // Func7 
         virtual BOOL QueryEntry(UINT nItem,TranTblEntry* pEntry)=0; // Func8 
        } 
        在组件中的内在表现形式:(注意:在dll中自动按字母顺序排列了) 
        0001 ?AddEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z 
        0002 ?DeleteEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z 
        0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z 
        0004 ?GetEntryCount@CAdTran@@UAEKXZ 
        0005 ?Initialize@CAdTran@@UAEJXZ 
        0006 ?InitializeTrace@CAdTran@@UAEJPAVITrace@@@Z 
        0007 ?QueryEntry@CAdTran@@UAEHIPAUtranTblEntry@@@Z 
        0008 ?ReloadDB@CAdTran@@UAEJXZ 
        0009 ?QueryEntry@CAdTran@@UAEKKPAUCsmStat@@@Z 
        分析一:(注:本处有些具体的尝试对比的过程省掉了) 
        (1) 参数记录格式 
         @this @@UAExxxx@@@Z (i) 
         @this @@UAExxxxXZ (ii) 
        对于参数列表为空(仅含this指针)的成员函数如Func1,Func4,Func5,参数记录格式采用 
        (ii). 
        (注意:@@前导串可能有多个,具体数目规则见后) 
        (2) 成员函数的参数/返回值均在@@引导串中描述,分析后的结果如下: 
         (i) @@UAE为固定前导串,引导后面的参数描述符,具体记录顺序为返回值,参数1,参数 
        2... 
         (ii)参数描述符与数据类型对照表 
         +++++++++++++++++++++++++++++++++ 
         | 参数描述符 | 数据类型 | 
         +++++++++++++++++++++++++++++++++ 
         | D | char | 
         +---------------+---------------+ 
         | E | UCHAR | 
         +---------------+---------------+ 
         | F | short | 
         +---------------+---------------+ 
         | G | USHORT | 
         +---------------+---------------+ 
         | H | int | 
         +---------------+---------------+ 
         | I | UINT | 
         +---------------+---------------+ 
         | J | long | 
         +---------------+---------------+ 
         | K | ULONG | 
         +---------------+---------------+ 
         | M | float | 
         +---------------+---------------+ 
         | N | double | 
         +---------------+---------------+ 
         | X | void | 
         +---------------+---------------+ 
         | _N | bool | 
         +---------------+---------------+ 
         | W4 | enum | 
         +---------------+---------------+ 
         | U | class/struct | 
         +---------------+---------------+ 
         | V | Interface | 
         +---------------+---------------+ 
         | PA | pointer | 
         +---------------+---------------+ 
         | Z | 终止符 | 
         +---------------+---------------+ 
         (注:bool在VC5.0之前定义为int,之后作为内建类型,占一个byte) 
         (iii)实例分析 
         分析一:0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z 
         @CAdTran this指针(隐含) 
         @@UAE 参数列表符前导 
         JPAUCsmStat 参数串 
         J-->long 即返回值为long型 
         PA 引导指针 
         U 引导类/结构 
         CsmStat 类/结构名 
         PAUCsmStat 类/结构CsmStat的指针 
         @@@Z 参数列表终结 
         
         分析二:0004 ?GetEntryCount@CAdTran@@UAEKXZ 
         @CAdTran this指针(隐含) 
         @@UAE 参数列表符前导 
         KX 参数串 
         K-->ULONG 即返回值为ULONG型 
         X-->void 即参数为空 
         Z 参数列表终结 
         (iv)多@@引导串 
         在实际分析中可能会碰到多个@@引导串的情况,具体分析与上面一样,不过就是只有第 
        一个@@引导会 
        有UAE前导(或者从另一个角度看,可以视UAE为返回值的前导串)。 
         (v)进一步的工作 
        通过上面的分析我们就可以有二进制的dll文件构造出函数声明,但是函数参数/返回值中的类/结构/接口的直接定义却还无法获得,进一步的分析还望各位大虾出手了。鄙人先扔点砖块,希望 能砸出几块宝玉来。 
        (对类/结构/接口的定义分析可能Debug版较容易入手,附带信息较多嘛!) 
      

  3.   

    我总觉得有相应的API函数可以查的,比如说某某dll的所有函数的定义都可以提取出来,如何提取呢?这样我就相当于匹配查找一样把要得到参数类型的导出函数的定义,真的没有想到会这么麻烦,大侠们费心了,不过我还是希望能找到什么更好的办法,再次谢过,我会一起给分的:)3x!
      

  4.   

    如果是要得到API 的原型是很简单的,在你输入函数名时候,背景提示就会显示这些东西。
    我现在也遇到了差不多的问题,我是想由导出序数得到导出函数名,也没人帮我,哎!
      

  5.   

    但是我是想在程序中动态链接时(loadlibrary(),getProcAddress())想要获取导入的函数的原型信息,而且我要根据这个原型信息作出接下来的处理,不知大侠们明白我的意思了没有:) 谢谢了!
      

  6.   

    只能反汇编。
    to c0der() :ebp是函数堆栈帧的开始,加上一个偏移量的话应该是调用函数的参数吧?
      

  7.   

    (ZT:)
    C++编译时函数名修饰约定规则:__stdcall调用约定:1、以"?"标识函数名的开始,后跟函数名;2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;3、参数表以代号表示:X--void ,D--char,E--unsigned char,F--short,H--int,I--unsigned int,J--long,K--unsigned long,M--float,N--double,_N--bool,....PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前; 5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如          int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
              void Test2()                       -----“?Test2@@YGXXZ”__cdecl调用约定:规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。__fastcall调用约定:规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用.
      

  8.   

    PVOID ImageDirectoryEntryToData(
      IN LPVOID Base,            
      IN BOOLEAN MappedAsImage,  
      IN USHORT DirectoryEntry,  
      OUT PULONG Size            
    );
    (imagehlp.h,库文件:imagehlp.lib)
    该函数用来查询一个DLL的输出节来查找导出的符号。
    自己看MSDN吧:
    ImageDirectoryEntryToData
    The ImageDirectoryEntryToData function obtains access to image-specific data.PVOID ImageDirectoryEntryToData(
      IN LPVOID Base,            
      IN BOOLEAN MappedAsImage,  
      IN USHORT DirectoryEntry,  
      OUT PULONG Size            
    );
     
    Parameters
    Base 
    Specifies the base address of the image. 
    MappedAsImage 
    Specifies how the image is mapped. If this flag is TRUE, the image is mapped by the system loader. If the flag is FALSE, the file is mapped by a call to the MapViewOfFile function. 
    DirectoryEntry 
    Specifies the index number of the desired directory entry. The value must be one of the following: Value Meaning 
    IMAGE_DIRECTORY_ENTRY_EXPORT Export directory 
    IMAGE_DIRECTORY_ENTRY_IMPORT Import directory 
    IMAGE_DIRECTORY_ENTRY_RESOURCE Resource directory 
    IMAGE_DIRECTORY_ENTRY_EXCEPTION Exception directory 
    IMAGE_DIRECTORY_ENTRY_SECURITY Security directory 
    IMAGE_DIRECTORY_ENTRY_BASERELOC Base relocation table 
    IMAGE_DIRECTORY_ENTRY_DEBUG Debug directory 
    IMAGE_DIRECTORY_ENTRY_COPYRIGHT  
    IMAGE_DIRECTORY_ENTRY_GLOBALPTR RVA of global pointer 
    IMAGE_DIRECTORY_ENTRY_TLS thread local storage directory 
    IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG Load configuration directory 
    IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT Bound import directory 
    IMAGE_DIRECTORY_ENTRY_IAT Import address table 
    Size 
    Specifies the size of the desired directory entry's data. 
    Return Values
    If the function succeeds, the return value is a pointer to the directory entry's data.If the function fails, the return value is NULL. To retrieve extended error information, call GetLastError.Res
    The ImageDirectoryEntryToData function is used to obtain access to image-specific data.QuickInfo
      Windows NT: Requires version 4.0 or later.
      Windows: Requires Windows 95 or later. Available as a redistributable for Windows 95.
      Windows CE: Unsupported.
      Header: Declared in imagehlp.h.
      Import Library: Use imagehlp.lib.
      

  9.   

    to adamchao :vc工具 depends 可以直接看dll的所有导出函数的名称