2016-03-07 4 views
0

Я получил 3 файла (selfdelxp.c, selfdelxp.h и main.cpp)C и C++ библиотеки ошибки

selfdelxp.c был скопированным из http://blogorama.nerdworks.in/selfdeletingexecutables/ и я удалил основную функцию, как я пытаюсь использовать функцию SelfDelete() в main.cpp

проблема возникает, когда я пытаюсь скомпилировать его метание ошибки undefined reference to 'SelfDelete()'

Как я могу заставить его работать? Что я делаю не так? То, что я пытаюсь сделать, это быть в состоянии использовать эту функцию (SelfDelete()) в программе, написанной в main.cpp

selfdelxp.c

// 
// Self-deleting exe under Windows XP 
// 
#include <windows.h> 
#include <tchar.h> 

// get this right! 
#define EXPLORER_PID 1444 

typedef UINT (WINAPI * WAIT_PROC)(HANDLE, DWORD); // WaitForSingleObject 
typedef BOOL (WINAPI * CLOSE_PROC)(HANDLE);  // CloseHandle 
typedef BOOL (WINAPI * DELETE_PROC)(LPCTSTR);  // DeleteFile 
typedef VOID (WINAPI * EXIT_PROC)(DWORD);   // ExitProcess 

typedef struct 
{ 
    WAIT_PROC fnWaitForSingleObject; 
    CLOSE_PROC fnCloseHandle; 
    DELETE_PROC fnDeleteFile; 
    EXIT_PROC fnExitProcess; 

    HANDLE  hProcess; 
    TCHAR  szFileName[MAX_PATH]; 

} INJECT; 

#pragma optimize("gsy", off) 
#pragma check_stack(off)  // doesn't work :-(

DWORD WINAPI RemoteThread(INJECT *remote) 
{ 
    remote->fnWaitForSingleObject(remote->hProcess, INFINITE); 
    remote->fnCloseHandle(remote->hProcess); 
    remote->fnDeleteFile(remote->szFileName); 
    remote->fnExitProcess(0); 

    return 0; 
} 

#pragma check_stack 

HANDLE GetRemoteProcess() 
{ 
    STARTUPINFO   si = { sizeof(si) }; 
    PROCESS_INFORMATION pi; 

    //return OpenProcess(PROCESS_ALL_ACCESS, FALSE, EXPLORER_PID); 

    if(CreateProcess(0, "explorer.exe", 0, 0, FALSE, CREATE_SUSPENDED|CREATE_NO_WINDOW|IDLE_PRIORITY_CLASS, 0, 0, &si, &pi)) 
    { 
     CloseHandle(pi.hThread); 
     return pi.hProcess; 
    } 
    else 
    { 
     return 0; 
    } 
} 

PVOID GetFunctionAddr(PVOID func) 
{ 
#ifdef _DEBUG 

    // get address of function from the JMP <relative> instruction 
    DWORD *offset = (BYTE *)func + 1; 
    return (PVOID)(*offset + (BYTE *)func + 5); 

#else 

    return func; 

#endif 
} 

BOOL SelfDelete() 
{ 
    INJECT local, *remote; 
    BYTE *code; 
    HMODULE hKernel32; 
    HANDLE hRemoteProcess; 
    HANDLE hCurProc; 

    DWORD dwThreadId; 
    HANDLE hThread = 0; 

    char ach[80]; 

    hRemoteProcess = GetRemoteProcess(); 

    if(hRemoteProcess == 0) 
     return FALSE; 

    // Allocate memory in remote process 
    code = VirtualAllocEx(hRemoteProcess, 0, sizeof(INJECT) + 128, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); 

    if(code == 0) 
    { 
     CloseHandle(hRemoteProcess); 
     return FALSE; 
    } 

    hKernel32 = GetModuleHandle(_T("kernel32.dll")); 

    // setup remote structure 
    remote = (INJECT *)(code + 128); 

    local.fnWaitForSingleObject = (WAIT_PROC)GetProcAddress(hKernel32, "WaitForSingleObject"); 
    local.fnCloseHandle   = (CLOSE_PROC)GetProcAddress(hKernel32, "CloseHandle"); 
    local.fnExitProcess   = (EXIT_PROC)GetProcAddress(hKernel32, "ExitProcess"); 

#ifdef UNICODE 
    local.fnDeleteFile   = (DELETE_PROC)GetProcAddress(hKernel32, "DeleteFileW"); 
#else 
    local.fnDeleteFile   = (DELETE_PROC)GetProcAddress(hKernel32, "DeleteFileA"); 
#endif 

    // duplicate our own process handle for remote process to wait on 
    hCurProc = GetCurrentProcess(); 
    DuplicateHandle(hCurProc, hCurProc, hRemoteProcess, &local.hProcess, 0, FALSE, DUPLICATE_SAME_ACCESS); 

    // find name of current executable 
    GetModuleFileName(NULL, local.szFileName, MAX_PATH); 

    // write in code to execute, and the remote structure 
    WriteProcessMemory(hRemoteProcess, code, GetFunctionAddr(RemoteThread), 128, 0); 
    WriteProcessMemory(hRemoteProcess, remote, &local, sizeof(local), 0); 

    wsprintf(ach, "%x %x\n", code, remote); 
    OutputDebugString(ach); 

    // execute the code in remote process 
    hThread = CreateRemoteThread(hRemoteProcess, 0, 0, code, remote, 0, &dwThreadId); 

    if(hThread != 0) 
    { 
     CloseHandle(hThread); 
    } 

    return TRUE; 
} 

/*int main(void) 
{ 
    SelfDelete(); 

    return 0; 
}*/ 

selfdelxp.h

#ifndef SELFDELETE_H_ 
#define SELFDELETE_H_ 

#include <stdbool.h> 
bool SelfDelete(void); 

#endif // SELFDELETE_H_ 

main.cpp

#include <iostream> 
#include "selfdelxp.h" 
using namespace std; 

int main() 
{ 
    SelfDelete(); 
    return 0; 
} 
+0

Это не должно быть что-то вроде 'экстерном«C «BOOL SelfDelete();'? – Michael

ответ

1

Вы попадаете под марку C++. Примечание. Selfdelxp.c предположительно скомпилирован как код C. Вам нужно добавить extern «C» {...} вокруг замедления SelfDelete() или попробовать скомпилировать selfdelxp.c как cpp (например, переименовать его).

Вот как вы это сделаете с помощью первого подхода.

#include <windows.h> 

extern "C" { 
    BOOL SelfDelete(); 
} 

(Вы могли бы также объявить, что с помощью BOOL C++ и, вероятно, будет хорошо, но Afik это лучше включить windows.h и использовать тот же тип)

+0

В каком из этих трех файлов я должен его заменить? Я пробовал на main.cpp и .h и все еще получаю ошибку компилятором – user

+0

Вам нужно заменить определение в своем заголовке, чтобы сообщить компилятору C++, что имя SelfDelete не должно искажаться. Используя приведенное выше определение, вам также необходимо включить windows.h перед объявлением (только что отредактированный ответ, чтобы отразить это). –

+0

Я не видел твоих прав, сожалею об этом. В любом случае, он все еще не работает – user