设为首页 收藏本站

NSIS中文论坛

查看: 152|回复: 1

[源码] reg2nsi支持WriteRegExpandStr下的问题

[复制链接]
  • TA的每日心情
    开心
    2016-2-14 15:53
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    10

    帖子

    158

    积分

    积分
    158
    发表于 2019-5-7 14:49:35 | 显示全部楼层 |阅读模式
    本帖最后由 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 很给力!

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    148

    帖子

    762

    积分

    积分
    762

    NSIS元老

    发表于 4 天前 | 显示全部楼层
    本帖最后由 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 就是那个空格字符串,本不应该存在的。

    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2019-6-17 23:43 , Processed in 0.024239 second(s), 16 queries , MemCache On.

    Powered by Discuz!X3.3

    Copyright © 2015-2018 NSIS中文论坛

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