首页 > 其他分享 >mingw下 解析dll中全局函数

mingw下 解析dll中全局函数

时间:2024-07-16 11:19:32浏览次数:14  
标签:txt temp dll ofs mingw 解析 open

ULONG systemGetVarName(const string &userLib){
    if(ofs.is_open())
    {
        ofs.close();
    }
    ofs.open("d:\\log\\symbolTable.txt", ios::out);
    if(!ofs.is_open())
    {
        printf"pp.txt file open err\n");
        return 1;
    }
    ofs<<"address                  "<<"name"<<std::endl;
    DWORD64 address = 0;
    HANDLE hProcess = GetCurrentProcess();
    // HANDLE hThread = GetCurrentThread();

    BOOL bret = SymInitialize(hProcess,NULL,FALSE);
    if(!bret){
        ATE_LOG(ERR,"SymInitialize fail\n");
        return 2;
    }

    TCHAR szImageName[MAX_PATH];

#ifdef UNICODE
    _snprintf_s(szImageName, userLib.length(), "%S", userLib.c_str());
#else
    _snprintf_s(szImageName, userLib.length(), "%s", userLib.c_str());
#endif

    //DWORD64 dwBaseAddr = 0;

    address = SymLoadModuleEx(hProcess,    // target process
                        NULL,        // handle to image - not used
                        szImageName, // name of image file
                        NULL,        // name of module - not required
                        (DWORD64)m_hUserLibHandle,  // base address - not required
                        0,           // size of image - not required
                        NULL,        // MODLOAD_DATA used for special cases
                        0);
    if (!address)          // flags - not required
    {
        // SymLoadModuleEx failed
        DWORD error = GetLastError();
        ATE_LOG(ERR,"SymLoadModuleEx returned error : %d\n", error);
        return PROJECT_LOAD_DLL_FAILED;
    }
    bret = SymEnumSymbols(hProcess,address,"*",EnumSymCallBack,NULL);
    if(!bret)
    {
        SymCleanup(hProcess);
        ATE_LOG(ERR,"SymEnumSymbols fail\n");
        return PROJECT_LOAD_DLL_FAILED;
    }
    if(isObjectNameDuplicate)
    {
        isObjectNameDuplicate = false;
        SymCleanup(hProcess);
        return PROJECT_LOAD_DLL_FAILED;
    }
    SymCleanup(hProcess);
    return E_OK;
}
BOOL EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{
    ofs<<hex<<pSymInfo->Address<<"                  "<<pSymInfo->Name<<std::endl;
   
    try
    {
        std::string temp = pSymInfo->Name;
        if(temp.size() && temp[0] != '_')
        {
            temp = "_"+temp;
        }
       
        int status;
        char *demangled =  abi::__cxa_demangle(temp.c_str(), NULL, NULL, &status);
        if(demangled)
        {
        // 可以被解析的函数
            ofs<< temp << " -> " << demangled << " " << status <<  std::endl;
            free(demangled);
        }else
        {
// 全局变量和c函数不会被解析
            ofs<<"func: " <<  pSymInfo->Name << " -> " << (uint64_t)pSymInfo->Address << std::endl;
        }
        
    }catch(...)
    {
        std::cout << "catch:" << std::endl;
    }
    
    return TRUE;
}                

 

标签:txt,temp,dll,ofs,mingw,解析,open
From: https://www.cnblogs.com/a9999/p/18304785

相关文章

  • Vue.js:如何区分页面关闭和刷新?深入解析与实战
    Vue.js:如何区分页面关闭和刷新?深入解析与实战在开发基于Vue.js的单页应用(SPA)时,我们经常需要处理用户关闭浏览器标签页或刷新页面的情况。虽然这两种操作看似相似,但在某些业务场景中,我们需要对它们进行区分并做出不同的响应。那么,如何在Vue.js中实现这一点呢?本文将带你深入探讨这......
  • 载均衡技术全解析:Pulsar 分布式系统的最佳实践
    背景Pulsar有提供一个查询Broker负载的接口:/***Getloadforthisbroker.**@return*@throwsPulsarAdminException*/LoadManagerReportgetLoadReport()throwsPulsarAdminException;publicinterfaceLoadManagerReportextends......
  • 所有环比与同比(详细解析)
    环比与同比环比是相邻两期数据进行比较,同比是历史同期数据进行比较。同比=(本期数-同期数)/同期数=本期数/同期数-1环比=(本期数-上期数)/上期数=本期数/上期数-11)年环比(Year-over-Year,YoY)=年同比(Year-on-Year,YoY)年环比是用来比较相同月份或季度在不同年份......
  • Lazarus 将LNET封装到DLL中
    最近工作中有个要求SOCKET的功能,想将一个通信功能做得简单一点。发现LNET非常方便,所以对它研究了一下。LNET有两种类型,可视化和非可视化。做WINDOWS下一般都是用可视化的。用于LINUX和WINCE,必须用非可视化的。我要将它封装成DLL的话,必须用非可视化的。DLL代码如下:librarypro......
  • 通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制
    前言前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。TLV数据之协议解析紧着上......
  • 修复《NBA 2K23》“vcruntime140.dll“ 缺失:全面恢复指南
    在尝试运行备受期待的篮球模拟游戏《NBA2K23》时,不少玩家遇到了一个令人沮丧的问题:“vcruntime140.dll”文件丢失。这个动态链接库(DLL)文件是VisualC++Redistributable的一部分,对于许多基于Windows的应用程序来说至关重要。本文将指导你如何快速、有效地解决这个问题,让你能够......
  • VINS-Fusion源码逐行解析:updateLatestStates()函数与slideWindow()
    初始化并优化位姿后,接下来做的事是将这些位姿更新给上一帧,我们来看下updateLatestStates()源码:voidEstimator::updateLatestStates(){//锁定mPropagate,确保对最新状态的更新是线程安全的mPropagate.lock();//更新最新的时间戳,等于当前帧的时间戳加上时间延......
  • JavaScript全解析——本地存储✔(localStorage~sessionStorage~cookie)
    ●就是浏览器给我们提供的可以让我们在浏览器上保存一些数据●常用的本地存储(localStorage~sessionStorage~cookie)1-localStorage=>特点:->长期存储,除非手动删除否则会一直保存在浏览器中清除缓存或者卸载浏览器也就没有了->可以跨页面通讯,也就是说在一个页面写下......
  • Redis深度解析:从基础到高级特性,剖析关键技术
    一、关于RedisRedis介绍REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统,是跨平台的非关系型数据库。Redis是一个开源的使用ANSIC语言编写、遵守BSD(开源协议)协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value......
  • 2. DRF 解析器
    目录DjangoDRF解析器1.解析器作用2.使用解析器默认配置为视图类定义解析器修改全局配置DjangoDRF解析器1.解析器作用request请求先进到APIView的dispatch方法,如果有异常走到exception。Json请求www-form请求form-data请求可以看到不同类型的请求,request.data......