无忧启动论坛

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

[分享] PECMD 处理脱机注册表封装函数

[复制链接]
跳转到指定楼层
1#
发表于 昨天 21:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
读取脱机注册表文件的目标注册表项的值的数据
  1. ;GetOffRegData 封装函数用于读取脱机注册表文件的指定的数据(此封装函数仅支持读取 REG_SZ, REG_EXPAND_SZ, REG_DWORD 和 REG_QWORD 类型)
  2. ;第一个参数为目标脱机注册表配置单元文件的路径
  3. ;第二个参数为要查询数据的注册表项
  4. ;第三个参数为要查询数据的值名称
  5. ;第四个参数为接收返回的注册表项值的数据
  6. _SUB GetOffRegData
  7.     TEAM ENVI &HiveFile=%~1| ENVI &SubKey=%~2| ENVI &Value=%~3| ENVI-ret %~4=
  8.     IFEX #%&bX64%=3, Set &PtrSz=8! SET &PtrSz=4
  9.    
  10.     IFEX %&HiveFile%,! EXIT _SUB
  11.     ENVI$# &phHive=*%&PtrSz% 0
  12.     CALL $--qd --ret:&ret offreg.dll,OROpenHive,$%&HiveFile%,*&phHive
  13.     IFEX $%&ret%=0,
  14.     {
  15.         ENVI?int &phHive=&hHive
  16.         ENVI$# &phKey=*%&PtrSz% 0
  17.         CALL $--qd --ret:&ret offreg.dll,OROpenKey,#%&hHive%,$%&SubKey%,*&phKey
  18.         IFEX $%&ret%=0,
  19.         {
  20.             ENVI?int &phKey=&hKey
  21.             ENVI$# &pDataSize=*%&PtrSz% 0
  22.             CALL $--qd --ret:&ret offreg.dll,ORGetValue,#%&hKey%,#0,$%&Value%,#0,#0,*&pDataSize
  23.             IFEX $%&ret%=0,
  24.             {
  25.                 ENVI$# &pDataType=*%&PtrSz% 0
  26.                 ENVI?int &pDataSize=&DataSize
  27.                 ENVI$# &pData=*%&DataSize% 0
  28.                 CALL $--qd --ret:&ret offreg.dll,ORGetValue,#%&hKey%,#0,$%&Value%,*&pDataType,*&pData,*&pDataSize
  29.                 IFEX $%&ret%=0,
  30.                 {
  31.                     ENVI?int &pDataType=&DataType
  32.                     IFEX [ $%&DataType%=1 | $%&DataType%=2 ],ENVI-ret %~4=%&pData%
  33.                     IFEX $%&DataType%=4,TEAM ENVI?long &pData=&Data| ENVI-ret %~4=%&Data%
  34.                     IFEX $%&DataType%=11,TEAM ENVI?longlong &pData=&Data| ENVI-ret %~4=%&Data%
  35.                 }
  36.             }
  37.             CALL $--qd --ret:&ret offreg.dll,ORCloseKey,#%&hKey%
  38.         }
  39.         CALL $--qd --ret:&ret offreg.dll,ORCloseHive,#%&hHive%
  40.     }
  41. _END

  42. ;示例
  43. CALL GetOffRegData "D:\config\SOFTWARE" "Microsoft\Windows NT\CurrentVersion" ProductName &Data
  44. MESS %&Data%
复制代码
创建/修改脱机注册表文件的注册表项的数据
  1. ;SetOffRegData 封装函数用于创建/修改脱机注册表文件的注册表项的数据
  2. ;第一个参数为目标脱机注册表配置单元文件的路径
  3. ;第二个参数为目标注册表子项
  4. ;第三个参数为目标值名称
  5. ;第四个参数为目标注册表数据的类型(当前仅支持 REG_SZ, REG_EXPAND_SZ, REG_DWORD 和 REG_QWORD 类型)
  6. ;第五个参数为要写入的注册表数据
  7. ;第六个参数为可选参数, 用于接收封装函数执行的返回值, 值 1 为执行成功, 值 0 为执行失败
  8. ;PS: 若要写入大量脱机注册表数据, 应尽量减少对 ORSaveHive 函数的调用;
  9. ;    应先多次调用 ORCreateKey(OROpenKey), ORSetValue 和 ORCloseKey 函数以写入所有想要写入的数据, 最后才调用 ORSaveHive 函数进行保存;
  10. ;    一般来说, 对每个注册表配置单元文件的修改, 应仅调用一次 OROpenHive, ORSaveHive 和 ORCloseHive 函数
  11. _SUB SetOffRegData
  12.     TEAM ENVI &HiveFile=%~1| ENVI &SubKey=%~2| ENVI &Value=%~3| ENVI &Type=%~4| ENVI &Data=%~5| ENVI-ret %~6=0
  13.     IFEX #%&bX64%=3, Set &PtrSz=8! SET &PtrSz=4
  14.    
  15.     IFEX %&HiveFile%,! EXIT _SUB
  16.     ENVI$# &phHive=*%&PtrSz% 0
  17.     CALL $--qd --ret:&ret offreg.dll,OROpenHive,$%&HiveFile%,*&phHive
  18.     IFEX $%&ret%=0,
  19.     {
  20.         ENVI?int &phHive=&hHive
  21.         ENVI$# &phKey=*%&PtrSz% 0
  22.         ENVI &WriteData=0
  23.         CALL $--qd --ret:&ret offreg.dll,ORCreateKey,#%&hHive%,$%&SubKey%,#0,#0,#0,*&phKey,#0
  24.         IFEX $%&ret%=0,
  25.         {
  26.             ENVI?int &phKey=&hKey
  27.             FIND $%&Type%=REG_SZ,
  28.             {
  29.                 STRL * &Len=&Data
  30.                 CALC #&Len = %&Len% * 2
  31.                 CALL $--qd --ret:&ret offreg.dll,ORSetValue,#%&hKey%,$%&Value%,#1,*&Data,#%&Len%
  32.                 IFEX $%&ret%=0,ENVI &WriteData=1
  33.             }
  34.             FIND $%&Type%=REG_EXPAND_SZ,
  35.             {
  36.                 STRL * &Len=&Data
  37.                 CALC #&Len = %&Len% * 2
  38.                 CALL $--qd --ret:&ret offreg.dll,ORSetValue,#%&hKey%,$%&Value%,#2,*&Data,#%&Len%
  39.                 IFEX $%&ret%=0,ENVI &WriteData=1
  40.             }
  41.             FIND $%&Type%=REG_DWORD,
  42.             {
  43.                 TEAM ENVI$# &Buffer=*4 0| ENVI-long &Buffer=%&Data%
  44.                 CALL $--qd --ret:&ret offreg.dll,ORSetValue,#%&hKey%,$%&Value%,#4,*&Buffer,#4
  45.                 IFEX $%&ret%=0,ENVI &WriteData=1
  46.             }
  47.             FIND $%&Type%=REG_QWORD,
  48.             {
  49.                 TEAM ENVI$# &Buffer=*8 0| ENVI-longlong &Buffer=%&Data%
  50.                 CALL $--qd --ret:&ret offreg.dll,ORSetValue,#%&hKey%,$%&Value%,#11,*&Buffer,#8
  51.                 IFEX $%&ret%=0,ENVI &WriteData=1
  52.             }
  53.             CALL $--qd --ret:&ret offreg.dll,ORCloseKey,#%&hKey%
  54.         }
  55.         IFEX $%&WriteData%=1,
  56.         {
  57.             TEAM ENVI$# &pMajorVersion=*4 0| ENVI$# &pMinorVersion=*4 0
  58.             CALL $--qd --ret:&ret ntdll.dll,RtlGetNtVersionNumbers,*&pMajorVersion,*&pMinorVersion,#0
  59.             TEAM ENVI?long &pMajorVersion=&MajorVersion| ENVI?long &pMinorVersion=&MinorVersion
  60.             FILE %&HiveFile%->%&HiveFile%_bak
  61.             CALL $--qd --ret:&ret offreg.dll,ORSaveHive,#%&hHive%,$%&HiveFile%,#%&MajorVersion%,#%&MinorVersion%
  62.             IFEX $%&ret%=0,
  63.             {
  64.                 FILE %&HiveFile%_bak
  65.                 ENVI-ret %~6=1
  66.             }!
  67.             {
  68.                 FILE %&HiveFile%_bak->%&HiveFile%
  69.                 ENVI-ret %~6=0
  70.             }
  71.         }
  72.         CALL $--qd --ret:&ret offreg.dll,ORCloseHive,#%&hHive%
  73.     }
  74. _END

  75. ;示例
  76. CALL SetOffRegData "D:\Temp\SOFTWARE" "Test" WriteRegData REG_DWORD 0xFF &RetVal
  77. IFEX $%&RetVal%=1,MESS 成功修改脱机注册表数据! MESS 无法修改脱机注册表数据
复制代码
枚举脱机注册表文件的指定的注册表项的子项
  1. ;EnumOffRegValue 封装函数用于枚举脱机注册表文件的指定的注册表项的子项
  2. ;第一个参数为目标脱机注册表配置单元文件的路径
  3. ;第二个参数为要枚举其子项的注册表项
  4. ;第三个参数为接收返回的子项数据
  5. _SUB EnumOffRegKey
  6.     TEAM ENVI &HiveFile=%~1| ENVI &SubKey=%~2| ENVI-ret %~3=
  7.     TEAM SET$ &NL=0d 0a| ENVI &KeyList=
  8.     IFEX #%&bX64%=3, SET &PtrSz=8! SET &PtrSz=4
  9.     IFEX %&HiveFile%,! EXIT _SUB
  10.     ENVI$# &phHive=*%&PtrSz% 0
  11.     CALL $--qd --ret:&ret offreg.dll,OROpenHive,$%&HiveFile%,*&phHive
  12.     IFEX #%&ret%=0,
  13.     {
  14.         ENVI?int &phHive=&hHive
  15.         ENVI$# &phKey=*%&PtrSz% 0
  16.         CALL $--qd --ret:&ret offreg.dll,OROpenKey,#%&hHive%,$%&SubKey%,*&phKey
  17.         IFEX #%&ret%=0,
  18.         {
  19.             ENVI?int &phKey=&hKey
  20.             TEAM ENVI$# &pKeyCount=*4 0| ENVI$# &pMaxSubKeyLen=*4 0
  21.             CALL $--qd --ret:&ret offreg.dll,ORQueryInfoKey,#%&hKey%,0,0,*&pKeyCount,*&pMaxSubKeyLen,0,0,0,0,0,0
  22.             IFEX #%&ret%=0,
  23.             {
  24.                 TEAM ENVI?int &pKeyCount=&KeyCount| ENVI?int &pMaxSubKeyLen=&MaxSubKeyLen
  25.                 CALC #&KeySize = %&MaxSubKeyLen% * 2
  26.                 ENVI &Index = 0
  27.                 LOOP #%&Index%<%&KeyCount%,
  28.                 {
  29.                     ENVI$# &KeyName=*%&KeySize% 0
  30.                     SET-int &pKeySize=%&KeySize%
  31.                     CALL $--qd --ret:&ret offreg.dll,OREnumKey,#%&hKey%,#%&Index%,*&KeyName,*&pKeySize,0,0,0
  32.                     IFEX #%&ret%=0,ENVI &KeyList=%&KeyList%%&KeyName%%&NL%
  33.                     CALC #&Index = %&Index% + 1
  34.                 }
  35.             }
  36.             CALL $--qd --ret:&ret offreg.dll,ORCloseKey,#%&hKey%
  37.         }
  38.         CALL $--qd --ret:&ret offreg.dll,ORCloseHive,#%&hHive%
  39.     }
  40.     ENVI-ret %~3=%&KeyList%
  41. _END

  42. ;示例
  43. CALL EnumOffRegKey "H:\Win11PE\Windows\System32\config\SOFTWARE" "Microsoft\Windows NT\CurrentVersion\ProfileList" &SubKeys
  44. MESS %&SubKeys%
复制代码
PS: 据网友"秋刀鱼"说, 此封装函数偶尔会返回空值


我用 PECMD 封装了一个枚举脱机注册表文件的指定注册表项的值的函数, 但无法成功调用 OREnumValue 函数, 因此就不提供此封装函数
(我用其它脚本编程语言也封装了这么一个函数却是能够成功调用 OREnumValue 函数, 而 PECMD 却是失败, 用 PECMD 编写代码真的搞到头晕)
2#
发表于 昨天 21:58 | 只看该作者
感谢分享!
回复

使用道具 举报

3#
发表于 昨天 22:09 | 只看该作者
了解
回复

使用道具 举报

4#
发表于 昨天 22:49 | 只看该作者
支持原创
回复

使用道具 举报

5#
发表于 9 小时前 | 只看该作者
把  OREnumValue  的PECMD脚本发上来,分析分析
回复

使用道具 举报

6#
发表于 7 小时前 | 只看该作者
本帖最后由 527104427 于 2026-1-18 07:08 编辑

OREnumValue 我这可以啊。对楼主的脚本进行升级改造,以求囊括全部注册表类型:









读写脱机注册表.7z (3.93 KB, 下载次数: 7)



回复

使用道具 举报

7#
发表于 4 小时前 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

8#
发表于 4 小时前 | 只看该作者
感谢分享
回复

使用道具 举报

9#
发表于 1 小时前 | 只看该作者
前几楼,大神打架。
牛逼
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2026-1-18 11:33

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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