gpt4 book ai didi

c++ - dll 注入(inject)失败

转载 作者:可可西里 更新时间:2023-11-01 10:01:31 26 4
gpt4 key购买 nike

我正在为我的网络制作一个安全程序。其中一个实例是检查和监控调用了哪些 api 和库。执行此操作的 dll 和与之配套的程序已经完成。但是有一个问题我似乎无法解决。

当尝试使用 NtCreateThreadEx 将我的 dll 注入(inject)系统进程(例如 explorer.exe,我的主要测试系统进程)时,我得到了返回值:C0000022,这意味着: Status_Access_Denied(返回 NTSTATUS,但 DWORD 可以)

我不知道该怎么做,我以管理员身份运行,我提升了我的权限,并使用了正确的功能,但我仍然得到 c0000022

这是我用来注入(inject)的代码

#include "main.h"

typedef DWORD NTSTATUS;

struct NtCreateThreadExBuffer{
ULONG Size;
ULONG Unknown1;
ULONG Unknown2;
PULONG Unknown3;
ULONG Unknown4;
ULONG Unknown5;
ULONG Unknown6;
PULONG Unknown7;
ULONG Unknown8;
};


typedef NTSTATUS (WINAPI *LPFUN_NtCreateThreadEx)
(
OUT PHANDLE hThread,
IN ACCESS_MASK DesiredAccess,
IN LPVOID ObjectAttributes,
IN HANDLE ProcessHandle,
IN LPTHREAD_START_ROUTINE lpStartAddress,
IN LPVOID lpParameter,
IN BOOL CreateSuspended,
IN ULONG StackZeroBits,
IN ULONG SizeOfStackCommit,
IN ULONG SizeOfStackReserve,
OUT LPVOID lpBytesBuffer
);

using namespace std;

//#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
#define CREATE_THREAD_ACCESS ( PROCESS_ALL_ACCESS )

BOOL LoadDll(char *procName, char *dllName);
BOOL InjectDLL(DWORD dwProcessID, char *dllName);

BOOL LoadDll(char *dllName, DWORD dwProcID){

printf("Process Id to Inject: %d",dwProcID);

if(!dwProcID){
printf("No vailid PID\n");
return false;
}

FILE* FileCheck = fopen(dllName, "r");

if(FileCheck==NULL){
printf("\nUnable to inject %s", dllName);
return false;
}

fclose(FileCheck);


if(!InjectDLL(dwProcID, dllName)){

printf("injection failed\n");
return false;
} else {
return true;
}

}

BOOL InjectDLL(DWORD dwProcessID, char *dllName){

HANDLE hProc;
HANDLE hToken;
char buf[50]={0};
LPVOID RemoteString, LoadLibAddy;

if(!dwProcessID)return false;


HANDLE hCurrentProc = GetCurrentProcess();

if (!OpenProcessToken(hCurrentProc,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken)){

printf("OpenProcessToken Error:%d\n", GetLastError());


} else {

if (!RaisePrivleges(hToken, (char*)SE_DEBUG_NAME)){

printf("SetPrivleges SE_DEBUG_NAME Error:%d\n", GetLastError());

}

}


if (hToken)CloseHandle(hToken);

hProc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, dwProcessID);

printf("\nHandle to process: %x\n", hProc);

if(!hProc){

printf("OpenProcess() failed: %d", GetLastError());
return false;

}

LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");


if(!LoadLibAddy){

printf("GetProcAddress() failed: %d", GetLastError());
return false;

}

RemoteString = (LPVOID)VirtualAllocEx(hProc, NULL, strlen(dllName), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);

if(RemoteString == NULL){

printf("VirtualAllocEx() failed: %d", GetLastError());
return false;

}


printf("\nRemote address: %x\n", RemoteString);

if(WriteProcessMemory(hProc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL) == NULL){

printf("WriteProcessMemory() failed: %d", GetLastError());
return false;

}

/*
if(!CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL)){

printf("CreateRemoteThread() failed: %d", GetLastError());
return false;

}
*/

HMODULE modNtDll = GetModuleHandle("ntdll.dll");


if( !modNtDll )
{
printf("n failed to get module handle for ntdll.dll, Error=0x%.8x", GetLastError());
return 0;
}

LPFUN_NtCreateThreadEx funNtCreateThreadEx =
(LPFUN_NtCreateThreadEx) GetProcAddress(modNtDll, "NtCreateThreadEx");


if( !funNtCreateThreadEx )
{
printf("n failed to get function (NTCreateThreadEx) address from ntdll.dll, Error=0x%.8x\nTrying CreateRemoteThread api\n", GetLastError());

if(!CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL)){

printf("CreateRemoteThread() failed: %d", GetLastError());
return false;

} else {
printf("CreateRemoteThread success!\n");
return true;
}


return 0;
}


NtCreateThreadExBuffer ntbuffer;

memset (&ntbuffer,0,sizeof(NtCreateThreadExBuffer));
DWORD temp1 = 0;
DWORD temp2 = 0;
HANDLE pRemoteThread = NULL;

ntbuffer.Size = sizeof(NtCreateThreadExBuffer);
ntbuffer.Unknown1 = 0x10003;
ntbuffer.Unknown2 = 0x8;
ntbuffer.Unknown3 = &temp2;
ntbuffer.Unknown4 = 0;
ntbuffer.Unknown5 = 0x10004;
ntbuffer.Unknown6 = 4;
ntbuffer.Unknown7 = &temp1;
ntbuffer.Unknown8 = 0;

NTSTATUS status = funNtCreateThreadEx(
&pRemoteThread,
0x1FFFFF,
NULL,
hProc,
(LPTHREAD_START_ROUTINE) LoadLibAddy,
(LPVOID)RemoteString,
FALSE, //start instantly
NULL,
NULL,
NULL,
&ntbuffer
);

printf("NTCreateThreadEx return: %x\n", status);

// Resume the thread execution

WaitForSingleObject(pRemoteThread, INFINITE);


//Check the return code from remote thread function
DWORD dwExitCode;
if( GetExitCodeThread(pRemoteThread, (DWORD*) &dwExitCode) )
{
printf("\n Remote thread returned with status = %d\n", dwExitCode);
}


CloseHandle(pRemoteThread);


CloseHandle(hProc);
return true;

}


BOOL RaisePrivleges( HANDLE hToken, char *pPriv ){

TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tkp.Privileges[0].Luid.HighPart = 0;
tkp.Privileges[0].Luid.LowPart = 0;

if (!LookupPrivilegeValue(NULL, pPriv, &tkp.Privileges[0].Luid)){

printf("LookupPrivilegeValue Error:%d\n", GetLastError());
return FALSE;

}

int iRet = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0x10, (PTOKEN_PRIVILEGES)NULL, 0);

if (iRet == NULL){

printf( "AdjustTokenPrivileges Error:%d\n", GetLastError());
return TRUE;

} else {

iRet = GetLastError();

switch (iRet){

case ERROR_NOT_ALL_ASSIGNED:
printf("AdjustTokenPrivileges ERROR_NOT_ALL_ASSIGNED\n" );
return FALSE;

case ERROR_SUCCESS:
return TRUE;

default:
printf("AdjustTokenPrivileges Unknow Error:%d\n", iRet);
return FALSE;
}
}
}

最佳答案

1) 如果您在 VISTA 或更高版本上运行,那么您可能试图从“非 protected 进程”注入(inject)“ protected 进程”。参见 Process Security and Access Rights在 MSDN 中。非保护进程不能在保护进程中创建线程;尽管我必须承认,当您请求不适当的访问权限时,我希望打开进程的调用失败,而不是随后的创建线程调用失败。

2) 为什么要使用 NtCreateThreadEx() 而不是简单地调用 CreateRemoteThread()

3) 这可能不是您问题的原因,但是...您未能为字符串中的空终止符分配内存,您应该分配 strlen(dllName) + 1.

4) 我假设正在进行注入(inject)的进程和您要注入(inject)的进程都是相同的架构,您不是在 x64 上运行 x86 exe 并期望注入(inject) x64 exe 吗?

关于c++ - dll 注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826408/

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