本帖最后由 yunyan100 于 2019-5-8 12:33 编辑

增加reg2nsi,发现问题:开始最后00没有清除,用上"IntFmt $R1 %c $R1"居然清除了,还有就是要数字转回字符(E:\Users\Default ),有高手指导下
.reg
  1. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList]
  2. "Default"=hex(2):45,00,3a,00,5c,00,55,00,73,00,65,00,72,00,73,00,5c,00,44,00,\
  3.   65,00,66,00,61,00,75,00,6c,00,74,20,00,00
复制代码


.nsi没清除最后一组
  1. WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "Default" "453a5c55736572735c44656661756c742000"
复制代码

.nsi已清除
  1. WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "Default" "453a5c55736572735c44656661756c7420"
复制代码

1.png

  1.         StrCpy $R1 $R0 7
  2.         StrCmp $R1 "hex(2):" expand
复制代码
  1. expand:
  2.         StrCpy $R0 $R0 "" 7
  3.         StrCmp $R0 "" 0 +3
  4.         Goto done
  5.                 StrCpy $R1 0
  6.         loopa:
  7.                 StrCpy $R2 $R0 1 $R1
  8.                 StrCmp $R2 "," converta
  9.                 StrCmp $R2 "" loop_quita
  10.                 IntOp $R1 $R1 + 1
  11.                 Goto loopa
  12.         converta:
  13.         StrCpy $R2 $R0 $R1
  14.         IntOp $R1 $R1 + 1
  15.         StrCpy $R0 $R0 "" $R1
  16.         StrCpy $R0 $R2$R0
  17.         Goto loopa
  18.         loop_quita:
  19.         StrCpy $R1 0
  20.         loopb:
  21.         StrCpy $R2 $R0 2 $R1
  22.                 StrCmp $R2 "00" convertb
  23.                 StrCmp $R2 "" loop_quitb
  24.                 IntOp $R1 $R1 + 2
  25.                 Goto loopb
  26.                 convertb:
  27.         StrCpy $R2 $R0 $R1
  28.         IntOp $R1 $R1 + 2
  29.         StrCpy $R0 $R0 "" $R1
  30.         IntFmt $R1 %c $R1 ;最后00删除了
  31.         StrCpy $R0 $R2$R0
  32.         Goto loopb
  33.         loop_quitb:
  34.         StrCpy $R0 'WriteRegExpandStr $9 "$8" "$7" "$R0"'
  35.         Goto done
复制代码





参与人数 1金钱 +30 收起 理由
flighty + 30 很给力!

查看全部评分总评分 : 金钱 +30

回复

使用道具 举报

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

    本版积分规则

    该用户从未签到

    1

    主题

    150

    帖子

    778

    积分

    积分
    778

    NSIS元老

    发表于 2019-6-13 14:48:24 | 显示全部楼层
    沙发
    本帖最后由 jiake 于 2019-6-13 15:01 编辑

    第一段文字我没看明白,不过从注册表 reg 文件的内容开始,就有很多错误。

    1. 注册表存储的字符串都是 Unicode 编码,且必须包含尾 0 字符,reg 文件中也是以 Unicode 编码字节序列来存储的。

    字符串 E:\Users\Default 的 Unicode 编码是:
    1. 0x0045, 0x003a, 0x005c, 0x0055, 0x0073, 0x0065, 0x0072, 0x0073, 0x005c, 0x0044, 0x0065, 0x0066, 0x0061, 0x0075, 0x006c, 0x0074, 0x0000
    复制代码
    而 Windows 系统运行的 CPU 字节序是小端模式,因此转换为二进制应该是:
    1. 45, 00, 3a, 00, 5c, 00, 55, 00, 73, 00, 65, 00, 72, 00, 73, 00, 5c, 00, 44, 00, 65, 00, 66, 00, 61, 00, 75, 00, 6c, 00, 74, 00, 00, 00
    复制代码
    没带 0x 前缀,以便与 reg 文件中的格式一致。

    2. reg 文件该字符串的最后四个字节是 74,00,00,00,不含尾 0 则是 74,0074,20,00,00 是什么情况?

    REG_SZ(WriteRegStr)和 REG_EXPAND_SZ(WriteRegExpandStr)在注册表中存储的内容实际上是一样的,仅类型不同,虽然在 reg 文件中的表现差异巨大。区别是 REG_EXPAND_SZ 告诉系统该路径字符串中包含环境变量。比如你以 WriteRegStr 写入 %WINDIR%\notepad.exe 系统是无法识别的,使用 WriteRegExpandStr 系统可以识别。NSIS 中使用 WriteRegExpandStr 是直接写明文的,不需要写二进制:
    1. WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "Default" "E:\Users\Default"
    复制代码
    你说的该不会是 WriteRegBin 吧?

    实测了一下发现你的问题是这样复现的:如果你从 reg 文件或写入的二进制中去掉尾零,即直接以 74,00 结尾,则注册表编辑器中显示的字符串反而会多出一个空格来。如果你在注册表编辑器中查看该值,接着点击确认,即直接保存了,而后又将其导出为 reg 文件,其末尾又变成了 74,00,20,00,00,00,不仅不对,也不是你的 74,20,00,00,中间的 20,00 就是那个空格字符串,本不应该存在的。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-14 15:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    15

    帖子

    220

    积分

    积分
    220
     楼主| 发表于 2019-6-18 20:19:42 | 显示全部楼层
    板凳
    jiake 发表于 2019-6-13 14:48
    第一段文字我没看明白,不过从注册表 reg 文件的内容开始,就有很多错误。

    1. 注册表存储的字符串都是 Uni ...

    hi.注册表里导出*.reg文件里如上图"Default"=hex(2)...,reg2nsi里没有WriteRegExpandStr.....这个,试着补充这个,将*.reg转换*.nsi
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-14 15:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    15

    帖子

    220

    积分

    积分
    220
     楼主| 发表于 2019-6-18 20:22:10 | 显示全部楼层
    地板
    jiake 发表于 2019-6-13 14:48
    第一段文字我没看明白,不过从注册表 reg 文件的内容开始,就有很多错误。

    1. 注册表存储的字符串都是 Uni ...

    下面这个这是从*.reg想得到的,

    1. WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "Default" "E:\Users\Default"
    复制代码
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    150

    帖子

    778

    积分

    积分
    778

    NSIS元老

    发表于 2019-6-27 17:26:47 | 显示全部楼层
    5#
    把你的 reg2nsi 发出来,或者给个地址,我来改一下。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-14 15:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    15

    帖子

    220

    积分

    积分
    220
     楼主| 发表于 2019-6-28 09:06:09 | 显示全部楼层
    6#
    谢谢了,

    REG2NS~1.RAR

    56.88 KB, 下载次数: 2

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-14 15:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    15

    帖子

    220

    积分

    积分
    220
     楼主| 发表于 2019-6-28 09:26:31 | 显示全部楼层
    7#
    jiake 发表于 2019-6-27 17:26
    把你的 reg2nsi 发出来,或者给个地址,我来改一下。

    这个是改的

    reg2nsi.nsi

    14.76 KB, 下载次数: 1

    回复 支持 反对

    使用道具 举报

    Archiver|手机版|小黑屋|联系我们|NSIS中文论坛    

      © 2015-2019 nsisfans.com