2017-07-18 1324 views
-3

我需要刪除我的項目的變形。所以我禁用CRT等,但它給了一些錯誤說無法解析的外部符號malloc /免費。 的錯誤是:無法解析的外部符號__imp__calloc

LNK2001: unresolved external symbol __imp__memcpy 

我該如何解決這些符號? 沒有在我的代碼中使用memcpy。我不使用例如RtlCopyMemory的例程。相反,我已經做了我自己的函數內聯彙編

__declspec(naked) void* __stdcall _memcpy(void *dst, const void *src, 
int length) 
{ 
__asm 
{ 
    push esi 
     push edi 
     push ecx 
      mov esi, dword ptr[esp+20] 
      mov edi, dword ptr[esp+16] 
      mov ecx, dword ptr[esp+24] 
      rep movsb 
     pop ecx 
     pop edi 
     pop esi 
     ret 12 
    } 
    } 

它似乎仍然被調用的memcpy出於某種原因? 現在我已經通過將vcruntime.lib鏈接到我的程序來解決了我的問題...

+4

可怕的想法。重新啓用CRT和您需要的任何默認庫,然後繼續。 –

+3

那麼,如果你不打算鏈接傳統上提供它們的庫,你必須自己實現它們。如果你願意,你可以在運行時使用GetProcAddress編寫用於鏈接到win32函數的包裝器,但如果你有更多的話,它不是一個有趣的過程。 –

+0

爲什麼你想從你的項目中刪除標準庫? –

回答

-1

不要聽別人的話,如果你寫黑客軟件,做一個自己研究的本地windows api,所有你需要的功能。 而不是calloc使用來自kernel32的HeapAlloc,而不是free使用HeapFree。 代替mbstowcs_s使用MultiByteToWideChar,而不是fseek使用SetFilePointer,而不是vfprintf使用WriteFile,打開或創建文件使用CreateFile。關於prepare我不知道它做了什麼,所以不能告訴。基本上你會將代碼從CRT改寫爲WinApi。基本上CRT只是一個叫winapi的包裝。 您也可以使用ntdll.dll這是大多數黑客使用的功能,您可以通過LoadLibrary或其他更復雜的技巧與PEB聯繫。許多人會告訴你,你不應該使用未公開的函數,它們可能會被刪除,但如果你正在編寫黑客東西,它並不重要,它不是關於標準等等,並且自從Windows XP中刪除了很少的函數,我檢查從所有版本的ntdll,他們大多添加新的東西。

下面是一個示例應用程序去掉CRT:

#include <Windows.h> 
/* pragma directives below turn off CRT */ 

#pragma comment(linker, "/ENTRY:wWinMain") 
#pragma comment(linker, "/SUBSYSTEM:WINDOWS") 
#pragma comment(linker, "/NODEFAULTLIB") 

#pragma check_stack(off) 
#pragma runtime_checks("su",off) 


typedef void (__stdcall * nt_RtlCopyMemory)(
    _Out_  VOID UNALIGNED *Destination, 
    _In_ const VOID UNALIGNED *Source, 
    _In_  SIZE_T   Length 
); 
nt_RtlCopyMemory RtlCopyMemoryNt; 

#pragma strict_gs_check(push, off) 

const CHAR pSomething[] = "lol, test"; 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, 
    _In_opt_ HINSTANCE hPrevInstance, 
    _In_ LPWSTR lpCmdLine, 
    _In_ int  nCmdShow) 
{ 
    HMODULE hNtDll = LoadLibraryA("ntdll.dll"); 

    RtlCopyMemoryNt =(nt_RtlCopyMemory) GetProcAddress(hNtDll,"RtlMoveMemory"); 

    PCHAR pBuf = (PCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 32); 

    RtlCopyMemoryNt(pBuf, pSomething, lstrlenA(pSomething)); 

    MessageBoxA(0, "Hack", pBuf, 0); 

    ExitProcess(0); 

} 
#pragma strict_gs_check(pop) 

使用所有#pragma從這個代碼在您的項目,也試試這個代碼,看看NTDLL函數調用。 不要忘記在visual studio Configuration Properties->C/C++->Precompiled Headers中關閉預先校準的標頭,並關閉它們。如果您想了解更多關於這個命令所有的信息在MSDN:

https://msdn.microsoft.com/en-us/library/f9t8842e.aspx -/ENTRY

https://msdn.microsoft.com/en-us/library/fcc1zstk.aspx - /子系統

https://msdn.microsoft.com/en-us/library/3tz4da4a.aspx -/NODEFAULTLIB

https://msdn.microsoft.com/ru-ru/library/ybwsy5f9.aspx - check_stack

https://msdn.microsoft.com/ru-ru/library/6kasb93x.aspx - runtime_checks

https://msdn.microsoft.com/ru-ru/library/bb507721.aspx - strict_gs_check

+0

_「基本上CRT只是最終調用winapi的包裝器」_儘管WinAPI最終可能會被調用,但還有更多不僅僅是一個包裝器。 –