Windows黑客编程基础(二)
四、黑客编程的几个基本技巧 s:P.u*seA I以下将要谈到的几个基本技巧很重要,虽然对于编程高手来说这是在玩小孩子把戏,但对于一位初学者,掌握以下几个技巧将为你的编程扫清道路,而且很容易编写出有趣的程序,培养你对编程的兴趣。
技巧⒈学会修改注册表。
相信大家都知道当浏览了一些网页恶意代码,IE标题、默认主页等被改得面目全非,这就是通过改动注册表来更改系统设置的例子。Windows中的注册表是个好东东,它是windows系统的灵魂,是许多软件记录数据的地方(当然也包括windows本身)。windows通过它记录大量的数据,然后在下一次启动时再读取相应的数据来设置系统。通过控制注册表就可以控制整个系统,所以很多的黑客程序都在注册表上动手脚(尤其是木马程序和作恶剧程序),学会修改注册表可以实现一些有趣而强大的功能。我们完全可以通过编程来操作注册表,达到与手动更改注册表编辑器产生一样的效果。“超级兔子”中的大部分功能就是通过修改注册表来完成的。操作注册表有专门的API函数,大家可以参考有关资料,下面笔者以C++ Builder为例说明如何在程序中操作注册表: *@zu)M:iEI
程序二:编程修改IE标题内容 /O1HVJl"m Jt
新建一个工程,在Unit1.h文件中包含Registry单元:
#include <Registry.hpp> %f$mr(?+x1a
然后就可以在.cpp文件操作注册表了,接着来!在窗体的OnCreate()里加入以下代码(你可以在try{}里面加入任何操作注册表的代码):
TRegistry* Registry; 8U;Bsnx~~-I
Registry = new TRegistry();创建一个TRegistry类型的对象Registry,用于修改注册表。
try{
Registry->RootKey = HKEY_CURRENT_USER;//设置主键,这是必不可少的,设置好主键后,就可以操作这个主键下所有的键值了。
if( Registry->OpenKey("Software\\Microsoft\\Internet Explorer\\Main"FALSE))//调用OpenKey()打开括号里所指的键
{ sf'l;\-\2Y+l
Registry->WriteString("Window Title"”台湾是中国的一部分,世界上只有一个中国!”);//调用WriteString()往注册表里写入IE标题 fF(Hn7Leu/~Z
Registry->CloseKey();//关闭该键
} Y&}GuZN(k(j__4j
else
{//如果打开失败的话
Registry->CreateKey("Software\\Microsoft\\Internet Explorer\\Main");//就调用CreateKey()新建上述键
Registry->WriteString("Window Title""台湾是中国的一部分,世界上只有一个中国!");//再写入IE标题内容 O EQ o*t.S
Registry->CloseKey();//最后关闭该键,这个也不能忽视,它跟上面的OpenKey成对使用的 0P"cGrl_b
}//End of try w)A|~'G!J
__finally
{//要是出错,跳到这里处理 h1~4p^s:Z(Y+J(}Z
Registry->CloseKey();//关闭所要打开的键
delete Registry;//销毁Registry对象,释放资源。
} ;USD3g;La
编译运行上面的代码就可以将IE的标题改为“台湾是中国的一部分,世界上只有一个中国!”了。笔者写了个小程序,可以测出当前的IE标题和默认主页是什么,并可随意修改他们,还可以禁止别人修改你的默认主页和注册表编辑器,运行界面如图2所示(详细的代码请参考黑防的光盘)。 ;qn,SQ]}8A(G
图2 J,?f*}CAo
技巧⒉调用API编程 D$jg ?'S#X6k
其实这是最简单的,API是系统在DLL里为我们提供的程序接口,可以直接调用的。只要我们有一本《Windows API大全》之类的书就足够了,下面举个简单的例子:
程序三:调用API函数隐藏Windows的任务栏:
HWND WndHandle;//定义句柄类型变量 p6A0{V uR"\
WndHandle=FindWindow("Shell_TrayWnd"NULL);//调用API函数FindWindow()获得任务栏的句柄
ShowWindow(WndHandleSW_HIDE);//再调用API函数ShowWindow()隐藏任务栏
大家看到,在上面调用API函数FindWindow()和ShowWindow()的过程中,只要我们知道函数的名字和括号里的参数是什么就行了,至于实现的过程不必理会,也轮不到我们这些菜鸟去理会:)学会调用API,你可以写出功能强大的程序来,这一技巧对于初学者来说是必须掌握的(代码请参考黑防光盘)。
技巧⒊多线程编程技术 [^%h Q)Wi
通过上一篇的介绍 ,大家都很清楚线程的概念了,它是进程内部的一个执行单元(如一个函数等),上期说了那么多理论,现在该派上用场了。编写多线程应用程序是指使程序在运行时创建多个线程并发地运行于同一个进程中。今年6月份横空出世的“中国黑客”病毒不是采用了全球独创的“三线程技术”吗?虽然笔者没机会分析它的样本代码,但此种病毒的工作效率如此之高是与它的多线程技术分不开的。 Mav|%J4m\XFDuB
使用多线程技术编程有如下优点:
①提高CPU的利用率。由于多线程并发运行,可以使用户在做一件事情的时候还可以做另外一件事。特别是在多个CPU的情况下,更可以充分地利用硬件资源的优势:将一个大任务分成几个小任务,由不同的CPU来合作完成。
②采用多线程技术,可以设置每个线程的优先级,调整工作的进度。 nk$@M0@qp;_mzo
清楚了使用多线程技术的优势之后,下面便来谈谈如何在C++ Builder环境下开发多线程的应用程序,在C++ Builder 环境中,通过 TThread 类就可以很方便地编写多线程应用程序(但不能直接使用,因此要派生新类),具体流程如下:
从TThread 类派生出一个新的线程类->创建线程对象->设置线程对象的属性项->挂起或唤醒线程(根据具体情况操作)->结束线程。
要说明一点的是:在应用程序中要合理地设置线程的优先级。不要因为某些线程的优先级很高而使其他一些线程因为等不到CPU的处理时间而被“饿死”,也不要因为线程的级别都差不多而导致的频繁切换花费大量的CPU时间。(本段引自《C++ Builder 5 编程实例与技巧》P284)。
技巧⒋让程序实现后台监控
这是一个很基本的技巧。如果你是一个木马程序的爱好者,当你阅读众多的木马源程序的时候,就会发现100%的木马程序都很注意自身的后台监控本领,也就是隐身技术,面对不同的系统要施展不同的对策才能实现。很多杀毒程序就采用了这种后台监控技术,使程序随着系统的启动而运行,然后在后台悄悄地监视系统的一举一动,一发现有不对路的程序就把它“揪”出来示众。实现程序的后台监控技术有如下几个关键:
①正常运行时,不显示程序的窗体;
②系统每次启动都自动运行程序一次;
③程序图标不显示在任务栏上;
④不显示在按Ctrl+Alt+Del 调出的任务列表中; k$Lq_FDR
⑤通过热键可以调出隐藏的窗体
实现方法:对于①,要不显示窗体,我们可以编辑WinMain函数,设置ShowMainForm值为False就可以隐藏程序的窗体了。参考代码:Application->ShowMainForm = false ;对于②,可以利用技巧1所介绍的方法修改注册表,键值如下:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ,使用的是WriteString()方法。这是冰河等多种旧木马惯用的启动手段之一(当然还有文件关联、注入dll等方法);对于③,要使程序图标不显示在任务栏上,也很简单,调用API函数SetWindowLong 可以让程序运行后不出现在任务栏里,不过要放在窗体的OnCreate()里面。代码如下:
SetWindowLong(Application->HandleGWL_EXSTYLEWS_EX_TOOLWINDOW);
对于④,调用RegisterServiceProcess API 函数将程序注册成为一个服务模式程序,让它运行在较高的优先级下就不会出现在程序列表中(对Win9X有效,WinNT/2000/XP下无效)。具体的代码请参考笔者的《一个简单木马程序的编写与伪装策略》一文,不在此重叙(请参考《黑客防线》2002年第6期)。对于⑤,要先定义捕获Windows消息WM_HOTKEY的钩子函数,然后向Windows加入一个全局原子,并保留其句柄,最后向Windows登记热键,这个可以调用API函数RegisterHotKey来实现。 9u j {x5EkWo9P:U:k
技巧⒌使用定时触发器
在C++ Builder 环境下,定时触发器即Timer控件,有时候我们希望程序隔一段时间重复执行相同的动作,比如对QQ密码截获的时候,就要隔一段间隔寻找一次QQ登录窗口。在C++ Builder 中,只要将执行这些动作的代码放到一个Timer中去就OK了。
听说“中国黑客”病毒运行几分钟后就自动创建一个新的线程,用于寻找OICQ的“发送消息”窗口,在10分钟内一直在找,一旦找到就将“去***我是小狗”等带有政治色彩的言论发送给受害者QQ上的好友,10分钟后自动结束该线程。我想在查找“发送消息”窗口的10分钟内就运用了定时器,该病毒是用汇编开发的。可是在C++ Builder中是如何运用的呢?其实控件的出现使得编程变得很简单,添加一个Timer控件,设置几下控件的属性,双击Timer控件,将代码放到里面去就行了。程序执行的时候,相隔指定的时间就重复执行里面的代码了。
页:
[1]