2012胡言乱语 发表于 2017-7-3 10:07:58

原版CGI是怎么打包成单文件?

本帖最后由 2012胡言乱语 于 2017-7-3 10:20 编辑

我在修改CGI时,发现原版cgi打包方式有点特殊。发现原版cgi.exe运行时,不仅会释放文件到%Temp%,并运行pecmd load cgi.wcz,还会判断cgi.exe自身运行目录,并把自身目录的路径保存到一个为cgipath.dat的纯文本,并把cgipath.dat也存到%Temp%下,然后在cgi.wcz里读取cgipath.dat,把这目录存储在变量CGIEXEDir,再在这变量 CGIEXEDir下搜索gho文件 如果有,就会默认在下拉列表里显示这个gho。还会复制自身下的onekey.ini到%Temp%,这是怎么做到的?

试验:1.下载原版cgi,并在同目录下放一个gho,运行cgi 看图


2.解压原版cgi,什么都不修改,在打包成单文件 再运行 就不会显示当前目录下的gho 看图


原因是 我们只是简单打包成单文件 运行时,单文件解压到临时目录后,自动运行pecmd加参数 load cgi.wcz,而原版代码里有这几句 大家看

这个 cgipath.dat 到底怎么来的




527104427 发表于 2017-7-3 16:40:24

2012胡言乱语 发表于 2017-7-3 13:48
去研究研究NSIS打包方法

这个目录可以用PECMD代码获取:

ENVI &fPID=
ENVI &MyDir=
FIND --pid*@.%&__PID% &fPID,
MSTR* * &fTID=<2>&fPID
IFEX $%&fTID%>0,
{*
        ENVI &gPID=
        FIND --pid*@.%&fTID% &gPID,
        MSTR* * &tidFILE=<6>&gPID
        FIND $%&tidFILE%<>%SYSTEMDRIVE%\Windows\Explorer.EXE, FDIR &MyDir=%&tidFILE%
}
MESS. cgi源文件目录:%&MyDir%\


注意:64位系统必需用64位PECMD,否则获取不到。



1400700226 发表于 2017-7-3 12:03:15

作者应该是用NSIS打包的。

tzj_2 发表于 2017-7-3 13:02:29

如果是自释放单文件,应该是用NSIS打包的。

2012胡言乱语 发表于 2017-7-3 13:45:34

kcyou 发表于 2017-7-3 12:29
让原版释放到%temp%,解密CGI.WCZ,删除file cgipath.dat 相关,运行后并没发现CGIPATH.DAT,不知CGIPATH.DAT ...

CGIPATH.DAT内容肯定是cgi本身运行的目录名, 比如cgi在桌面运行,CGIPATH.DAT的内容是"C:\Users\Administrator\Desktop",而CGIPATH.DAT是怎么生成的,猜测应该是打包工具里的代码生成的,举例:主程序在释放CLDStandard文件夹到TEMP后 在判断自身目录 并自动生成CGIPATH.DAT到%TEMP%\CLDStandard,还要判断自身目录里有没有onekey.ini无人值守文件,如果有 一并复制到%TEMP%\CLDStandard里, 最后在运行CLDStandard里的pecmd加参数LOAD CGI.WCZ。

发没发现 被我们重新打包后 onekey.ini都不管用, 因为cgi.wcz里 IFEX onekey.ini, TEAM ENVI &FromConfig=1|ENVI &KillVD=1|FILE cgipath.dat|CALL GetGHOConfig! CALL @MHGHO2012
cgi.wcz判断有没有onekey.ini,都是相对于释放后的目录 %TEMP%\CLDStandard,




2012胡言乱语 发表于 2017-7-3 13:48:15

去研究研究NSIS打包方法

2012胡言乱语 发表于 2017-7-3 19:57:33

527104427 发表于 2017-7-3 16:40
这个目录可以用PECMD代码获取:

ENVI &fPID=


谢谢五大的代码,刚才测试了一下代码果然有用{:3_138:}
页: [1]
查看完整版本: 原版CGI是怎么打包成单文件?