找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 565|回复: 2

[转载代码] 办公软件WPS的JSA中读取库文件的字符串资源

[复制链接]
发表于 2026-4-30 21:52:42 | 显示全部楼层 |阅读模式
本帖最后由 cutebe 于 2026-4-30 21:56 编辑

模仿以下贴子写一个:        办公软件WPS的JSA中,读取.DLL库文件的字符串资源
PowerShell怎么读取dll文件中的字符串?

  1. function 读取库文件的字符串资源测试(){
  2.         //对应字符串:需要管理员特权        //@%SystemRoot%\System32\ActionCenterCPL.dll,-6
  3.         let 库与字符串资源代号="@%SystemRoot%\\System32\\ActionCenterCPL.dll,-6";
  4.         let 库文件="C:\\Windows\\System32\\ActionCenterCPL.dll";        //@要去除,变量%SystemRoot%要转为实际值
  5.         let 字符串代号=6;        //代号是正数,要去掉符号。代号还可以是1,2,3,……
  6.         console.clear();
  7.         let 模块句柄=以数据方式加载库(库文件);
  8.         console.log("模块句柄:"+模块句柄);
  9.         let 字符串=读取库中字符串资源(模块句柄,字符串代号);
  10.         console.log("读取动态库文件中的字符串资源:\n"+库与字符串资源代号+"\n读出字符串:"+字符串)
  11.         释放库(模块句柄);
  12. }

  13. function 以数据方式加载库(库文件){
  14.         let 数据方式=0x2;
  15.         const 执行宏调用=ExecuteExcel4Macro;
  16.         let 模块句柄=执行宏调用(`CALL("Kernel32","LoadLibraryExA","JFJJ","${库文件}",0,${数据方式})`);
  17.         if(!模块句柄){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
  18.         return 模块句柄;
  19. }
  20. function 读取库中字符串资源(模块句柄,字符串代号){
  21.         const 执行宏调用=ExecuteExcel4Macro;
  22.         let 字节数=255;
  23.         let 内存地址=申请虚拟内存(字节数+1);
  24.         let 字符串长度=执行宏调用(`CALL("User32","LoadStringA","JJJJJ",${模块句柄},${字符串代号},${内存地址},${字节数})`);
  25.         let 字符串=内存读取字符串(内存地址);
  26.         释放虚拟内存(内存地址);
  27.         return 字符串;
  28. }
  29. function 读取库中字符串资源二(模块句柄,字符串代号){
  30.         const 执行宏调用=ExecuteExcel4Macro;
  31.         let 字符串字节数=255;
  32.         let 内存地址=申请虚拟内存(字符串字节数+1);
  33.         let 字符串=执行宏调用(`CALL("User32","LoadStringA","3JJFJ",${模块句柄},${字符串代号},${内存地址},${字符串字节数})`);
  34.         释放虚拟内存(内存地址);
  35.         return 字符串;
  36. }
  37. function 释放库(模块句柄){
  38.         const 执行宏调用=ExecuteExcel4Macro;
  39.         let 结果=执行宏调用(`CALL("Kernel32","FreeLibrary","AJ",${模块句柄})`);
  40.         return 结果;
  41. }
  42. function 内存读取字符串(内存地址){        //返回字符串
  43.         const 执行宏调用=ExecuteExcel4Macro,段长度=127;
  44.         const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`);        //内存文本字节数
  45.         let 偏移字节=0,文本字符串=分段文本='';
  46.         while(偏移字节<总字节){        //返回字符串F。        //返回超255字节时,也需要分段操作
  47.                 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
  48.                 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length;        //计算字符串字节数
  49.                 文本字符串+=分段文本;
  50.         }
  51.         return 文本字符串;
  52. }
  53. function 申请虚拟内存(字节数){        //返回内存地址
  54.         const 执行宏调用=ExecuteExcel4Macro;
  55.         const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${字节数},${0x3000},4)`);
  56.         return 内存地址;
  57. }
  58. function 释放虚拟内存(内存地址){
  59.         const 执行宏调用=ExecuteExcel4Macro;
  60.         执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`);
  61. }
复制代码
 楼主| 发表于 2026-5-1 15:12:42 | 显示全部楼层
添加识别环境变量功能:
  1. function 读取库文件的字符串资源测试(){
  2.         console.clear();        //对应字符串:更改操作中心设置
  3.         let 库与字符串资源代号="@%SystemRoot%\\System32\\ActionCenterCPL.dll,-8";
  4.         let 文件路径编号=库文件字符串代号(库与字符串资源代号);        //===转换环境变量===//
  5.         let 库文件=文件路径编号[0],字符串代号=文件路径编号[1];        //正数代号。可以是1,2,3,……
  6.        
  7.         let 模块句柄=以数据方式加载库(库文件);
  8.         let 字符串=读取库中字符串资源(模块句柄,字符串代号);
  9.         释放库(模块句柄);
  10.        
  11.         console.log(字符串+"\n"+库与字符串资源代号);        //显示字符串
  12. }

  13. function 库文件字符串代号(注册表字符串){        //返回数组[库文件路径,字符串编号]
  14.         let 路径编号=注册表字符串.split(",");
  15.         let 库环境路径=路径编号[0],字符串编号=Math.abs(路径编号[1]);
  16.         let 环境变量=库环境路径.match(/%(.*?)%/)[1],文件路径=库环境路径.match(/%.*?%(.*)/)[1];
  17.         const 执行宏调用=ExecuteExcel4Macro;
  18.         let 环境路径=执行宏调用(`CALL("Kernel32","GetEnvironmentVariableA","2FFJ","${环境变量}",0,128)`);
  19.         let 库文件路径=环境路径+文件路径;
  20.         return [库文件路径,字符串编号];
  21. }
  22. function 以数据方式加载库(库文件){        //返回库加载后的模块句柄
  23.         let 数据方式=0x2;
  24.         const 执行宏调用=ExecuteExcel4Macro;
  25.         let 模块句柄=执行宏调用(`CALL("Kernel32","LoadLibraryExA","JFJJ","${库文件}",0,${数据方式})`);
  26.         if(!模块句柄){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
  27.         return 模块句柄;
  28. }
  29. function 读取库中字符串资源(模块句柄,字符串代号){
  30.         const 执行宏调用=ExecuteExcel4Macro;
  31.         let 字符串字节数=255;
  32.         let 字符串=执行宏调用(`CALL("User32","LoadStringA","3JJFJ",${模块句柄},${字符串代号},"",${字符串字节数})`);
  33.         return 字符串;
  34. }
  35. function 释放库(模块句柄){
  36.         const 执行宏调用=ExecuteExcel4Macro;
  37.         let 结果=执行宏调用(`CALL("Kernel32","FreeLibrary","AJ",${模块句柄})`);
  38.         return 结果;
  39. }
复制代码
 楼主| 发表于 2026-5-1 18:14:25 | 显示全部楼层

路径有没有环境变量都能识别

如:        @%SystemRoot%\\System32\\ActionCenterCPL.dll,-8
        @C:\\Windows\\System32\\speech\\speechux\\sapi.cpl,-5555

  1. function 读取库文件的字符串资源测试(){
  2.         console.clear();        //对应字符串:更改操作中心设置
  3.         var 库与字符串资源代号="@%SystemRoot%\\System32\\ActionCenterCPL.dll,-8";
  4.         //var 库与字符串资源代号="@C:\\Windows\\System32\\speech\\speechux\\sapi.cpl,-5555";
  5.         let 文件路径编号=库文件字符串代号(库与字符串资源代号);        //===转换环境变量===//
  6.         let 库文件=文件路径编号[0],字符串代号=文件路径编号[1];        //正数代号。可以是1,2,3,……
  7.        
  8.         let 模块句柄=以数据方式加载库(库文件);
  9.         let 字符串=读取库中字符串资源(模块句柄,字符串代号);
  10.         释放库(模块句柄);
  11.         console.log(字符串+"\n"+库与字符串资源代号);        //显示字符串
  12. }

  13. function 库文件字符串代号(注册表字符串){        //返回数组[库文件路径,字符串编号]
  14.         let 路径编号=注册表字符串.split(",");
  15.         let 库环境路径=路径编号[0],字符串编号=Math.abs(路径编号[1]);
  16.         if(库环境路径.slice(0,2)=="@%" || 库环境路径.match(/@[a-zA-z]:\\/)!=null){
  17.                 库环境路径=库环境路径.slice(1);        //去除首字符@
  18.         }
  19.         if(库环境路径.match(/%(.*?)%/)!=null){        //有系统环境变量时转为路径
  20.                 let 环境变量=库环境路径.match(/%(.*?)%/)[1],文件路径=库环境路径.match(/%.*?%(.*)/)[1];
  21.                 const 执行宏调用=ExecuteExcel4Macro;
  22.                 let 环境路径=执行宏调用(`CALL("Kernel32","GetEnvironmentVariableA","2FFJ","${环境变量}",0,128)`);
  23.                 var 库文件路径=环境路径+文件路径;
  24.         }else{var 库文件路径=库环境路径;}
  25.         return [库文件路径,字符串编号];
  26. }
  27. function 以数据方式加载库(库文件){        //返回库加载后的模块句柄
  28.         let 数据方式=0x2;
  29.         const 执行宏调用=ExecuteExcel4Macro;
  30.         let 模块句柄=执行宏调用(`CALL("Kernel32","LoadLibraryExA","JFJJ","${库文件}",0,${数据方式})`);
  31.         if(!模块句柄){console.log("错误代码:"+执行宏调用(`CALL("Kernel32","GetLastError","I")`));}
  32.         return 模块句柄;
  33. }
  34. function 读取库中字符串资源(模块句柄,字符串代号){
  35.         const 执行宏调用=ExecuteExcel4Macro;
  36.         let 字符串字节数=255;
  37.         let 字符串=执行宏调用(`CALL("User32","LoadStringA","3JJFJ",${模块句柄},${字符串代号},"",${字符串字节数})`);
  38.         return 字符串;
  39. }
  40. function 释放库(模块句柄){
  41.         const 执行宏调用=ExecuteExcel4Macro;
  42.         let 结果=执行宏调用(`CALL("Kernel32","FreeLibrary","AJ",${模块句柄})`);
  43.         return 结果;
  44. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-5-25 07:52

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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