qq_36796524 2017-06-12 09:21 采纳率: 0%
浏览 2725

怎么看一个dll里的所有函数?

类似看符号表那样。那个depends工具似乎只能看得到导出的函数?

  • 写回答

1条回答 默认 最新

  • shenyun583444254 2017-06-12 09:29
    关注

    //建立一个vc6.0中建立一个win32console工程,打入如下代码.我在我的电脑上测试通过了.
    #include "stdafx.h"
    #include
    #include
    #include
    #include
    #include
    typedef PVOID (CALLBACK* PFNEXPORTFUNC)(PIMAGE_NT_HEADERS,PVOID,ULONG,PIMAGE_SECTION_HEADER*);
    void printAllFuncName(char* fileName);//打印所有函数名称的函数声明
    int main(int argc,char* argv[])
    {
    printAllFuncName("F:\gdi32.dll");//打印gdi32.dll中所有函数名称,要打印别的dll中的函数,只要改变这个字符串.
    getchar();
    return 0;
    }
    void printAllFuncName(char* fileName){
    LPWIN32_FIND_DATA lpwfd_first=new WIN32_FIND_DATA;//接受findfirstfile的结构指针
    HANDLE hFile,hFileMap;//文件句柄和内存映射文件句柄
    DWORD fileAttrib=0;//存储文件属性用,在createfile中用到.
    void* mod_base;//内存映射文件的起始地址,也是模块的起始地址
    //首先取得ImageRvaToVa函数本来只要#include 就可以使用这个函数,但是我的vc没有这个头文件
    PFNEXPORTFUNC ImageRvaToVax=NULL;
    HMODULE hModule=::LoadLibrary("DbgHelp.dll");
    if(hModule!=NULL){
    ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hModule,"ImageRvaToVa");
    if(ImageRvaToVax==NULL){
    ::FreeLibrary(hModule);
    printf("取得函数失败\n");
    return ;
    }
    }else{
    printf("加载模块失败\n");
    return ;
    }
    if(FindFirstFile(fileName,lpwfd_first)==NULL){//返回值为NULL,则文件不存在,退出
    printf("文件不存在:%s ",fileName);
    return ;
    }else{
    DWORD fileAttrib=lpwfd_first->dwFileAttributes;
    }
    hFile=CreateFile(fileName,GENERIC_READ,0,0,OPEN_EXISTING,fileAttrib,0);
    if(hFile==INVALID_HANDLE_VALUE){
    printf("打开文件出错!");
    return ;
    }
    hFileMap=CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
    if(hFileMap==NULL){
    CloseHandle(hFile);
    printf("建立内存映射文件出错!");
    return ;
    }
    mod_base=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
    if (mod_base==NULL)
    {
    printf("建立内存映射文件出错!");
    CloseHandle(hFileMap);
    CloseHandle(hFile);
    return ;
    }
    IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)mod_base;
    IMAGE_NT_HEADERS * pNtHeader =
    (IMAGE_NT_HEADERS )((BYTE)mod_base+ pDosHeader->e_lfanew);//得到NT头首址
    //IMAGE_NT_HEADERS * pNtHeader =ImageNtHeader (mod_base);
    IMAGE_OPTIONAL_HEADER * pOptHeader =
    (IMAGE_OPTIONAL_HEADER )((BYTE)mod_base + pDosHeader->e_lfanew + 24);//optional头首址
    IMAGE_EXPORT_DIRECTORY* pExportDesc = (IMAGE_EXPORT_DIRECTORY*)ImageRvaToVax(pNtHeader,mod_base,pOptHeader->DataDirectory[0].VirtualAddress,0);
    //导出表首址
    PDWORD nameAddr=(PDWORD)ImageRvaToVax(pNtHeader,mod_base,pExportDesc->AddressOfNames,0);//函数名称表首地址每个DWORD代表一个函数名字字符串的地址
    PCHAR func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[0],0);
    DWORD i=0;
    DWORD unti=pExportDesc->NumberOfNames;
    for(i=0;i

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题