2017-07-18 134 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最终可能会被调用,但还有更多不仅仅是一个包装器。 –