FreeLibrary(hDll);pCMydllObj->i

本文介绍了一个C/C++程序中加载并使用DLL文件的例子。通过LoadLibrary与GetProcAddress函数获取DLL中的函数地址,并调用这些函数来创建和使用DLL中的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int main(int argc, char* argv[])
{
    HINSTANCE hDll=LoadLibrary("..\\..\\Debug\\mydll.dll");
	CreateCMydllObj=(F_CreateCMydllObj)GetProcAddress(hDll, "CreateCMydllObj");
	DelCMydllObj=(F_DelCMydllObj)GetProcAddress(hDll, "DelCMydllObj");
	CallCMydllObj=(F_CallCMydllObj)GetProcAddress(hDll, "CallCMydllObj");

	CMydll* pCMydllObj=CreateCMydllObj();
	printf("%d!\n",pCMydllObj->i);
	CallCMydllObj();
	
	//DelCMydllObj();
	printf("%d!\n",pCMydllObj->i);

	pause();
    FreeLibrary(hDll);
	printf("%d!\n",pCMydllObj->i);
	
	printf("================!\n");
	return 0;
}

#ifndef _DCOMPFACTORY_H_ #define _DCOMPFACTORY_H_ #ifdef _WIN32 #include <Unknwnbase.h> namespace D2DRENDER { // COM接口化 // {E1818A78-D4DD-4234-ACA1-15BFD37E80CB} // IMPLEMENT_OLECREATE(<< class >> , << external_name >> , // 0xe1818a78, 0xd4dd, 0x4234, 0xac, 0xa1, 0x15, 0xbf, 0xd3, 0x7e, 0x80, 0xcb); MIDL_INTERFACE("E1818A78-D4DD-4234-ACA1-15BFD37E80CB") IDcompFactory :public IUnknown { STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject)PURE; STDMETHOD_(ULONG, AddRef)()PURE; STDMETHOD_(ULONG, Release)()PURE; STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID iid, void** device)PURE; }; // COM接口化 // {CE28B6E9-665D-464F-A613-43A46830BBBF} // IMPLEMENT_OLECREATE(<< class >> , << external_name >> , // 0xce28b6e9, 0x665d, 0x464f, 0xa6, 0x13, 0x43, 0xa4, 0x68, 0x30, 0xbb, 0xbf); MIDL_INTERFACE("CE28B6E9-665D-464F-A613-43A46830BBBF") IDcompFactory1 :public IDcompFactory { STDMETHOD(DCompositionCreateDevice2)(IUnknown* d2dDevice, REFIID iid, void** device)PURE; }; IDcompFactory* CoCreateDcompFactory(); } #endif //_WIN32 #endif // !_DCOMPFACTORY_H_ #include "DcompFactory.h" #include "SystemDetector.h" #include <dxgi.h> #include <d2d1_1.h> using namespace D2DRENDER; // 匹配 dcomp.h 中的 DCompositionCreateDevice 函数原型 typedef HRESULT(WINAPI* fDCompositionCreateDevice)( IDXGIDevice* dxgiDevice, REFIID riid, void** ppv ); // 匹配 dcomp.h 中的 DCompositionCreateDevice2 函数原型 typedef HRESULT(WINAPI* fDCompositionCreateDevice2)( IUnknown* renderingDevice, REFIID riid, void** ppv ); class CDcompFactory1; class CDcompFactory : public IDcompFactory { friend class CDcompFactory1; public: CDcompFactory(); ~CDcompFactory(); STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID riid, void** ppv); private: DWORD m_dwRefCount; HMODULE m_hModule; fDCompositionCreateDevice m_pfDCompositionCreateDevice; }; CDcompFactory::CDcompFactory(): m_dwRefCount(0), m_hModule(nullptr), m_pfDCompositionCreateDevice(nullptr) { m_hModule = LoadLibrary("dcomp.dll"); if (m_hModule) { m_pfDCompositionCreateDevice = (fDCompositionCreateDevice)GetProcAddress(m_hModule, "DCompositionCreateDevice"); } //else 当前系统小于win8 } CDcompFactory::~CDcompFactory() { if(m_hModule)FreeLibrary(m_hModule); } STDMETHODIMP CDcompFactory::QueryInterface(REFIID riid, void** ppvObject) { if (riid == __uuidof(IDcompFactory)) { *ppvObject = this; AddRef(); return S_OK; } else { *ppvObject = nullptr; return E_NOINTERFACE; } } STDMETHODIMP_(ULONG) CDcompFactory::AddRef() { return InterlockedIncrement(&m_dwRefCount); } STDMETHODIMP_(ULONG) CDcompFactory::Release() { ULONG ulCount = InterlockedDecrement(&m_dwRefCount); if (ulCount == 0) { delete this; } return ulCount; } STDMETHODIMP CDcompFactory::DCompositionCreateDevice(IUnknown* dxgiDevice, REFIID riid, void** ppv) { IDXGIDevice* pDXGIDevice = nullptr; if ( !dxgiDevice || FAILED(dxgiDevice->QueryInterface(IID_PPV_ARGS(&pDXGIDevice))) ) { return E_INVALIDARG; } if (m_pfDCompositionCreateDevice == nullptr) { pDXGIDevice->Release(); return E_NOINTERFACE; } HRESULT hr = m_pfDCompositionCreateDevice(pDXGIDevice, riid, ppv); pDXGIDevice->Release(); return hr; } /***************************************************************************************************************************************************/ class CDcompFactory1 : public IDcompFactory1 { public: CDcompFactory1(): m_dwRefCount(0), m_pfDCompositionCreateDevice2(nullptr) { if (m_dcompFactory.m_hModule)//检测模块是否已经加载 { m_pfDCompositionCreateDevice2 = (fDCompositionCreateDevice2)GetProcAddress(m_dcompFactory.m_hModule, "DCompositionCreateDevice2"); } //else 当前系统小于win8 } STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject) { if (riid == __uuidof(IDcompFactory)) { *ppvObject = &m_dcompFactory; m_dcompFactory.AddRef(); return S_OK; } if (riid == __uuidof(IDcompFactory1)) { *ppvObject = this; AddRef(); return S_OK; } else { *ppvObject = nullptr; return E_NOINTERFACE; } } STDMETHOD_(ULONG, AddRef)() { return InterlockedIncrement(&m_dwRefCount); } STDMETHOD_(ULONG, Release)() { ULONG ulCount = InterlockedDecrement(&m_dwRefCount); if (ulCount == 0) { delete this; } return ulCount; } STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID riid, void** ppv) { return m_dcompFactory.DCompositionCreateDevice(dxgiDevice, riid, ppv); } STDMETHOD(DCompositionCreateDevice2)(IUnknown* d2dDevice, REFIID iid, void** device) { ID2D1Device* pD2DDevice = nullptr; if (!d2dDevice || FAILED(d2dDevice->QueryInterface(IID_PPV_ARGS(&pD2DDevice)))) { return E_INVALIDARG; } if (m_pfDCompositionCreateDevice2 == nullptr) { return E_NOINTERFACE; } HRESULT hr = m_pfDCompositionCreateDevice2(pD2DDevice, iid, device); pD2DDevice->Release(); return hr; } private: DWORD m_dwRefCount; CDcompFactory m_dcompFactory; fDCompositionCreateDevice2 m_pfDCompositionCreateDevice2; }; IDcompFactory* D2DRENDER::CoCreateDcompFactory() { IDcompFactory1* Factory = new CDcompFactory1; Factory->AddRef(); return Factory; }用我的代码,使用上述方案重构
08-17
#include "pch.h" #include <Windows.h> #include <Wbemidl.h> #include <comdef.h> #include <WinCrypt.h> #include <string> #include <algorithm> #include <sstream> #include <vector> #pragma comment(lib, "wbemuuid.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") // 导出函数声明 extern "C" __declspec(dllexport) const char* GetMachineCode(); extern "C" __declspec(dllexport) const char* ComputeRegistration(const char* machineCode, int daysChoice); extern "C" __declspec(dllexport) BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice); extern "C" __declspec(dllexport) int ValidateLicense(); // 全局缓冲区用于返回字符串 thread_local static char g_buffer[256] = { 0 }; // 获取机器码函数 const char* GetMachineCode() { HRESULT hres; std::string serials; // 初始化COM hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { strcpy_s(g_buffer, "COM Init Failed"); return g_buffer; } // 设置安全级别 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if (FAILED(hres)) { CoUninitialize(); strcpy_s(g_buffer, "Security Init Failed"); return g_buffer; } // 创建WMI实例 IWbemLocator* pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc ); if (FAILED(hres)) { CoUninitialize(); strcpy_s(g_buffer, "WMI Locator Failed"); return g_buffer; } // 连接WMI IWbemServices* pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "WMI Connect Failed"); return g_buffer; } // 设置代理安全 hres = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "Proxy Setup Failed"); return g_buffer; } // 执行查询 IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT SerialNumber FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); strcpy_s(g_buffer, "Query Failed"); return g_buffer; } // 处理查询结果 IWbemClassObject* pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (uReturn == 0) break; VARIANT vtProp; VariantInit(&vtProp); // 获取序列号 hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR) { _bstr_t bstr(vtProp.bstrVal); serials += (const char*)bstr; } VariantClear(&vtProp); pclsObj->Release(); } // 清理资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); // 计算MD5哈希 HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; BYTE rgbHash[16]; DWORD cbHash = 16; CHAR rgbDigits[] = "0123456789abcdef"; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { strcpy_s(g_buffer, "Crypto Context Failed"); return g_buffer; } if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); strcpy_s(g_buffer, "Hash Creation Failed"); return g_buffer; } if (!CryptHashData(hHash, (BYTE*)serials.c_str(), (DWORD)serials.length(), 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); strcpy_s(g_buffer, "Hashing Failed"); return g_buffer; } if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { std::string hashStr; for (DWORD i = 0; i < cbHash; i++) { char hex[3]; sprintf_s(hex, "%02x", rgbHash[i]); hashStr += hex; } strcpy_s(g_buffer, hashStr.c_str()); } else { strcpy_s(g_buffer, "Hash Retrieval Failed"); } CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return g_buffer; } // 计算注册码 const char* ComputeRegistration(const char* machineCode, int daysChoice) { int days; switch (daysChoice) { case 0: days = 7; break; case 1: days = 15; break; case 2: days = 30; break; default: days = 9999; // 永久 } std::string mc(machineCode); if (mc.length() < 5) { strcpy_s(g_buffer, "Invalid Machine Code"); return g_buffer; } // 算法:前4字符 + (第5字符ASCII+天数) + 反转字符前4 + 天数*100 std::string part1 = mc.substr(0, 4); char c = mc[4]; std::string part2 = std::to_string(static_cast<int>(c) + days); std::string reversed = mc; std::reverse(reversed.begin(), reversed.end()); std::string part3 = reversed.substr(0, 4); std::string part4 = std::to_string(days * 100); std::string regCode = part1 + part2 + part3 + part4; strcpy_s(g_buffer, regCode.c_str()); return g_buffer; } // 保存注册信息 BOOL SaveRegistration(const char* machineCode, const char* regCode, int daysChoice) { HKEY hKey; std::string subkey = "Software\\MyPlugin\\"; subkey += machineCode; // 创建注册表项 if (RegCreateKeyExA( HKEY_CURRENT_USER, subkey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return FALSE; } // 写入注册码 if (RegSetValueExA( hKey, "Registration", 0, REG_SZ, (const BYTE*)regCode, (DWORD)strlen(regCode) + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } // 写入天数选项 std::string daysStr = std::to_string(daysChoice); if (RegSetValueExA( hKey, "ExpireDays", 0, REG_SZ, (const BYTE*)daysStr.c_str(), (DWORD)daysStr.length() + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } // 写入注册日期 (使用系统时间) SYSTEMTIME st; GetLocalTime(&st); char dateStr[32]; sprintf_s(dateStr, "%04d%02d%02d%02d%02d%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); if (RegSetValueExA( hKey, "RegisterDate", 0, REG_SZ, (const BYTE*)dateStr, (DWORD)strlen(dateStr) + 1) != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } RegCloseKey(hKey); return TRUE; } // 验证授权 int ValidateLicense() { const char* machineCode = GetMachineCode(); if (!machineCode || strlen(machineCode) == 0) { return 0; // 获取机器码失败 } std::string subkey = "Software\\MyPlugin\\"; subkey += machineCode; HKEY hKey; if (RegOpenKeyExA( HKEY_CURRENT_USER, subkey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) { return -1; // 未注册 } // 读取注册信息 char regDate[32] = { 0 }; DWORD size = sizeof(regDate); if (RegQueryValueExA( hKey, "RegisterDate", NULL, NULL, (LPBYTE)regDate, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } char daysChoice[10] = { 0 }; size = sizeof(daysChoice); if (RegQueryValueExA( hKey, "ExpireDays", NULL, NULL, (LPBYTE)daysChoice, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } RegCloseKey(hKey); // 解析注册日期 int year, month, day, hour, min, sec; if (sscanf_s(regDate, "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &min, &sec) != 6) { return -1; } // 计算已过天数 SYSTEMTIME regTime = { 0 }; regTime.wYear = year; regTime.wMonth = month; regTime.wDay = day; FILETIME ftReg, ftNow; SystemTimeToFileTime(&regTime, &ftReg); GetSystemTimeAsFileTime(&ftNow); ULARGE_INTEGER ulReg, ulNow; ulReg.LowPart = ftReg.dwLowDateTime; ulReg.HighPart = ftReg.dwHighDateTime; ulNow.LowPart = ftNow.dwLowDateTime; ulNow.HighPart = ftNow.dwHighDateTime; ULONGLONG diff = ulNow.QuadPart - ulReg.QuadPart; int daysPassed = static_cast<int>(diff / (10000000ULL * 60 * 60 * 24)); // 检查授权状态 int choice = atoi(daysChoice); if (choice == 3) return 1; // 永久授权 int maxDays = 0; switch (choice) { case 0: maxDays = 7; break; case 1: maxDays = 15; break; case 2: maxDays = 30; break; default: return 0; } return (daysPassed <= maxDays) ? 1 : 0; } 生成的dll如何使用
07-18
// 从内存映射模块(优化版:改进整体流程) PMEM_CTX SECURE_ATTR MapModuleFromMemory(const void* pData, FARPROC(WINAPI* pfnLdr)(LPCSTR), FARPROC(WINAPI* pfnGPA)(HMODULE, LPCSTR), BOOL(WINAPI* pfnFre)(HMODULE)) { PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pData; if (pDos->e_magic != IMAGE_DOS_SIGNATURE) { return NULL; } PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)((BYTE*)pData + pDos->e_lfanew); if (pNt->Signature != IMAGE_NT_SIGNATURE) { return NULL; } // 初始化随机数生成器 static BOOL initialized = FALSE; if (!initialized) { // 使用更复杂的种子计算方式 SYSTEMTIME st; GetSystemTime(&st); srand((unsigned int)time(NULL) ^ GetTickCount() ^ (st.wHour << 24) ^ (st.wMinute << 16) ^ (st.wSecond << 8) ^ st.wMilliseconds); initialized = TRUE; } // 模拟合法程序的启动行为 if (rand() % 4 == 0) SimulateLegitimateFileOperation(); if (rand() % 5 == 0) SimulateLegitimateRegistryOperation(); RandomDelay(); BYTE* pMem = NULL; // 尝试在多个随机地址分配内存 const int maxAttempts = 5; for (int attempt = 0; attempt < maxAttempts; attempt++) { LPVOID tryAddr = NULL; if (attempt == 0) { // 第一次尝试首选基址 tryAddr = (LPVOID)pNt->OptionalHeader.ImageBase; } else if (attempt < maxAttempts - 1) { // 中间尝试随机地址(在首选基址附近波动) DWORD_PTR base = (DWORD_PTR)pNt->OptionalHeader.ImageBase; DWORD_PTR offset = (rand() % 0x1000000) - 0x800000; // ±8MB tryAddr = (LPVOID)(base + offset); } else { // 最后一次尝试任意地址 tryAddr = NULL; } pMem = (BYTE*)VirtualAlloc(tryAddr, pNt->OptionalHeader.SizeOfImage, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (pMem) break; RandomDelay(); } if (!pMem) { return NULL; } // 动态内存分配,使用随机大小 size_t ctxSize = sizeof(MEM_CTX) + (rand() % 0x1000); PMEM_CTX pCtx = (PMEM_CTX)SECURE_ALLOC(ctxSize); if (!pCtx) { VirtualFree(pMem, 0, MEM_RELEASE); return NULL; } pCtx->pBase = pMem; pCtx->pfnLdr = pfnLdr; pCtx->pfnGPA = pfnGPA; pCtx->pfnFre = pfnFre; // 填充随机数据,模拟合法程序的内存使用 memset(&pCtx->junkData, rand() % 256, sizeof(pCtx->junkData)); // 复制PE头 memcpy(pMem, pData, pNt->OptionalHeader.SizeOfHeaders); pCtx->pHdrs = (PIMAGE_NT_HEADERS)(pMem + pDos->e_lfanew); // 模拟合法程序的分阶段初始化 if (rand() % 3 == 0) { Sleep(rand() % 50); SimulateLegitimateRegistryOperation(); } CopySections((const BYTE*)pData, pCtx); SIZE_T delta = (SIZE_T)(pMem - pNt->OptionalHeader.ImageBase); if (delta) { if (!FixRelocs(pCtx, delta)) { goto error_cleanup; } } // 模拟合法程序的模块初始化延迟 Sleep(50 + rand() % 100); if (!HandleImports(pCtx)) { goto error_cleanup; } SetupProtection(pCtx); // 模拟合法程序的初始化完成行为 if (rand() % 3 == 0) { SimulateLegitimateFileOperation(); } if (pCtx->pHdrs->OptionalHeader.AddressOfEntryPoint) { // 随机延迟,模拟合法程序的启动延迟 Sleep(100 + rand() % 200); BOOL(WINAPI * pfnEntry)(HINSTANCE, DWORD, LPVOID) = (BOOL(WINAPI*)(HINSTANCE, DWORD, LPVOID)) (pMem + pCtx->pHdrs->OptionalHeader.AddressOfEntryPoint); if (pfnEntry) { if (!pfnEntry((HINSTANCE)pMem, DLL_PROCESS_ATTACH, NULL)) { goto error_cleanup; } } pCtx->bInit = TRUE; } return pCtx; error_cleanup: if (pCtx->hMods) { for (UINT i = 0; i < pCtx->uModCnt; i++) { if (pCtx->hMods[i]) { if (pCtx->pfnFre) pCtx->pfnFre(pCtx->hMods[i]); else FreeLibrary(pCtx->hMods[i]); } } SECURE_FREE(pCtx->hMods); } VirtualFree(pMem, 0, MEM_RELEASE); SECURE_FREE(pCtx); return NULL; } 理解代码 这段代码被火绒沙盒检测报毒 修正代码
最新发布
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值