2010-10-10 6 views

Répondre

7

N'utilisez simplement pas CRT et n'utilisez aucune fonction importée.

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

Pour utiliser les fonctions WinAPI, trouver la base kernel32, l'analyse syntaxique est le répertoire d'exportation et trouver la fonction LoadLibrary() (vous devriez déjà avoir quelque chose comme GetProcAddress() pour LoadLibrary())

Cela peut ressemble ceci:

// 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

Bien sûr, c'est comment construire à partir de la méthode source. – Abyx

+0

Pouvez-vous fournir un exemple de bonjour dans son intégralité? – ollydbg

+0

@ollydbg C'est plutôt complet pour MSVC. Compilez-le comme "release" avec/MT/GS- et il n'aura aucune importation. – Abyx

0

dépouiller les importations de module exécutable existant, vous devez analyser ce répertoire est des importations pour obtenir ses importations, puis générer et ajouter un code pour obtenir ces importations, puis supprimer le répertoire des importations.

Questions connexes