`

关于从WEB服务器自动下载安装可执行性文件的方法

阅读更多

首先,想要在客户端直接执行服务器端的程序,必须做一个ActiveX控件(或者有个打包好的CAB文件也行),为的是能够用网页object。看到以前有高手说过,可以写一个没有任何功能的ActiveX控件,小的认为,如果这样的话,客户机的IE安全设置级别高的话,这个ActiveX控件就很难运行。如果想突破安全级别的限制的话,就必须在控件上下功夫。至于能突破安全级别的控件如何编写,小的在后面再介绍。
其实想直接运行安装程序,也可以不要ActiveX控件,只要一个安装文件就行(和匹配的INF文件),但是,如果这样,就必须使客户机的安全级别降到最低,或者把IE中安全选项:下载未签名的ActiveX,改成启用/提示。
假设现在我们有一个控件了(DLoad.ocx),除了你想在客户机上运行的Setup.exe文件我们还需要一个Setup.inf文件。这个inf文件如何编写,请看下面的例子:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
DLoad.ocx=DLoad.ocx
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
setup.exe=setup.exe
[DLoad.ocx]
file-win32-x86=thiscab
clsid={68ADAF59-76C1-4561-A45A-867F43545237}
FileVersion=1,0,0,1
RegisterServer=yes
[msvcrt.dll]
FileVersion=6,0,8168,0
hook=mfc42installer
[mfc42.dll]
FileVersion=6,0,8168,0
hook=mfc42installer
[olepro32.dll]
FileVersion=5,0,4261,0
hook=mfc42installer
[mfc42installer]
file-win32-x86=VALUE=mfc42.cab
run= %EXTRACT_DIR% \mfc42.exe
[dotnetfx.exe]
file=thiscab
RegisterServer=yes
[Setup Hooks]
hook=setup
[setup]
run=%EXTRACT_DIR%\setup.exe
以上控件是使用Visual C++6.0编写的
这里需要说明的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根
据VC不同的版本而异的,例如在VC5.0sp3中就应该如下
olepro32.dll 5,0,4230,1
mfc42.dll 4,21,0,7303
msvcrt.dll 5,0,0,7303
每个VC版本都有不同的版本号,这里只介绍常见的两种。
这里的clsid是从那得到的呢?是在你生成OCX的目录中.odl文件中得到的,注意,
打开这个文件后,我们可以看到四个clsid,最上面那个带有Version值的才是我们
需要的。这个clsid非常重要,它最终会注册到注册表里,提供版本的验证功能。只
有当程序发现你的注册表里没有这个clsid的时候,它才会自动安装。如果你安装了
一次,再安装一次的话,安装包(CAB)会发现注册表里有了这个clsid,它就不会
重复安装了。在mfc42installer里的mfc42.cab文件是需要下载的,下载地址:
http://activex.microsoft.com/controls/vc/mfc42.cab
另外mfc42installer的下载路径除了VC4.1和更早版本使用
http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用
http://activex.microsoft.com/controls/vc/mfc42.cab。
下载完之后,把这个文件放在你的执行目录下就行了。
在这个inf例子中,包含了DLoad.ocx和setup.exe两个文件的信息。如果只单纯
执行OCX文件,他有关setup.exe的信息剔除就行了。
我们的inf文件编写完成,下面我们就要进行最重要的一步工作,把这些文件打
包成一个CAB文件。可以用VB和VS7.0自带的打包工具。不过我推荐使用WinCAB。这
个工具网上到处都有下载,不过下载安装完成之后,必须把Makecab.exe拷贝到
WinCAB的安装目录下才可运行,Makecab.exe文件在C:\WINNT\system32里。
CAB工具的使用方法:
(1)启动WinCAB,然后执行"Cabinet"菜单的"New"命令或单击快捷工具栏上的
"New cabinet"按钮,准备制作新的CAB压缩包。
(2)单击快捷工具栏上的"Add file(s) to cabinet"按钮,打开"Add file(s)
to cabinet"对话框。
(3)选择欲添加到CAB压缩包中的文件后单击"打开"按钮,将它们添加到WinCAB
的文件列表中。这里只需要添加YourCtl.ocx和YourCtl.inf两个文件。
(4)在WinCAB快捷工具栏的"Cabinet path and name"框中输入或利用"Browse
for path and name"按钮指定CAB压缩包的路径及文件名。
(5)在"Cabinet size"栏中指定CAB压缩包的尺寸。
(6)在"Compression method"框中选择合适的压缩方式。
(7)单击"Save cabinet"按钮,WinCAB即会按照用户的要求进行压缩。
(8)压缩完成后,WinCAB会给出一个"WinCAB Report"的报告框,向广大用户报
告有关文件个数、压缩前后的文件尺寸、压缩率、压缩时间等情况。至此,一个CAB
文件就生成了。

打包完成之后,我们要在网页中调用它了。
<OBJECT classid=clsid:68ADAF59-76C1-4561-A45A-867F43545237
codeBase=http://127.0.0.1/web/setup.cab#version=1,0,0,0>
<PARAM NAME="Setup" VALUE="http://127.0.0.1/web/DLoad.ocx">
</OBJECT>
现在可以马上进行测试,不过要把IE中的安全选项:下载未签名的ActiveX,改成启
用/提示。最好找台没有装3721上网助手(类似软件)的机器上测试。
以上控件的执行有很大局限性,如果安全级别高的话,就很难通过。所以现在介绍
如何突破IE安全级别限制的控件编写。

要包括两个文件

#include "comcat.h"
#include "Objsafe.h"
// 本控件的CLSID,注册表用
const GUID CDECL CLSID_SafeItem =
{ 0x7AE7497B, 0xCAD8, 0x4E66, {

0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };
// 创建组件种类
HRESULT createComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;

hr = CocreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;

// Make sure the HKCR\Component Categories\{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english

// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = ''\0'';

hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();

return hr;
}
// 注册组件种类
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CocreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister,

(void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// 卸载组件种类
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;

hr = CocreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}

if (pcr != NULL)
pcr->Release();

return hr;
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
HRESULT hr;

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::updateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);

// 标记控件初始化安全.
// 创建初始化安全组件种类
hr = createComponentCategory(CATID_SafeForInitializing, L"Controls

safely initializable from persistent data!";
if (FAILED(hr))
return hr;
// 注册初始化安全
hr = RegisterCLSIDInCategory(CLSID_SafeItem,

CATID_SafeForInitializing);
if (FAILED(hr))
return hr;

// 标记控件脚本安全
// 创建脚本安全组件种类
hr = createComponentCategory(CATID_SafeForScripting, L"Controls

safely scriptable!";
if (FAILED(hr))
return hr;
// 注册脚本安全组件种类
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;

return NOERROR;
}
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
HRESULT hr;

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::updateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);

// 删除控件初始化安全入口.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,

CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// 删除控件脚本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;

//////////////////////////
return NOERROR;
}

分享到:
评论

相关推荐

    linux下用apache搭建web服务器扫描.pdf

    Apache 的发展非常快速,从一开始的小型服务器到现在的全球最流行的 Web 服务器软件,Apache 一直保持着领先的地位。 Apache 的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行...

    linux下用apache搭建web服务器.pdf

    安装 Apache 有多种方法,包括使用 Linux 安装程序自动完成安装、使用可执行文件软件包和自行编译 Apache 定制其功能。 在使用 Apache 时,需要提供反映负载要求的额外的磁盘空间和内存空间。 Apache 是世界上用的...

    linux下用apache搭建web服务器借鉴.pdf

    2. 使用可执行文件软件包,这比 较适合那些对编译工作不是太熟悉的初级用户,因为它相对比 较简单。 3. 如果你想把 Apache 服务器充分利用起来的话,就一定要自己编译 Apache 定制其功能。 Apache 的成长历程极富有...

    NTKO附件管理控件

    NTKO附件管理控件(多文件上传...在打开可执行文件时会自动提示警告。 ★ 支持直接从扫描仪输入文件[需要购买扫描支持模块] 通过AddFromScanner方法,控件支持从扫描仪中直接扫描图片到控件中。[需要购买扫描支持模块]

    Ansible-WebServer:用于一台或多台Web服务器(Nginx(前端)+ Apache(后端))的全自动部署的Playbook

    适用于一台或多台Web服务器(Nginx + Apache)的全自动部署的Playbook 用法 安装Ansible: Debian: sudo apt install ansible 运行init.sh并按照说明进行操作: ./init.sh 警告:为了正确执行剧本操作,请勿直接...

    resin-2.1.8服务器

    许多站点都是使用该WEB服务器构建的。 Resin也可以和许多其他的WEB服务器一起工作,比如Apache server和IIS等。Resin支持Servlets 2.3标准和JSP 1.2标准。熟悉ASP和PHP的用户可以发现用Resin来进行JSP编程是件很...

    tomcat技术文档.pdf

    Tomcat 技术文档是关于 Tomcat 服务器的综合性文档,涵盖了 Tomcat 的安装、配置、目录结构、工作模式、Server.xml 配置文件、Web 应用的创建和发布等多方面的知识点。本文档旨在为读者提供一个系统的 Tomcat 技术...

    2022年利用ASPNET建立WEB页面.ppt

    ASPX文件:当WEB服务器定位客户端请求的页面后,如果扩展名是.ASPX,则服务器处理该页面,运行脚本代码,如果代码重来没有编译过,需要先编译再执行,创建HTML文件,并把HTML文件返回给浏览器。 2. Web窗体简介 ...

    Acunetix Web Vulnerability Scanner( 简称AwVS )是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测

    Acunetix Web Vulnerability Scanner[( 简称AwVS )是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测...k)、端口扫描web服务器并对在服务器上运行的网络服务执行安全检查 1)、可导出网站漏洞文件

    使用Subversion进行版本控制(针对 Subversion 1.4)

    文件的可执行性 行结束字符串 忽略未版本控制的条目 关键字替换 锁定 创建锁定 发现锁定 解除和偷窃锁定 锁定交流 外部定义 Peg和实施修订版本 网络模型 请求和响应 客户端凭证缓存 4. 分支与合并 什么是分支? 使用...

    PHP和MySQL Web开发第4版pdf以及源码

    15.8 安全的Web服务器 15.9 审计与日志记录 15.10 防火墙 15.11 备份数据 15.11.1 备份常规文件 15.11.2 备份与恢复MySQL数据库 15.12 自然环境安全 15.13 下一章 第16章 Web应用的安全 16.1处理安全性问题...

    多备份企业文件云备份软件 v2.2.12.0030.zip

    多备份企业文件云备份软件是一款电脑和服务器文件自动定时备份和恢复的数据保护软件,它能实现混合备份,既把数据备份在本地,也能将数据备份到云端;兼容windows、Linux等主流平台。 对比传统文件备份软件,多备份...

    C# Lab C# Web Forms

    * Server-side execution:Web Forms 在服务器端执行代码,提供了更好的安全性和性能。 实验室目标 在完成这个实验室后,您将能够: * 使用 C# 创建动态的 Web 页基于 ASP.NET Web Forms 技术 * 向 Web Form 字段...

    PHP和MySQL WEB开发(第4版)

    16.5.3 Web服务器配置 16.5.4 Web应用的商业主机服务 16.6 数据库服务器的安全性 16.6.1 用户和权限系统 16.6.2发送数据至服务器 16.6.3 连接服务器 16.6.4 运行服务器 16.7 保护网络 16.7.1 安装防火墙 16.7.2使用...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

     本书中的秘诀所覆盖的基础知识包括了从观察客户端和服务器之间的消息到使用脚本完成登录并执行Web应用功能的多阶段测试。在本书的最后,你将能够建立精确定位到Ajax函数的测试,以及适用于常见怀疑对象(跨站式脚本...

    Acunetix Web Vulnerability Scanner 11(无解压密码,含破解)

    自动的客户端脚本分析器,允许对 Ajax 和 Web 2.0 应用程序进行安全性测试。 业内最先进且深入的 SQL 注入和跨站脚本测试 高级渗透测试工具,例如 HTTP Editor 和 HTTP Fuzzer 可视化宏记录器帮助您轻松测试 web ...

    caddy:具有自动HTTPS的快速,多平台Web服务器

    最简单的跨平台方法是从下载并将可执行文件放在PATH中。 有关其他安装选项,请参见 。 从源代码构建 要求: 为了发展 注意:这些步骤。 为此,请按照下一节中的说明进行操作。 $ git clone " https://github.co

    云顿服务器安全加固.rar

    云顿服务器安全加固系统(eisafe safety system server,简称:eisafe safety) 是云顿科技自主知识产权的安全产品,它是对服务器安全的有效加固、全自动安全加固、一键设置执行处理,从而有效的保护WEB服务器、避免...

    IIS6.0 IIS,互联网信息服务

     第二篇 IIS之FTP服务器 一、建立你的FTP站点 第一个FTP站点(即“默认FTP站点”)的设置方法和更多FTP站点的建立方法请参照前文Web服务器中相关操作执行。需要注意的是,如果你要用一个IP地址对应多个不同的FTP...

Global site tag (gtag.js) - Google Analytics