菜菜也学做木马(一)
flyli
这是本系列文章的第一篇,所以先介绍一下,本系列文章主要目的是循序渐进的讲解要完成一个木马的所需的相关技术以其编程实现的方法,用最简单的语言描述力求让每一位略知c语言的读者都能看懂,成为黑客编程高 手!下面开始我们的编程之旅
首先,要实现一个木马,如果不能记录下别人的密码的话,个人认为他就不能算是批好马。但是要记录键盘的话,我们就不能不想到用“钩子”,所以我们这次的主题就是“钩子”。
1.何为钩子
我们通过查资料或者翻书可以知道,这个windows的运行是靠消息驱动的,其实我们暂时也没有必要去了解那么多,但是我们必须知道,windows上所有的动作都是在操作系统的监视下进行的。就像我们在上火车前包包要经过安检器一样,可是如果我在安检器里加个摄像头(观察经过的物品),在加个“钩子”(看到想要的东西我就拿走),呵呵,这不就发财了!!!
Windows中钩子的原理就和上面描述的很像!
在这里我们的操作系统就像是那个安检的机器,我们就在里面给他加个钩子!我要把所有的键盘值都劫下来!不过不能光说不练嘛,先来个简单的程序屏蔽掉我们的键盘。
2.实现一个最简单的钩子程序
这里我调试程序用的是vc2003,相对于vc6.0而言,vc2003的改动不是很大,不过对于使用不同的编译器我尽量兼顾。
下面是代码:
#include "stdafx.h"/*注释:此头文件为vc2003中必须要加载的,vc6.0中可以省略*/
#include <windows.h>/*注释:我们要在操作系统内加钩子,没有这个头文件怎么行*/
#include <stdio.h>/*注释:这个头文件会C的人都很熟悉吧,^_^*/
/*函数申明区*/
LRESULT CALLBACK HookPorc(int nCode,WPARAM wParam,LPARAM lparam);
/*主函数*/
int _tmain(int argc, _TCHAR* argv[])
{
::SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0);/*加载钩子*/
puts("钩子已经加载完毕,10秒内任何键盘操作都不能执行!10秒后按任意键退出。");
::Sleep(10000);/*10秒延时,参数表示10000(毫秒)*/
system("pause");/*程序暂停*/
return 0;
}
LRESULT CALLBACK HookPorc(int nCode,WPARAM wParam,LPARAM lparam)
{
return 1;
}
上面那个程序够简单吧,这么几行就可以把键盘锁定了!以上程序以加了简单的注释,为了兼顾初学者,我再做下详细的说明,最上面的头文件没什么说的,关于下面声明的那个函数就是我们用来处理键盘按键的函数,初学者可能看不懂那个什么“LRESULT CALLBACK”以及函数中的那些参数,没有关系,我们可以先不管嘛,先把它当作是固定格式!以后再做深入的介绍。
下面来看_tmain中的主程序,为了便于区别,我在API函数前都加了“::”,现在我们来看看SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0)这个安装钩子的API函数,它的原型是:
HHOOK SetWindowsHookEx(
Int idHook,/*第一个参数是用来指定钩子类型的,钩子有很多类型,比如我们用的WH_KEYBOARD*/
/*就是用来“钩”键盘值的,当然钩子还有很多种,篇幅有限我们暂时先讲这么一种*/
HOOKPROC lpfn,/*第二个参数是指定钩子函数地址的,暂时可以直接理解为添函数名!*/
HINSTANCE hMod,/*第三个参数是钩子函数所在DLL的句柄*/
DWORD dwThreadId/*指定为那个线程安装钩子,如果为0的话讲被解释为在系统范围内*/
)
钩子的安装函数我们大致了解了,参照我们的程序中,第一个参数我们用的是WH_KEYBOARD,就是安装“键盘钩子”,第二个参数用的是HookPorc 也就是我们写的那个钩子函数的函数名,第三个参数因为我们没用DLL,所以我们用的是GetModuleHandle(NULL)使用来得到本模块的句柄,也就是把本模块当成一个dll,但是此种方法有一定的问题,我们只是在讲钩子机理的时候使用下,正真的全局钩子是需要dll的。第四个参数因为我们要截取所有键盘输入,当然要把钩子定义为系统级的啦~
在往后我们看HookPorc的具体内容,只是返回1?对!每当系统有键盘使用是我们的钩子就都截过来然后只返回1,当然就相当于被屏蔽了一样。
钩子就仅此而已吗
通过上面的程序,大家对钩子应该有了个大概的了解,但是我们需要的钩子就仅此而已嘛?我怎样知道我的钩子是否安装成功,没有被劫杀?我要去记录人家的密码,我怎样获知密码值?面对一系列的问题,我们必须完善一下我们的“小钩钩”。
先来想想我们如何知道钩子是否安装成功,为了得到答案我们就得从钩子的安装函数SetWindowsHookEx入手,函数的返回值是HHOOK,HHOOK是种句柄。不知道句柄是什么?没关系,但是我们必须知道如果此函数运行失败的话它的返回为NULL,也就是0。于是针对于我们上面的程序,我们可以用if(::SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0))语句来判断其是否安装成功,因为if判断的条件只有0和非0两种所以只要钩子安装成功的话if中的条件就会成立。
第一个问题解决了,可是我们如何获得别人的键盘值呢?也许你以为我们上面的那个程序稍加改动就可以完成了,但其实不然,我们要做的是一个可以监控所有键盘输入的钩子,但是msdn上说的很清楚,要装全局的钩子就必须把钩子函数放在dll中,起先用的那个只是个特例,如果想把结果的键盘值输出会出现很多奇怪的问题,msdn上说得很清楚:“If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL)”,所以上面那个程序用来让大家入门来理解钩子的。如果我们想把钩子做好我们就必须了解DLL。
何为DLL
关于DLL,我们经常可以在我们的电脑中看到后缀为dll的文件,但是dll究竟是什么呢?有什么作用呢?我们现在就来共同探讨一下。
所谓dll,它的中文翻译就是动态链接库。但是动态链接库究竟是什么呢?说深了这东西还正不怎么好说,我们暂时就这样理解,动态链接库就是包含了一些我们需要的函数,然后在我们需要的时候调用它就可以了,但是函数为什么要放到dll里呢?直接写进程序里多好?的确如此,但是如果你的函数直接写在了程序里,那这个函数就只有你的程序自己能调用了,而如果函数写在dll中的话,其他的可执行程序也可以调用它,当然节省空间只是它优点的一部分,我认为它最大的优点就是,它不属于任何一个进程,但是呢,它似乎又能和任何一个进程进行交流!作为黑客爱好者,对这一点会不会很敏感呢?
这次就写到这,下次我们介绍如何编写dll文件,以及如何实现一个正真的能截取键盘信息的程序!
第一次写这种东东,希望大家不要扔转头砸我哈~
后面得文章我也希望尽快出来
[
本帖最后由 flyli 于 2007-1-5 23:13 编辑 ]