2010-10-10 3 views

ответ

7

Просто не используйте CRT и не используйте импортированные функции.

#pragma comment(linker, "/entry:start") 
int start() 
{ 
    return 42; 
} 

Чтобы использовать функции WinAPI, найти kernel32 базу, разобрать его директории экспорта и найти LoadLibrary() функцию (вы должны уже иметь что-то вроде GetProcAddress(), чтобы найти LoadLibrary())

Это может выглядит это:

// compile as console application, "release" configuration with /MT /GS- 
#include <Windows.h> 
#pragma comment(linker, "/entry:start") 
void start() 
{ 
    HMODULE kernel32base = *(HMODULE*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(__readfsdword(0x30) + 0x0C) + 0x14))) + 0x10); 

    DWORD base = (DWORD)kernel32base; 
    IMAGE_NT_HEADERS* pe = PIMAGE_NT_HEADERS(base + PIMAGE_DOS_HEADER(base)->e_lfanew); 
    IMAGE_EXPORT_DIRECTORY* exportDir = PIMAGE_EXPORT_DIRECTORY(base + pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 
    DWORD* namePtr = (DWORD*)(base + exportDir->AddressOfNames); 
    WORD* ordPtr = (WORD*)(base + exportDir->AddressOfNameOrdinals); 
    for(; strcmp((const char*)(base + *namePtr), "GetProcAddress"); ++namePtr, ++ordPtr) 
     ; 
    DWORD funcRVA = *(DWORD*)(base + exportDir->AddressOfFunctions + *ordPtr * 4); 

    typedef FARPROC (WINAPI *GetProcAddress_t)(HMODULE, const char*); 
    GetProcAddress_t GetProcAddress = (GetProcAddress_t)(base + funcRVA); 

    HANDLE (WINAPI *GetStdHandle)(DWORD); 
    *(FARPROC*)&GetStdHandle = GetProcAddress(kernel32base, "GetStdHandle"); 

    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); 

    BOOL (WINAPI *WriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED); 
    *(FARPROC*)&WriteFile = GetProcAddress(kernel32base, "WriteFile"); 

    const char* greeting = "Hello world!\n"; 

    DWORD written; 
    WriteFile(stdout, greeting, strlen(greeting), &written, NULL); 
} 
+0

Конечно, как построить из исходного метода. – Abyx

+0

Можете ли вы представить пример приветствия во всем мире? – ollydbg

+0

@ollydbg Это довольно полно для MSVC. Скомпилируйте его как «release» с/MT/GS-, и у него не будет импорта. – Abyx

0

чтобы лишить импорт из существующего исполняемого модуля, вы должны проанализировать это каталог импорта, чтобы получить импорт, а затем генерировать и добавить код, чтобы получить эти импорта, а затем удалить каталог импорта.

 Смежные вопросы

  • Нет связанных вопросов^_^