在介绍方法之前,首先声明我是个纯粹地、不折不扣地、完完全全地ASP菜鸟,如不是客户所迫,我不会有兴趣去折腾这些对我来说毫无意义的东西(或许某些人对这些很感兴趣,那就另当别论了)。当客户要求我做一个从WEB服务器自动下载安装可执行性文件的页面的时候,我第一感觉这不就是个“木马”吗,我立刻居丧到了极点,玩“木马”的都是高手,我这ASP的小菜鸟能搞定吗?抱着试试看的心态,我首先想到的是赶紧的去黑客网站上溜达溜达,找了一大堆网页上的攻击代码,“挡”下来认真地研究了一番(实践证明,我这项“举措”是得当滴),可研究过后虽然对木马攻击原理有了一个大概的了解,可依然不知道该从何处下手。在各大网站上搜索技术文档,询问了身边所有的ASP高手(所谓的),各大王牌网站ASP论坛的斑竹我基本上也骚扰了一遍,最后,打开QQ,但凡是能跟编程扯上关系的,不管熟悉不熟悉也都OUT过去了信息。一天之后,毫无进展,继续居丧。难道哥们儿这次就栽了?难道哥们儿这次阴沟翻船了?难道要遭客户鄙视了?难道老板又要扣奖金了?难道......他奶奶滴!抱着必死的信心在CSDN上发了个贴,上午回帖的基本上跟我一样都是小鸟,下午有个老兄(此人最终成为救命稻草,正所谓,草不在多,一根就行!)回帖说,论坛曾经有人问过这样的问题,也有的解决了,他让我找找,如果找不到了,他再帮我找(好心人哪啊!感动的我眼泪鼻涕差点没滴到键盘上),我找了一遍,这版面里的贴子乌泱乌泱的,找的我眼直花(或许也是我对论坛不熟悉,以前上大学那会,上CSDN论坛也就是逛逛程序人生、灌水版什么的,看看程序员们讨论一下美女,讨论一下工资、发发牢骚什么的)。这不行,把我累死也找不到呀,我又一次厚颜无耻地以跳楼相威胁,恳求那个老兄帮我找。最终,那个如观世音在世般老兄(观世音!男的?女的?郁闷)贴了个地址(救命的仙丹啊!一想到这,我鼻子就发酸)。我前前后后地把帖子看了八遍。得!有门了。经过我不懈的努力,顽强的意志,整合了此前的一些相关资料,扬弃了一些糟粕,萃取了一些木马程序,最终把这玩意儿搞出来了,一盆美味的“萝卜开会”啊。
这会儿底下肯定有人看烦了,有人或许会大喝:孙子,这是哪跟哪呀,你丫跟这扯什么闲淡呢?倒是说不说呀,怎么招,找抽呢?得得得!您息怒!我说还不成吗?人家奥斯卡领奖不也得扯两句闲淡吗,人家那叫“拔份”,小的我不也想拔这个份吗?

从哪开始说呢?得!我说哪儿,您看哪儿吧,最后您再劳神,把他们整合到一起。毕竟小的是个菜鸟,有说的不对的地方,还得请您及时指正,咱谋求共同进步。
首先,想要在客户端直接执行服务器端的程序,必须做一个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;
}

我知道,一旦突破了IE的安全级别设置,也就变成了一个真正的准木马程序了,请
各位在使用的时候,遵守相关法律,遵守职业道德。我们本着学习的态度去钻研这
些,我不希望看到有些人为非作歹,请各位自重!
特此声明:由该所文引发的一切后果,由阅读者承担,本人不承担一切责任。

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

  1. Web服务器-Apache下载与安装

    前言 Apache服务器的下载安装还是有些步骤的,请看我下面的引导图. 步骤 首先让我们进入Apache官网 http://www.apache.org/ 找到首页最上方的Download. 这里我们 ...

  2. 墨菲的鬼魂重现 / 金蝶ERP 资安大漏洞 (非授权补丁自动下载安装)

    <墨菲定律>(Murphy's Law):Anything that can go wrong will go wrong. :"凡事只要有可能出错,那就一定会出错." ...

  3. ActiveX控件打包成Cab置于网页中自动下载安装

    From: http://www.iteye.com/topic/110834 makeCAB.rar (188.5 KB) [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX ...

  4. 如何解决电脑不停自动下载安装软件问题?

    如何解决电脑不停自动下载安装软件问题? 一.查看网络使用 1.当出现这情况后,我们首先要做的就是查看一下任务管理器里面的网络资源管理,看看是哪个程序,在偷偷的连接网络下载软件,先按住电脑的CTRL+A ...

  5. ActiveX控件打包成Cab置于网页中自动下载安装 (收藏未实践测试)

    from http://blog.csdn.net/htqlhy/article/details/7937897?locationNum=12 [背景]         做过ActiveX控件的朋友都 ...

  6. ActiveX控件打包成Cab置于网页中自动下载安装(转载)

    原文出自http://www.iteye.com/topic/110834 [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,那么用户在客户端就必 ...

  7. 本文讲解使用apt-get 自动下载安装arm-linux-gcc和arm-linux-g++。

    本文讲解使用apt-get 自动下载安装arm-linux-gcc和arm-linux-g++. 使用如下命令进行arm-linux-gcc的安装: sudo apt-get install gcc- ...

  8. web服务器没有对应站点,原因:您的请求在Web服务器中没有找到对应的站点的解决方法...

    宝塔主机面板网站提示您的请求在Web服务器中没有找到对应的站点的解决方法的原因分析及解决方法,环境吧分享BT宝塔面板没有找到站点的原因及解决方法: 宝塔面板报错提示:没有找到站点 宝塔面板没有找到站点 ...

  9. python3.6.6卸载_Python3.6安装卸载、执行命令、执行py文件的方法详解

    Python3.6安装卸载.执行命令.执行py文件的方法详解 开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起, ...

最新文章

  1. TSNE——目前最好的降维方法
  2. C++_布尔类型、枚举类型
  3. 大数据应用之双色球算奖平台总体设计大纲篇一
  4. Convert AS400 Spool to PFD Tools – PDFing
  5. Fix “Windows cannot access the specified device path or file” Error
  6. 文件后缀_电脑文件名的后缀即扩展名的显示和隐藏方法
  7. Promise.all 处理error
  8. python 学习之 PythonBasic2
  9. Linux Swap机制概述
  10. 安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错”
  11. OV2640摄像头模块
  12. 2.12 Excel软件各工作区的显示和隐藏 [原创Excel教程]
  13. 什么是基站定位?基站定位的原理及特点
  14. 安卓桌面html便签,手机桌面便签
  15. 零点起算法44求最小值C语言,【算法链表面试题】面试问题:C语言实现“关… - 看准网...
  16. 2022-3-26JavaSE试卷-答案
  17. 0到π/0到2π,sinⁿx、cosⁿx的定积分
  18. win7 64位搭建scrapy
  19. 五霸七雄 细数ERP春秋(转)
  20. Ubuntu 16.04 RTL8111/8168/8411 不能上网 经常断网解决办法 Author 时鹏亮 | 11/18/2016 = =这奇葩情况发生在从14.04升级到16.04之后,开始以

热门文章

  1. rhel6 上udev的绑定
  2. Microsoft SQL server 2000 安装挂起 mssql 2000 挂起无法安装的问题
  3. 沙漠之旅(二维dp)
  4. 《机器学习实战》chapter 11 使用apriori算法进行关联分析
  5. NYOJ 665 台球碰撞
  6. NYOJ 1066 CO-PRIME(数论)
  7. 论文阅读: Direct Monocular Odometry Using Points and Lines
  8. C# 获取utc时间,以及utc datetime 互相转化
  9. 弄懂CNN,然后提升准确率4.21-4.27
  10. 20155216 2016-2017-2 《Java程序设计》第二周学习总结