gpt4 book ai didi

c++ - C 和 C++ 库错误

转载 作者:行者123 更新时间:2023-11-28 05:47:58 26 4
gpt4 key购买 nike

<分区>

我有 3 个文件(selfdelxp.c、selfdelxp.h 和 main.cpp)

selfdelxp.c 复制自 http://blogorama.nerdworks.in/selfdeletingexecutables/当我尝试使用 main.cpp 中的 SelfDelete() 函数时,我删除了 main 函数

当我尝试编译时出现错误 undefined reference to 'SelfDelete()'

我怎样才能让它发挥作用?我究竟做错了什么?我想要做的是能够在用 main.cpp 编写的程序中使用该函数 (SelfDelete())

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_

主要.cpp

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com