首页
社区
课程
招聘
[原创]一个急速关机的小程序
发表于: 2009-6-10 14:39 8368

[原创]一个急速关机的小程序

2009-6-10 14:39
8368

原理很简单,以前看过一本书叫DOS大全,上面说在DOS下向0x64端口发送数据0xFE机器关机,经移植到XP测试还真行:

  #include<windows.h>

//这下面自定义函数入口
#pragma comment(linker, "/ENTRY:EntryPoint")
//设置区段属性,跟区段在内存起始地址
//这里面要加写入的权限,不然程序就运行不了了
//E为执行,R为可读,W为可写
#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
//下面合并区段,
#pragma comment(linker,"/merge:.data=.text")
#pragma comment(linker,"/merge:.rdata=.text")

typedef int NTSTATUS;
typedef enum _SYSDBG_COMMAND
{
  SysDbgSysReadIoSpace = 14,
    SysDbgSysWriteIoSpace = 15
}SYSDBG_COMMAND, *PSYSDBG_COMMAND;

typedef NTSTATUS (NTAPI * PZwSystemDebugControl) 
  (
  SYSDBG_COMMAND ControlCode,
  PVOID InputBuffer,
  ULONG InputBufferLength,
  PVOID OutputBuffer,
  ULONG OutputBufferLength,
  PULONG ReturnLength
  );
PZwSystemDebugControl ZwSystemDebugControl = NULL;

typedef struct _IO_STRUCT
{
  DWORD IoAddr;       // IN: Aligned to NumBYTEs,I/O address
  DWORD Reserved1;    // Never accessed by the kernel
  PVOID pBuffer;      // IN (write) or OUT (read): Ptr to buffer
  DWORD NumBYTEs;     // IN: # BYTEs to read/write. Only use 1, 2, or 4.
  DWORD Reserved4;    // Must be 1
  DWORD Reserved5;    // Must be 0
  DWORD Reserved6;    // Must be 1
  DWORD Reserved7;    // Never accessed by the kernel
}
IO_STRUCT, *PIO_STRUCT;

BOOL EnablePrivilege (PCSTR name)
{
  HANDLE hToken;
  BOOL rv;
  
  TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
  LookupPrivilegeValue (0,name,&priv.Privileges[0].Luid);
  OpenProcessToken(GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES,&hToken);
  AdjustTokenPrivileges (hToken,FALSE,&priv,sizeof priv,0,0);
  rv = GetLastError () == ERROR_SUCCESS; 
  CloseHandle (hToken);
  return rv;
}

BYTE InPortB (int Port)
{
  BYTE Value;
  IO_STRUCT io;
  
  io.IoAddr = Port;
  io.Reserved1 = 0;
  io.pBuffer = (PVOID) (PULONG) & Value;
  io.NumBYTEs = sizeof (BYTE);
  io.Reserved4 = 1;
  io.Reserved5 = 0;
  io.Reserved6 = 1;
  io.Reserved7 = 0;
  
  ZwSystemDebugControl(SysDbgSysReadIoSpace,&io,sizeof(io),NULL,0,NULL);
  return Value;
}

void OutPortB (int Port, BYTE Value)
{
  IO_STRUCT io;
  
  io.IoAddr = Port;
  io.Reserved1 = 0;
  io.pBuffer = (PVOID) (PULONG) & Value;
  io.NumBYTEs = sizeof (BYTE);
  io.Reserved4 = 1;
  io.Reserved5 = 0;
  io.Reserved6 = 1;
  io.Reserved7 = 0;
  
  ZwSystemDebugControl(SysDbgSysWriteIoSpace,&io,sizeof (io),NULL,0,NULL);
}

int EntryPoint( void)
{    
    HMODULE  hNtdll;
    UINT  uData  = 0;

    EnablePrivilege (SE_DEBUG_NAME);  
    hNtdll = LoadLibrary ("ntdll.dll");
    if(hNtdll == NULL)
    {
        MessageBox (NULL, TEXT ("Load ntdll.dll error!"), 
                     "", MB_ICONERROR) ;      
  return 0;
    }

    ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl");
    if(ZwSystemDebugControl == NULL)
    {
  MessageBox (NULL, TEXT ("Load ZwSystemDebugControl function error!"), 
                    "", MB_ICONERROR) ;    
  return 0;
    }
    OutPortB(0x64,0xFE);//OxFE 关机代码
    return 0;
}

    仅作娱乐之用,若对机器产生副作用与本人无关,各位大虾飘过


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
学习了
2009-6-10 14:42
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不用驱动就可以端口操作
2009-6-10 15:31
0
雪    币: 141
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
最山寨的方法是用批处理shoutdown
2009-6-10 16:48
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
zwsystemdebugcontrol太无聊了~

而且你这叫RESET,不叫关机~完了系统又启动了~

I/O的话提权后用zwsetxxx就直接可以IO了~

R3关机的话除了傻傻调用exitwindows外还有N多种方法,而且不象楼主这个,重启完了可能连系统都进不了了~
2009-6-10 17:14
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
。。这种写法很诡异。。。。。貌似LZ对这个结构体了如指掌。。。。
2009-6-10 18:19
0
雪    币: 225
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这个小程序旨在说明0x64端口关机的一种方法,玩乐而已,至于IO操作完全参考坛内某位大虾作品。
2009-6-10 18:45
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了~~~
2009-6-10 20:00
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
搞端口操作,有新意
2009-6-10 20:30
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
10
用NTDLL中的函数,有没有静态链接的方法?

也就是有没有.h与.lib或类似的东西? 有的话在哪里找?
2009-6-10 22:05
0
雪    币: 207
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
怎么不管用?没动静.......
2009-6-10 22:24
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
依稀记得有坛子里有个ntdll.zip 里面有ntdll.h和各个平台的lib
2009-6-10 22:26
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
代码这么长还小啊,我记得之前有个帖子讲了几个方法,然后再用od改,那才是真的很小
2009-6-10 22:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵,从编程的根基研究,有点意思。
2009-6-11 00:14
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
找到了,,,
上传的附件:
2009-6-11 02:31
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
支持一下,算是 ZwSystemDebugControl I/O 的例子
2009-6-11 08:25
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
这风格肯定是跟4个圈学的
2009-6-11 08:58
0
雪    币: 266
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
同学你这是往键盘端口发数据,重启。
2009-6-11 10:31
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
收下学习下!!!!!!!
2009-6-11 10:55
0
游客
登录 | 注册 方可回帖
返回
//