首页
社区
课程
招聘
[求助]RtlAdjustPrivilege函数注入其他程序时使用降权功能,导致目标崩溃怎么办?
发表于: 2021-1-22 23:50 3870

[求助]RtlAdjustPrivilege函数注入其他程序时使用降权功能,导致目标崩溃怎么办?

2021-1-22 23:50
3870
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>

BOOL FindProcessPid(LPCSTR ProcessName, DWORD& dwPid);

struct arg
{
 INT64 pLoadLibrary;
 INT64 pGetProcAddress;
 char RAP[20];// = "RtlAdjustPrivilege"
 char LL[7];// = "ntdll"
};


void __stdcall tfunc(arg* pArg)
{
 HMODULE hdll;
 typedef HMODULE(*lypLoadLibrary)(LPCSTR);
 typedef FARPROC(*lypGetProcAddress)(HMODULE, LPCSTR);
 BOOLEAN lyp = 0;
 lypLoadLibrary OwnLoadLibrary = (lypLoadLibrary)pArg->pLoadLibrary;
 lypGetProcAddress OwnGetProcAddress = (lypGetProcAddress)pArg->pGetProcAddress;
 if (hdll = OwnLoadLibrary(pArg->LL))
 {
  typedef int(*lypRtlAdjustPrivilege)(ULONG, BOOLEAN, BOOLEAN, PBOOLEAN);
  lypRtlAdjustPrivilege RtlAdjustPrivilege;
  RtlAdjustPrivilege = (lypRtlAdjustPrivilege)OwnGetProcAddress(hdll, pArg->RAP);
  if (RtlAdjustPrivilege == NULL) return;
  if (RtlAdjustPrivilege(0x13, FALSE, TRUE, &lyp) == 0x0c000007c)
  {
   RtlAdjustPrivilege(0x13, FALSE, FALSE, &lyp); //???
  }
 }
 return;
}


int main()
{
 DWORD dwwinlogon;
 HANDLE hwinlogon;
 HANDLE hRemoteTfunc;
 void *pRemoteTfunc;
 arg a = {0};
 arg* p;
 
 strcpy_s(a.LL, "ntdll");
 strcpy_s(a.RAP, "RtlAdjustPrivilege");
 a.pLoadLibrary = (INT64)GetProcAddress(LoadLibrary("Kernel32"), "LoadLibraryA");
 a.pGetProcAddress = (INT64)GetProcAddress(LoadLibrary("Kernel32"), "GetProcAddress");
 
 FindProcessPid("explorer.exe", dwwinlogon);
 hwinlogon = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwwinlogon);
 
 p = (arg*)VirtualAllocEx(hwinlogon, NULL, 1024, MEM_COMMIT, PAGE_READWRITE);
 if (!p) return -1;
 
 pRemoteTfunc = VirtualAllocEx(hwinlogon, NULL, 4 * 1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 if (!pRemoteTfunc) return -2;
 
 if (!WriteProcessMemory(hwinlogon, pRemoteTfunc, tfunc, 4 * 1024, NULL)) return -3;
 
 if (!WriteProcessMemory(hwinlogon, p, &a, 1024, NULL)) return -4;
 
 hRemoteTfunc = CreateRemoteThread(hwinlogon, NULL, NULL, (LPTHREAD_START_ROUTINE)pRemoteTfunc, p, 0, NULL);
 if (!hRemoteTfunc) return -5;
 
 WaitForSingleObject(hRemoteTfunc, INFINITE);
 
 VirtualFreeEx(hwinlogon, pRemoteTfunc, 0, MEM_RELEASE);
 VirtualFreeEx(hwinlogon, p, 0, MEM_RELEASE);
 
 CloseHandle(hRemoteTfunc);
 CloseHandle(hwinlogon);
 
 system("pause");
 return 0;
}


BOOL FindProcessPid(LPCSTR ProcessName, DWORD& dwPid)
{
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 // Take a snapshot of all processes in the system.
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 {
  return(FALSE);
 }
 pe32.dwSize = sizeof(PROCESSENTRY32);
 if (!Process32First(hProcessSnap, &pe32))
 {
  CloseHandle(hProcessSnap);          // clean the snapshot object
  return(FALSE);
 }
 BOOL    bRet = FALSE;
 do
 {
  if (!strcmp(ProcessName, pe32.szExeFile))
  {
   dwPid = pe32.th32ProcessID;
   bRet = TRUE;
   break;
  }
 } while (Process32Next(hProcessSnap, &pe32));
 CloseHandle(hProcessSnap);
 return bRet;
}

上面为程序代码,功能是拦截关机操作。在调用 RtlAdjustPrivilege 时会导致注入的目标无响应,求各位大神帮忙看看问题何在?


编译环境vs2017,运行时有uac权限。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 5299
活跃值: (5340)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
typedef int(*lypRtlAdjustPrivilege)(ULONG, BOOLEAN, BOOLEAN, PBOOLEAN);

BOOLEAN 只有1个字节  WINNT下的定义 typedef BYTE BOOLEAN

OD看了一下 RtlAdjustPrivilege 的函数 RETN 0x10


所以
typedef int(*lypRtlAdjustPrivilege)(ULONG, BOOL, BOOL, PBOOL);
才正确
2021-1-24 22:52
0
雪    币: 217
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
Mxixihaha typedef int(*lypRtlAdjustPrivilege)(ULONG, BOOLEAN, BOOLEAN, PBOOLEAN); BOOLEAN 只有1个字节 WINNT下的定义 ...
改成BOOL了,但是还是会让目标无反应
2021-1-27 09:22
0
雪    币: 4165
活跃值: (1555)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
不要直接复制函数到其他进程,如果必须复制请使用shellcode;
拦截关机可以将进程令牌中的SE_SHUTDOWN_NAME移除(使用SE_PRIVILEGE_REMOVED属性调用AdjustTokenPrivileges)。
2021-1-28 08:55
0
游客
登录 | 注册 方可回帖
返回