WinAPI: GetProcAddress 自实现

本文档展示了如何使用汇编语言实现一个与系统API GetProcAddress功能类似的GetAPIAddr函数,该函数通过检查PE文件格式并遍历导出表来查找指定API的地址。

;***************************************************************************************** 
;const void* __stdcall GetAPIAddr(const void* hModule,const char* lpszProcName) 
;等价于 const void* __stdcall GetProcAddress(const void* hModule,const char* lpszProcName) 
;***************************************************************************************** 
GetAPIAddr: 
    push ebp
    mov ebp,esp
    pushad
    mov ebx,[ebp+8] 
    mov esi,[ebp+12] 
 
    ;检查是否是有效的 PE 文件格式 
    cmp word [ebx], 'MZ' 
    jne .NoExportTable  ;是不是有效的 PE 文件 
    mov eax, [ebx + 3CH] 
    add eax, ebx  ;eax = PE Header 
    cmp dword [eax], 00004550H ;PE/0/0 
    jne .NoExportTable 
 
    ;搜索需要的 API 地址 
    mov edx, [eax + 04H + 14H + 60H] 
    test edx, edx 
    jz .NoExportTable  ;没有输出表
 
    add edx, ebx  ;计算输出表位置 
    ;NumberOfFunctions 
    mov ecx, [edx + 18H] 
    ;AddressOfNames 
    mov eax, [edx + 20H]       
    add eax, ebx 
    ;AddressOfFunctions 
    mov ebp, [edx + 1CH] 
    add ebp, ebx 
    ;AddressOfNameOrdinals 
    mov edx, [edx + 24H] 
    add edx, ebx 
    dec ecx 
    cld 
    push eax 
    xor eax, eax
 
.GetAPIAddress: 
    inc eax 
    cmp byte [esi + eax], 0 
    jne .GetAPIAddress 
    ;dec eax 
    xchg eax, [esp] 
 
    push esi   ;[esp] = esi;[esp + 4] = strlen(lpszProcName) 
    .FindNextExportFunction: 
    mov edi, [eax + ecx * 4] 
    add edi, ebx  ;edi = API NAME 
           
    push ecx 
    mov ecx, [esp + 4 + 4] 
    repz cmpsb 
    jnz .3_GetAPIAddress 
    test ecx, ecx 
    jnz .3_GetAPIAddress
 
    ;找到匹配的字符串 
    pop ecx 
    movzx ecx, word [edx + ecx * 2] 
    mov eax, [ebp + ecx * 4] 
    add eax, ebx  ;eax = API ADDRESS 
    mov [esp + 32 - 4 + 8], eax ;返回值 
    jmp .4_GetAPIAddress
 
.3_GetAPIAddress: 
    pop ecx 
    mov esi, [esp] 
    dec ecx 
    jns .FindNextExportFunction
 
.4_GetAPIAddress: 
    pop ebx 
    pop ebx
 
.NoExportTable: 
    popad 
    leave 
    ret 4*2 

#include "stdafx.h" #include "Vcruntime140d.h" HMODULE g_hVcruntime140d; BOOL (WINAPI *Vcruntime140d_DllEntryPoint)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); void* __stdcall Vcruntime140d_RVA(DWORD rvaAddr) { if(rvaAddr==0) return g_hVcruntime140d; if(rvaAddr >= 0x1000 && rvaAddr < 0x16000) return &Vcruntime140d_text[rvaAddr - 0x1000]; if(rvaAddr >= 0x16000 && rvaAddr < 0x17000) return &Vcruntime140d_data[rvaAddr - 0x16000]; if(rvaAddr >= 0x17000 && rvaAddr < 0x18000) return &Vcruntime140d_idata[rvaAddr - 0x17000]; return NULL; } BOOL Vcruntime140d_Init() { HMODULE hDll; DWORD oldProtect; void (*fInitData)(void*); g_hVcruntime140d = GetModuleHandle(0); oldProtect = PAGE_EXECUTE_READWRITE; VirtualProtect(Vcruntime140d_text,sizeof(Vcruntime140d_text),PAGE_EXECUTE_READWRITE,&oldProtect); hDll = ::LoadLibraryA("ucrtbased.dll"); if(!hDll) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1707C) = ::GetProcAddress(hDll,"_free_dbg"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1707C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17080) = ::GetProcAddress(hDll,"atol"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17080)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17084) = ::GetProcAddress(hDll,"__stdio_common_vsprintf_s"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17084)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17088) = ::GetProcAddress(hDll,"wcsncmp"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17088)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1708C) = ::GetProcAddress(hDll,"abort"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1708C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17090) = ::GetProcAddress(hDll,"_calloc_dbg"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17090)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17094) = ::GetProcAddress(hDll,"_malloc_dbg"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17094)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17098) = ::GetProcAddress(hDll,"_CrtDbgReport"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17098)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1709C) = ::GetProcAddress(hDll,"strlen"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1709C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170A0) = ::GetProcAddress(hDll,"strcpy_s"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170A0)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170A4) = ::GetProcAddress(hDll,"malloc"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170A4)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170A8) = ::GetProcAddress(hDll,"free"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170A8)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170AC) = ::GetProcAddress(hDll,"strcmp"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170AC)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170B0) = ::GetProcAddress(hDll,"terminate"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170B0)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x170B4) = ::GetProcAddress(hDll,"_CrtDbgReportW"); if(!*(FARPROC*)Vcruntime140d_RVA(0x170B4)) return FALSE; hDll = ::LoadLibraryA("KERNEL32.dll"); if(!hDll) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17000) = ::GetProcAddress(hDll,"LeaveCriticalSection"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17000)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17004) = ::GetProcAddress(hDll,"TerminateProcess"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17004)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17008) = ::GetProcAddress(hDll,"GetCurrentProcess"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17008)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1700C) = ::GetProcAddress(hDll,"SetUnhandledExceptionFilter"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1700C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17010) = ::GetProcAddress(hDll,"UnhandledExceptionFilter"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17010)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17014) = ::GetProcAddress(hDll,"GetSystemTimeAsFileTime"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17014)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17018) = ::GetProcAddress(hDll,"GetCurrentThreadId"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17018)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1701C) = ::GetProcAddress(hDll,"GetCurrentProcessId"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1701C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17020) = ::GetProcAddress(hDll,"QueryPerformanceCounter"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17020)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17024) = ::GetProcAddress(hDll,"IsProcessorFeaturePresent"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17024)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17028) = ::GetProcAddress(hDll,"GetModuleHandleW"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17028)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1702C) = ::GetProcAddress(hDll,"GetModuleFileNameW"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1702C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17030) = ::GetProcAddress(hDll,"LoadLibraryExW"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17030)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17034) = ::GetProcAddress(hDll,"GetProcAddress"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17034)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17038) = ::GetProcAddress(hDll,"FreeLibrary"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17038)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1703C) = ::GetProcAddress(hDll,"TlsFree"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1703C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17040) = ::GetProcAddress(hDll,"TlsSetValue"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17040)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17044) = ::GetProcAddress(hDll,"RtlUnwind"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17044)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17048) = ::GetProcAddress(hDll,"VirtualQuery"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17048)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1704C) = ::GetProcAddress(hDll,"EncodePointer"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1704C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17050) = ::GetProcAddress(hDll,"InterlockedPushEntrySList"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17050)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17054) = ::GetProcAddress(hDll,"InterlockedFlushSList"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17054)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17058) = ::GetProcAddress(hDll,"RaiseException"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17058)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1705C) = ::GetProcAddress(hDll,"EnterCriticalSection"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1705C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17060) = ::GetProcAddress(hDll,"TlsAlloc"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17060)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17064) = ::GetProcAddress(hDll,"DeleteCriticalSection"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17064)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17068) = ::GetProcAddress(hDll,"GetLastError"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17068)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x1706C) = ::GetProcAddress(hDll,"SetLastError"); if(!*(FARPROC*)Vcruntime140d_RVA(0x1706C)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17070) = ::GetProcAddress(hDll,"InitializeCriticalSectionAndSpinCount"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17070)) return FALSE; *(FARPROC*)Vcruntime140d_RVA(0x17074) = ::GetProcAddress(hDll,"TlsGetValue"); if(!*(FARPROC*)Vcruntime140d_RVA(0x17074)) return FALSE; *(FARPROC*)&fInitData = (FARPROC)&Vcruntime140d_InitData[0]; fInitData(Vcruntime140d_RVA); VirtualProtect(Vcruntime140d_text,sizeof(Vcruntime140d_text),oldProtect,NULL); *(FARPROC*)&Vcruntime140d_DllEntryPoint = (FARPROC)Vcruntime140d_RVA(0x14930); return TRUE; } BOOL Vcruntime140d_LoadLibrary() { return Vcruntime140d_DllEntryPoint(g_hVcruntime140d, DLL_PROCESS_ATTACH, 0); } BOOL Vcruntime140d_FreeLibrary() { return Vcruntime140d_DllEntryPoint(g_hVcruntime140d, DLL_PROCESS_DETACH, 0); } FARPROC Vcruntime140d_GetProcAddress(LPCSTR lpProcName) { if(lstrcmpA(lpProcName,"_CreateFrameInfo")==0) return (FARPROC)Vcruntime140d_RVA(0x14660); if(lstrcmpA(lpProcName,"_CxxThrowException")==0) return (FARPROC)Vcruntime140d_RVA(0x9280); if(lstrcmpA(lpProcName,"_EH_prolog")==0) return (FARPROC)Vcruntime140d_RVA(0x15110); if(lstrcmpA(lpProcName,"_FindAndUnlinkFrame")==0) return (FARPROC)Vcruntime140d_RVA(0x14690); if(lstrcmpA(lpProcName,"_IsExceptionObjectToBeDestroyed")==0) return (FARPROC)Vcruntime140d_RVA(0x62C0); if(lstrcmpA(lpProcName,"_NLG_Dispatch2")==0) return (FARPROC)Vcruntime140d_RVA(0x3133); if(lstrcmpA(lpProcName,"_NLG_Return")==0) return (FARPROC)Vcruntime140d_RVA(0x45C7); if(lstrcmpA(lpProcName,"_NLG_Return2")==0) return (FARPROC)Vcruntime140d_RVA(0x313D); if(lstrcmpA(lpProcName,"_SetWinRTOutOfMemoryExceptionCallback")==0) return (FARPROC)Vcruntime140d_RVA(0x6300); if(lstrcmpA(lpProcName,"__AdjustPointer")==0) return (FARPROC)Vcruntime140d_RVA(0x6310); if(lstrcmpA(lpProcName,"__BuildCatchObject")==0) return (FARPROC)Vcruntime140d_RVA(0x7390); if(lstrcmpA(lpProcName,"__BuildCatchObjectHelper")==0) return (FARPROC)Vcruntime140d_RVA(0x74A0); if(lstrcmpA(lpProcName,"__CxxDetectRethrow")==0) return (FARPROC)Vcruntime140d_RVA(0x7BF0); if(lstrcmpA(lpProcName,"__CxxExceptionFilter")==0) return (FARPROC)Vcruntime140d_RVA(0x7C70); if(lstrcmpA(lpProcName,"__CxxFrameHandler")==0) return (FARPROC)Vcruntime140d_RVA(0x147B0); if(lstrcmpA(lpProcName,"__CxxFrameHandler2")==0) return (FARPROC)Vcruntime140d_RVA(0x147B0); if(lstrcmpA(lpProcName,"__CxxFrameHandler3")==0) return (FARPROC)Vcruntime140d_RVA(0x147B0); if(lstrcmpA(lpProcName,"__CxxLongjmpUnwind")==0) return (FARPROC)Vcruntime140d_RVA(0x147F0); if(lstrcmpA(lpProcName,"__CxxQueryExceptionSize")==0) return (FARPROC)Vcruntime140d_RVA(0x7E60); if(lstrcmpA(lpProcName,"__CxxRegisterExceptionObject")==0) return (FARPROC)Vcruntime140d_RVA(0x7E70); if(lstrcmpA(lpProcName,"__CxxUnregisterExceptionObject")==0) return (FARPROC)Vcruntime140d_RVA(0x7F90); if(lstrcmpA(lpProcName,"__DestructExceptionObject")==0) return (FARPROC)Vcruntime140d_RVA(0x6150); if(lstrcmpA(lpProcName,"__FrameUnwindFilter")==0) return (FARPROC)Vcruntime140d_RVA(0x6360); if(lstrcmpA(lpProcName,"__GetPlatformExceptionInfo")==0) return (FARPROC)Vcruntime140d_RVA(0x63E0); if(lstrcmpA(lpProcName,"__RTCastToVoid")==0) return (FARPROC)Vcruntime140d_RVA(0x88D0); if(lstrcmpA(lpProcName,"__RTDynamicCast")==0) return (FARPROC)Vcruntime140d_RVA(0x89A0); if(lstrcmpA(lpProcName,"__RTtypeid")==0) return (FARPROC)Vcruntime140d_RVA(0x8B70); if(lstrcmpA(lpProcName,"__TypeMatch")==0) return (FARPROC)Vcruntime140d_RVA(0x7B00); if(lstrcmpA(lpProcName,"__current_exception")==0) return (FARPROC)Vcruntime140d_RVA(0x6460); if(lstrcmpA(lpProcName,"__current_exception_context")==0) return (FARPROC)Vcruntime140d_RVA(0x6470); if(lstrcmpA(lpProcName,"__intrinsic_setjmp")==0) return (FARPROC)Vcruntime140d_RVA(0x2F30); if(lstrcmpA(lpProcName,"__processing_throw")==0) return (FARPROC)Vcruntime140d_RVA(0x6480); if(lstrcmpA(lpProcName,"__report_gsfailure")==0) return (FARPROC)Vcruntime140d_RVA(0x15160); if(lstrcmpA(lpProcName,"__std_exception_copy")==0) return (FARPROC)Vcruntime140d_RVA(0x8DB0); if(lstrcmpA(lpProcName,"__std_exception_destroy")==0) return (FARPROC)Vcruntime140d_RVA(0x8EA0); if(lstrcmpA(lpProcName,"__std_terminate")==0) return (FARPROC)Vcruntime140d_RVA(0x6490); if(lstrcmpA(lpProcName,"__std_type_info_compare")==0) return (FARPROC)Vcruntime140d_RVA(0x8FD0); if(lstrcmpA(lpProcName,"__std_type_info_destroy_list")==0) return (FARPROC)Vcruntime140d_RVA(0x9000); if(lstrcmpA(lpProcName,"__std_type_info_hash")==0) return (FARPROC)Vcruntime140d_RVA(0x9040); if(lstrcmpA(lpProcName,"__std_type_info_name")==0) return (FARPROC)Vcruntime140d_RVA(0x90A0); if(lstrcmpA(lpProcName,"__telemetry_main_invoke_trigger")==0) return (FARPROC)Vcruntime140d_RVA(0x9540); if(lstrcmpA(lpProcName,"__telemetry_main_return_trigger")==0) return (FARPROC)Vcruntime140d_RVA(0x9540); if(lstrcmpA(lpProcName,"__unDName")==0) return (FARPROC)Vcruntime140d_RVA(0x141B0); if(lstrcmpA(lpProcName,"__unDNameEx")==0) return (FARPROC)Vcruntime140d_RVA(0x141E0); if(lstrcmpA(lpProcName,"__uncaught_exception")==0) return (FARPROC)Vcruntime140d_RVA(0x9330); if(lstrcmpA(lpProcName,"__uncaught_exceptions")==0) return (FARPROC)Vcruntime140d_RVA(0x9380); if(lstrcmpA(lpProcName,"__vcrt_GetModuleFileNameW")==0) return (FARPROC)Vcruntime140d_RVA(0xA090); if(lstrcmpA(lpProcName,"__vcrt_GetModuleHandleW")==0) return (FARPROC)Vcruntime140d_RVA(0xA0B0); if(lstrcmpA(lpProcName,"__vcrt_InitializeCriticalSectionEx")==0) return (FARPROC)Vcruntime140d_RVA(0x9F70); if(lstrcmpA(lpProcName,"__vcrt_LoadLibraryExW")==0) return (FARPROC)Vcruntime140d_RVA(0xA0C0); if(lstrcmpA(lpProcName,"_chkesp")==0) return (FARPROC)Vcruntime140d_RVA(0x33E0); if(lstrcmpA(lpProcName,"_except_handler2")==0) return (FARPROC)Vcruntime140d_RVA(0x2AF8); if(lstrcmpA(lpProcName,"_except_handler3")==0) return (FARPROC)Vcruntime140d_RVA(0x2BC8); if(lstrcmpA(lpProcName,"_except_handler4_common")==0) return (FARPROC)Vcruntime140d_RVA(0x3200); if(lstrcmpA(lpProcName,"_get_purecall_handler")==0) return (FARPROC)Vcruntime140d_RVA(0xA0E0); if(lstrcmpA(lpProcName,"_get_unexpected")==0) return (FARPROC)Vcruntime140d_RVA(0x93E0); if(lstrcmpA(lpProcName,"_global_unwind2")==0) return (FARPROC)Vcruntime140d_RVA(0x3000); if(lstrcmpA(lpProcName,"_is_exception_typeof")==0) return (FARPROC)Vcruntime140d_RVA(0x64A0); if(lstrcmpA(lpProcName,"_local_unwind2")==0) return (FARPROC)Vcruntime140d_RVA(0x3066); if(lstrcmpA(lpProcName,"_local_unwind4")==0) return (FARPROC)Vcruntime140d_RVA(0x2D00); if(lstrcmpA(lpProcName,"_longjmpex")==0) return (FARPROC)Vcruntime140d_RVA(0x2FF0); if(lstrcmpA(lpProcName,"_purecall")==0) return (FARPROC)Vcruntime140d_RVA(0xA100); if(lstrcmpA(lpProcName,"_seh_longjmp_unwind4")==0) return (FARPROC)Vcruntime140d_RVA(0x2DD8); if(lstrcmpA(lpProcName,"_seh_longjmp_unwind")==0) return (FARPROC)Vcruntime140d_RVA(0x2CD4); if(lstrcmpA(lpProcName,"_set_purecall_handler")==0) return (FARPROC)Vcruntime140d_RVA(0xA130); if(lstrcmpA(lpProcName,"_set_se_translator")==0) return (FARPROC)Vcruntime140d_RVA(0x9470); if(lstrcmpA(lpProcName,"_setjmp3")==0) return (FARPROC)Vcruntime140d_RVA(0x2F70); if(lstrcmpA(lpProcName,"longjmp")==0) return (FARPROC)Vcruntime140d_RVA(0x5950); if(lstrcmpA(lpProcName,"memchr")==0) return (FARPROC)Vcruntime140d_RVA(0x45F0); if(lstrcmpA(lpProcName,"memcmp")==0) return (FARPROC)Vcruntime140d_RVA(0x3CD0); if(lstrcmpA(lpProcName,"memcpy")==0) return (FARPROC)Vcruntime140d_RVA(0x46A0); if(lstrcmpA(lpProcName,"memmove")==0) return (FARPROC)Vcruntime140d_RVA(0x4C20); if(lstrcmpA(lpProcName,"memset")==0) return (FARPROC)Vcruntime140d_RVA(0x51A0); if(lstrcmpA(lpProcName,"set_unexpected")==0) return (FARPROC)Vcruntime140d_RVA(0x9400); if(lstrcmpA(lpProcName,"strchr")==0) return (FARPROC)Vcruntime140d_RVA(0x5300); if(lstrcmpA(lpProcName,"strrchr")==0) return (FARPROC)Vcruntime140d_RVA(0x5430); if(lstrcmpA(lpProcName,"strstr")==0) return (FARPROC)Vcruntime140d_RVA(0x5570); if(lstrcmpA(lpProcName,"unexpected")==0) return (FARPROC)Vcruntime140d_RVA(0x9430); if(lstrcmpA(lpProcName,"wcschr")==0) return (FARPROC)Vcruntime140d_RVA(0x5980); if(lstrcmpA(lpProcName,"wcsrchr")==0) return (FARPROC)Vcruntime140d_RVA(0x5AF0); if(lstrcmpA(lpProcName,"wcsstr")==0) return (FARPROC)Vcruntime140d_RVA(0x5C80); return NULL;
最新发布
01-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值