-
黑客编程基础
good
一、了解
Windows
内部机制
Windows
是一个“基于事件的,消息驱动的”操作系统。
在
Windows
下执行一个程序,只要用户进行了
影响窗口的动作(如改变窗口大小或移动、
单击鼠标等)该动作就会触发一个相应的“事
件”
。系统每次检测到一个事件时,就会给程
序发送一个
“消息”
,
从而使程序可以处理该事件。
p>
每个
Windows
应用程序都是基于事
件和
消息的,而且包含一个主事件循环,
它不停地、反复地检测
是否有用户事件发生。
每次检测
到一个用户事件,程序就对该事
件做出响应,处理完再等待下一个事件的发生。
Windows
下的应用程序不断地重复这一过程,直至用户
终止程序,用代码来描述实际
上也就是一个消息处理过程的
wh
ile
循环语句。
下面便简单介绍一下与
Windows
系统密切相关的几个基本概念:
<
/p>
⒈窗口:这是我要说的第一个概念。似乎是地球人都知道的事儿了,窗口是
Windows
本身
以及
Wi
ndows
环境下的应用程序的基本界面单位,但是很多人都误以为只有具有标题栏、
状态栏、最大化、最小化按钮这样标准的方框才叫窗口。
其实窗
口的概念很广,例如按钮和
对话框等也是窗口哦,只不过是一种特殊的窗口罢了。
从用户的角度看,
窗口就是显示在屏幕上的
一个矩形区域,
其外观独立于应用程序,
事实上
它就是生成该窗口的应用程序与用户间的直观接口;
从应用程序的角度看,
p>
窗口是受其控制
的一部分矩形屏幕区。
应用
程序生成并控制与窗口有关的一切内容,
包括窗口的大小、
风格
、
位置以及窗口内显示的内容等。
用户打开一个应用程序后,<
/p>
程序将创建一个窗口,
并在那里
默默地等
待用户的要求。每当用户选择窗口中的选项,程序即对此做出响应。
⒉程序:
通常说的程序都是指一个能
让计算机识别的文件,
接触得最多的便是
.exe
型的可执
行文件,这个不难理解。
⒊进程:
说到进程,
学过
《操作系统》
的人都很清楚,
所谓进程就是应用程序的执行实例
(或
称一个执行程序)<
/p>
。需要注意的是:进程是程序动态的描述,而上面说到的程序是静态的描
< br>述,两者有本质的区别。举个例子,从网上
Down
了一
个瑞星杀毒软件到
C
盘但没有运行,
那
个
.exe
可执行文件叫做程序,
它
是一个二进制码的文件。
一旦双击了
exe
文件图标运行程
序,那个“正在运行着的瑞星杀毒”便称为进程,它在双击的那一刻
被系统创建,当你关机
或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,
彻底结束了生命。进程经
历了由“创建”到“消亡”的生命期,而程序自始至终存在于你
的硬盘上,不管你的机器是
否启动。
⒋线程:线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组
CPU
p>
指令、
一组
CPU
寄存器以及一堆栈。进程本来就具有动态的含义,然而实质上是通过线程来执行
体现的,
从这个意义上说,
Windows
中进程的动态性意义已经不
是很明显了,只算是给程
序所占的资源划定一个范围而已
(个人
观点,
纯属个人理解,
不必引起争议!
)
,真正具有动
态性意义的是线程。
以
前在大二学习操作系统课的时候就有个同学跟笔者提起这点,
笔者还
跟他驳得面红耳赤呢!现在想想,觉得很有道理,不得不佩服那位同学对
Windo
ws
内部机
制了解得如此清楚。
p>
之所以在此花那么多的篇幅说线程,
是因为下面将要介绍到多线程编
程技巧,
如果不理解这
点,那就很难应用到实践上,希望大家明
白。
⒌消息:
我们几乎做每一个动作都会产生一个消息,
在用鼠标指点江山的今天,
鼠标被移动
会产生
WM_MOUSEMOVE
消息,
鼠标左键被按下会产生
WM_LBUT
TONDOWN
的消息,
鼠标
右键按下
便产生
WM_RBUTTONDOWN
消息等等。所有的这些都
可以通过
GetMessage
,
Se
ndMessage
等函数得到
,
以后
的操作中我们会经常接触到这些函数。
⒍事件:
何谓事件?从它的字面意思我们就可以明白它的含义,
如在程序运行的过程中改变
窗口的大小或者移动窗口等,都会触发相应的“事件”<
/p>
。
⒎句柄:
单单一个“柄”字便可以解释它的意思了,
我们天气热摇扇子的时候只要抓住扇柄
便可以控制整个扇子的运动了,
在程序中也差不多是这个意思。
通常一个句柄就可以传递我
们所要做的事情。
有经验的读者肯定清楚,
编写程序总是要和各种句柄打交道的,
句柄是系
统用来标识不同对象类型的工具,
如窗口、
菜单等,
这些东西在系统中被视为不同类型的对
象
,用不同的句柄将他们区分开来。
看看
C++
教材中是如何给句柄下定
义的:
“在
Win32
里,句柄是指向
一个无值型对象(
void
*
)的指
针,是一个
4
字节长的数据”
。虽然我
对它的本质是什么还是很迷惑,
但我知道句柄
并不是一个真正意
义上的指针。
从结构上看,
句柄的确是一个指针,
尽管它没有指向用于存
储某个对象的内存位置(很多书都这么说,这正是我的
迷惑所在)
,而实际上句柄指向的是
一个包含了对该对象进行的
引用的位置。
在编程时,
只要抓住了对象的句柄就可以对该对象
进行操作了(我在《一个简单木马程序的编写与伪装策略》中说到的对
< br>QQ
密码的截获就是
要找到
QQ
登陆窗口的句柄后才开始截密行动的)
。下面再举个例子来说明
句柄的运用:编
一个程序,使
QQ
登陆
窗口的号码框和密码框均变黑,相关代码及解释:
void
__fastcall TForm1::FormCreate(TObject *Sender)
{
HWND
hCurWindow
,
HC,HE;//
定义三个窗口句柄
变量,
hCurWindow
用于存放
QQ
用户登陆
窗口的句柄,
HC
、
HE
分别存放号码框和密码框的句柄。
p>
if((hCurWindow=
Fi
ndWindow(NULL,
用
户
登
录
用户登录
<
/p>
{//
很明显,调用
FindWindo
w
()函数去获得
QQ
登陆窗口的句柄
String str;
f(
}
TCHAR
wClassName[255];//
类名变量
HC=GetWindow(hCurWindow,
GW_CHILD);//
得到号码框的句柄
HE=GetWindow(HC,
GW_HWNDNEXT);//
接着得到密码框的句柄
GetClassName(HE, wClassName,
sizeof(wClassName));//
得到类名
GetClassName(HC, wClassName,
sizeof(wClassName));//
得到类名
<
/p>
EnableWindow(HE,false);//
使窗口失
效
EnableWindow(HC,false);//<
/p>
使窗口失效
}
以上代码在
C++ Builder
下
编译通过,只要运行次程序,
QQ
登陆窗口的号码框和密码框马
上
变黑色
你
还
可
以
添
加<
/p>
一
个
Timer
控
件
,
将
上<
/p>
面
的
代
码
copy
到
void
__fastcall
TForm1::Timer1Timer(TObject
*Sender)
函数中,并在后边加上这一句代码:
SendMessage(hCurWindow,WM_CLOSE,0,0); ,
?
使
QQ
一启动就关闭,
让别人永远也用不了
QQ
,
挺有趣儿的哦
⒏
< br>API
与
SDK
:
API
是英文
Application Programming Interface
的简称,
意为
“应用程序接口”
< br>,
泛指系统为应用程序提供的一系列接口函数。
其实质是
程序内的一套函数调用,
在编程的时
候可以直接调用,
而不必知道其内部实现的过程,
只知道它的原型和返回值就可以了,
p>
此外,
手头经常放着一本“
Windows
API
大全”之类的书也是必不可少的,不然你根本不知道哪些
API
是干什么用的,瞎编也编不出什么东西来。在后面我们会介绍调用
API
编程的例子,调
用
AP
I
编程工作虽然烦琐,但由于
API
函
数都被封装在
dll
库里,程序只有在运行的时候才
调用的,因此程序的体积小而且运行效率高。
SDK
是英文
Software
Development
Kit
的缩写
,
指“软件开发工具包”
,在防火墙的设计
中就经常涉及到<
/p>
SDK
。
有关
基本的概念就谈这些,那些
C/C++
的基本语法、什么是面向
对象等知识请大家查阅相关
的书籍,
此类书籍各大书店已汗牛充
栋,
不再多叙。
下面直接谈谈语种和编程工具的选择问
题,这也是初学者们最迷惑的问题。
二、编程语言以及工具的选择:
从上面的介绍我们对
Windows
有了进一步的了解,现在就该开始行动了,选择要学的语言
和工具是第一步,而且是非常
重要的一步工作,笔者建议一切以简单、
易接受为原则,
不然<
/p>
你会自信心大减的,何必偏要跟自己过不去自讨苦吃呢?
在开始的时候很多人都感到迷惑,
目前的编程语言那么多,
有
c
、
c++
、
c#
、
java
、
汇编、
html
等
等,
究竟学哪些好呢?最开始我该学什么呢?甚至有人将
vc<
/p>
、
c++ builder
也列为两种不
同
的语言!
这些都是对编程语言缺乏了解造成的。
笔者开始的时候也犯过同样的错误,
曾经给
自己写过
一份计划书:
先学
c
语言,接着学
p>
c++
、
c#
、<
/p>
java
、
汇编、
vb
、
vc
、
c++ builder
??,
哪一种语言用多少时间去专攻
等等,
现在回想起来觉得多么的可笑!
只要学得精,
一门就够
了。从实用的角度来讲,
C++
是最好的选择(个人意见,其实每一种语言都很好)
,而
VC
和
C++
Build
er
是其相应开发工具的两大主流,笔者极力推荐初学者使用
C
++
Builder
,因为
很容易上
手,如果一下子就用
VC
的话,也许会打击你的自信心:
)
。
三、谈谈促进编程能力提高的两个途径
如果你是一个黑客技术的狂热者的话,
到雅虎去搜索黑客教程的时候就会发现,
很多的中文
教程在谈到如何进行黑客编程时,十有八九都会介绍以下两
大最佳途径:一、读程序;二、
写程序,并且都提出了教程作者的看法,下面我想谈谈这
方面的个人观点。
⒈读程序:
p>
我将读程序放在前面是有原因的。
在你没有阅读过一份完整的源代码
之前,
你别
指望能写出有多好的程序来!
这是对每一位初学者的忠告也是警告,
而且必须具备一定的语
言基础知识,
这里的基础知识主要是指语法知识,
最起码要能读
懂别人的程序的每一行意思。
有没有程序的设计思想,
在这个时
期并不重要,
只要具备一定的语法基础就可以了,
思想可
以通过阅读完别人的源程序后分析得来。
记
得在大一学习
C
语言的时候,
我们都很
重视语法的学习,
整天都看教材、
做练习,
而且赶
在老师的讲课前预习,
课后又复习巩固,
将一些语法点记得滚瓜烂熟,
可后来一到做课程设
计的时候,坐在电脑面前简直是老鼠拖鸡蛋—无从下手了,而且不断的问自己:
“我平时
的
努力哪去了?语法都会了呀,
怎么还是做不出程序来?”
p>
相信很多人都像笔者以前那样,
错
误地以为
学会了语法就等于掌握了编程。
编
程的能力包括经验、技巧、耐心等几个因素,而并非想象中的那样简单,
更不要以为编程
就是简简单单的写程序!
其实学一门
语言并不需要刻意去记那些条条框框的语法,
在看代码的时候,
遇到了不明白的
地方再去查相关的资料,
一点一点补充基础知识
再配合源程序的思路,
这时的理解才是最深
刻的,我可以肯定地
说,这个时候对语法的接受程度绝对比你刚开始时的死记要强!
读程序也不能单纯地读,
要真正做到
“俯而读,
昂而思”
。
好的代码是百读不厌的,
比如
Shotgun
的那道构造洪水
< br>Ping
攻击的代码,我至少读了
20
< br>遍。笔者喜欢将从网上搜集来的代码打印
到纸上
(尽管学
校的打印费贵得要命,
打一份代码就得花去十几块甚至几十块大洋
~~~
)
,
然
后边看边做好眉批,
遇到一个新函数记下它的功能,
一些忘记
了的知识在旁边标出来,
还可
以写上对程序的看法等等。特别是
遇到了一些新的
API
函数,最好标出来,对你以后编程的
p>
时候也许会用得着,
最后别忘了分析一下程序的思路,
这样对你以后编写类似的程序很有帮
助的。
⒉写程序:
问题可谈到点子上了,学
那么多语言,
读那么多程序最终还不是为了写程序,做
出适合需
要的软件来?“君子性非异也,善加于物也”
,笔者认为一切从借鉴开始,先是修
改别人的程序,等到有了一定的程度再写出属于自己的程序。
刚开始写程序,不要奢望一下子写出很出色的程序来,
“万丈高楼平底
起”
,编程贵在动手,
只要你动手去写了,就算只有一句“
p>
printf(
“
Hello!
”
);
”也是一次进步!此外,还要依照自
身的能力循序渐进地写,
开始的时候写一点功能简单的、
篇幅短小的代码,
力求简洁、
完整,
“麻雀虽小,但五脏俱全”
,然后在此基础上进行扩充,一点一点添加功能,下
面笔者摘录
一位国内一流编程高手、
“豪杰超级解霸”的作者梁
肇新的编程心得,请大家看看一个成功
的程序员是如何写程序的,希望对广大菜鸟有所启
发:
写程序的方法:在
Win98<
/p>
的环境中,先写主干,用最少的代码实现最基本的功能。然后一
点
点添加功能,
每加一点都要调试。
尽量少用动态分配、
全局变量。充分利用操作系统直接
提供的
API
。
在
Win98
下调试通过之后,
再在
Win95
下
调试通过,
然后是
Win97
,
WindowsME
,
WinNT4.0
p>
。这样才能写出稳定、快速的程序。
给程序员的建议:
1
、不要急于求成,这样往往欲速不达。
2
、不要什么东西都想学,什么都没掌握。
3
p>
、每天都要自我总结,分析自己的错误率和废码率,不断加强自我管理。
4
、代码格式很重要。代码要规范、严谨,效率要高。<
/p>
5
、不要盲从简单的开发工具(这点笔
者不是很同意,最起码要有一定的功底的人才敢这么
说)
。
p>
6
、有了成果要公开,不要舍不得,不然
很快会过时的
终于到了《
Windows
黑客编程
基础》的下集,在这期里我们注重于实践,特别是作者介绍
的几个基本技巧,
菜鸟们要是学会了,
编一个功能简单的黑客程序不是很难的,
单单是修改
注册表的技巧,就几乎能做到像“万花谷”般恶毒的程序了,好!
废话少说,是好是坏,请
大家随小编我走一趟就知道了,诸位请
--
四、黑客编程的几个基本技巧
以下将要谈到的几个基本技巧很重要,
虽然对于编程高手来说这
是在玩小孩子把戏,
但对于
一位初学者,
掌握以下几个技巧将为你的编程扫清道路,
而且很容易编写出有趣的程序,
培
养你对编程的兴趣。
技巧⒈学会修改注册表。
相信大家都
知道当浏览了一些网页恶意代码,
IE
标题、
< br>默认主页等被改得面目全非,
这就是
通过改动注册表来更
改系统设置的例子。
Windows
中的注册表是个好东东,它
是
windows
系统的灵魂,是许多软件记录数据的地方(当
然也包括
windows
本身)
。
p>
windows
通过它记
录大量的数据,<
/p>
然后在下一次启动时再读取相应的数据来设置系统。
通过控制注册
表就可以
控制整个系统,
所以很多的黑客程序都在注册表上动手
脚
(尤其是木马程序和作恶剧程序)
,
学会修改注册表可以实现一些有趣而强大的功能。
我们完全可以通过编程来操作注册表,
达
到与手动更改注册表编辑器产生一样的效果。
“超级兔子”中的大部分功能就是通过修改注
册表来完成的。操作注册表有专门
的
API
函数,大家可以参考有关资料,下面笔者以
C++
Builder
为例说明如何在程序中操
作注册表:
程序二:编程修改
IE<
/p>
标题内容
新建一个工程,在
Unit1.h
文件中包含
Registry
p>
单元:
#include
然后就可以在
.cpp
文件操作注册表了,接着来!在窗体的
OnCreate()
里加入以下代码(你可
以在
try{}
里面加入任何操作注册表的代码)
:
TRegistry* Registry;
Registry = new TRegistry();
创
建一个
TRegistry
类型的对象
Registry
,用于修改注册表。
try{
Registry->RootKey = HKE
Y_CURRENT_USER;//
设置主键,这是必不可少的,设置好主键后,就<
/p>
可以操作这个主键下所有的键值了。
if( Registry->OpenKey(
调用
OpenKey
(
)
打
开括号里所指的键
{
Regist
ry->WriteString(
Title
”台湾是中国的
一部分,世界上只有一个中国!
”
);//
调
用
WriteString
()
往注册表里写入
IE
标题
Registry->CloseKey();//
关闭该键
}
else
{//
如果打开失败的话
Registry->CreateKey(
就调用
CreateKey
()
新
建上述键
Registry->WriteString(
台湾是中国的一部分,世界上只有一个中国!
再写
入
IE
标题内容
Registry->CloseKey();//
最后关
闭该键,这个也不能忽视,它跟上面的
OpenKey
成对使用
的
}//End of try
__finally
{//
要是出错,跳到这里处理
p>
Registry->CloseKey();//
关闭所要打开的
键
delete Registry;//
< br>销毁
Registry
对象,释放资源。
}
编译运行上面的代码就可以将
< br>IE
的标题改为
“台湾是中国的一部分,
世界上只有一个中国!
”
了。笔者写了个小程序,可以
测出当前的
IE
标题和默认主页是什么,并可随意修改他们,<
/p>
还可以禁止别人修改你的默认主页和注册表编辑器
-
-
-
-
-
-
-
-
-
上一篇:JAVA习题集
下一篇:常见C(C++)语言面试题及答案