找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 124|回复: 3

办公软件WPS的JSA中实现注销/重启/关机

[复制链接]
发表于 昨天 16:51 | 显示全部楼层 |阅读模式
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现

  操作前请先保存好数据!

执行前面三个函数可看到效果:
  1. function 注销测试(){let 注销=0;操作系统动作(注销);}
  2. function 重启测试(){let 重启=2;操作系统动作(重启);}
  3. function 关机测试(){let 关机=1;操作系统动作(关机);}

  4. function 操作系统动作(动作){
  5.         let 当前进程伪句柄=获取当前进程();
  6.         let 调整权限=0x20;
  7.         let 当前进程令牌=打开进程令牌(获取当前进程(),调整权限);        //一、获取令牌
  8.        
  9.         let 内存句柄=申请本地内存(16);        //令牌特权结构16字节
  10.         let 内存地址=锁定本地内存(内存句柄);        //用于写入
  11.         let 条目数=1,特权开启=2;
  12.         数组写入内存(内存地址,[条目数]);数组写入内存(内存地址+12,[特权开启]);        //写入条目数与属性
  13.         let 系统关闭特权="SeShutdownPrivilege";
  14.         let 获取结果=获取特权标志符(系统关闭特权,内存地址+4);        //二、获取LUID:本地标号 在 令牌特权结构 中偏移4字节
  15.         解锁本地内存(内存句柄);

  16.         内存地址=锁定本地内存(内存句柄);        //用于读取
  17.         let 修改结果=修改令牌特权(当前进程令牌,内存地址);        //三、修改令牌权限
  18.         解锁本地内存(内存句柄);释放本地内存(内存句柄);
  19.        
  20.         let 注销=0,重启=2,关机=1,关闭电源=8;let 强制=4,超时强制=0x10;
  21.         let 操作系统原因=0x20000,其他计划关闭=0x80000000;
  22.         let 操作=动作|超时强制,原因=操作系统原因|其他计划关闭;
  23.         let 动作结果=系统关闭操作(操作,原因);        //四、系统操作
  24. }
复制代码


其他用到的函数:
  1. function 获取当前进程(){        //返回进程伪句柄
  2.         const 执行宏调用=ExecuteExcel4Macro;
  3.         let 进程伪句柄=执行宏调用(`CALL("Kernel32","GetCurrentProcess","J")`);
  4.         return 进程伪句柄;
  5. }
  6. function 打开进程令牌(进程句柄,访问类型){        //关机、重启、注销
  7.         const 执行宏调用=ExecuteExcel4Macro;
  8.         let 令牌句柄=执行宏调用(`CALL("Advapi32","OpenProcessToken","3JJN",${进程句柄},${访问类型},0)`);
  9.         return 令牌句柄;
  10. }
  11. function 获取特权标志符(特权名,本地标号地址){        //本地标号(本地唯一标识符LUID)占64位,即8字节。
  12.         const 执行宏调用=ExecuteExcel4Macro;
  13.         let 获取结果=执行宏调用(`CALL("Advapi32","LookupPrivilegeValueA","AJFJ",0,"${特权名}",${本地标号地址})`);
  14.         return 获取结果;
  15. }
  16. function 修改令牌特权(令牌号,新特权地址){
  17.         const 执行宏调用=ExecuteExcel4Macro;
  18.         let 修改结果=执行宏调用(`CALL("Advapi32","AdjustTokenPrivileges","AJAJJJJ",${令牌号},0,${新特权地址},0,0,0)`);
  19.         return 修改结果;
  20. }
  21. function 系统关闭操作(操作,原因){        //关机、重启、注销
  22.         const 执行宏调用=ExecuteExcel4Macro;
  23.         let 注销=0,重启=2,关机=1,关闭电源=8;let 强制=4,超时强制=0x10;
  24.         let 操作结果=执行宏调用(`CALL("User32","ExitWindowsEx","AJJ",${操作},${原因})`);
  25.         return 操作结果;
  26. }

  27. function 申请本地内存(字节数){        //返回内存句柄
  28.         const 执行宏调用=ExecuteExcel4Macro;
  29.         const 内存句柄=执行宏调用(`CALL("Kernel32","LocalAlloc","JJJ",2,${字节数})`);
  30.         if(内存句柄){
  31.                 return 内存句柄;
  32.         }else{console.log("未能分配内存!");}
  33. }
  34. function 释放本地内存(内存句柄){
  35.         const 执行宏调用=ExecuteExcel4Macro;
  36.         执行宏调用(`CALL("Kernel32","LocalFree","JJ",${内存句柄})`);        //释放内存
  37. }
  38. function 锁定本地内存(内存句柄){        //返回内存地址
  39.         const 执行宏调用=ExecuteExcel4Macro;
  40.         const 内存地址=执行宏调用(`CALL("Kernel32","LocalLock","JJ",${内存句柄})`);
  41.         if(内存地址){
  42.                 return 内存地址;
  43.         }else{console.log("未找到内存地址!");}
  44. }
  45. function 解锁本地内存(内存句柄){
  46.         const 执行宏调用=ExecuteExcel4Macro;
  47.         执行宏调用(`CALL("Kernel32","LocalUnlock","JJ",${内存句柄})`);        //解锁
  48. }

  49. function 数组写入内存(内存地址,数组){
  50.         const 执行宏调用=ExecuteExcel4Macro,写入字节=4;
  51.         for(let 偏移=i=0;i<数组.length;i++){        //写入
  52.                 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${数组[i]},${写入字节})`);
  53.                 偏移+=写入字节;
  54.         }
  55. }
复制代码


评分

参与人数 1无忧币 +5 收起 理由
zhanglei1371 + 5

查看全部评分

发表于 昨天 17:22 | 显示全部楼层
一起浇一浇,灌一灌,预祝一天心情好!
回复

使用道具 举报

发表于 昨天 18:09 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 昨天 18:44 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-7-11 01:12

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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