菜菜也来做木马(一)
[color=#000000][b][font=宋体][size=15pt] 菜菜也学做木马(一)[/size][/font][/b][b][size=15pt][/size][/b][/color][b][size=12pt][color=#000000][font=Times New Roman] flyli [/font][/color][/size][/b]
[size=3][color=#000000][font=宋体]这是本系列文章的第一篇,所以先介绍一下,本系列文章主要目的是循序渐进的讲解要完成一个木马的所需的相关技术以其编程实现的方法,用最简单的语言描述力求让每一位略知c[/font][font=宋体]语言的读者都能看懂,成为黑客编程高 手!下面开始我们的编程之旅[/font][b][size=12pt][font=Times New Roman] [/font][/size][/b][/color][/size]
[size=3][color=#000000][font=宋体]首先,要实现一个木马,如果不能记录下别人的密码的话,个人认为他就不能算是批好马。但是要记录键盘的话,我们就不能不想到用“钩子”,所以我们这次的主题就是“钩子”。[/font][size=10][/size][/color][/size]
[color=#000000][b][size=12pt][font=Times New Roman] 1[/font][/size][/b][b][font=宋体][size=12pt].何为钩子[/size][/font][/b][b][size=12pt][/size][/b][/color]
[size=3][color=#000000][font=Times New Roman] [/font][font=宋体]我们通过查资料或者翻书可以知道,这个[/font][font=Times New Roman]windows[/font][font=宋体]的运行是靠消息驱动的,其实我们暂时也没有必要去了解那么多,但是我们必须知道,[/font][font=Times New Roman]windows[/font][font=宋体]上所有的动作都是在操作系统的监视下进行的。就像我们在上火车前包包要经过安检器一样,可是如果我在安检器里加个摄像头(观察经过的物品),在加个“钩子”(看到想要的东西我就拿走),呵呵,这不就发财了!!![/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]Windows[/font][font=宋体]中钩子的原理就和上面描述的很像![/font][/color][/size]
[img]http://www.hackerxfiles.net/attachments/month_0701/asdf_Yeypw73R1Zk2.jpg[/img]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=宋体][size=3][color=#000000]在这里我们的操作系统就像是那个安检的机器,我们就在里面给他加个钩子!我要把所有的键盘值都劫下来!不过不能光说不练嘛,先来个简单的程序屏蔽掉我们的键盘。[/color][/size][/font]
[size=3][color=#000000][font=Times New Roman] [b][size=12pt]2.[/size][/b][/font][/color][/size][color=#000000][b][font=宋体][size=12pt]实现一个最简单的钩子程序[/size][/font][/b][b][size=12pt][/size][/b][/color]
[size=3][color=#000000][font=宋体]这里我调试程序用的是[/font][font=Times New Roman]vc2003,[/font][font=宋体]相对于[/font][font=Times New Roman]vc6.0[/font][font=宋体]而言,[/font][font=Times New Roman]vc2003[/font][font=宋体]的改动不是很大,不过对于使用不同的编译器我尽量兼顾。[/font][/color][/size]
[font=宋体][size=3][color=#000000]下面是代码:[/color][/size][/font]
[align=left][font=新宋体][size=9pt]#include[/size][/font][color=#000000][font=新宋体][size=9pt] "stdafx.h"/*[/size][/font][font=新宋体][size=9pt]注释:此头文件为vc2003中必须要加载的,vc6.0中可以省略*/[/size][/font][/color][/align][align=left][font=新宋体][size=9pt]#include [/size][/font][color=#000000][font=新宋体][size=9pt]<windows.h>/*[/size][/font][font=新宋体][size=9pt]注释:我们要在操作系统内加钩子,没有这个头文件怎么行*/[/size][/font][/color][/align][align=left][font=新宋体][size=9pt]#include [/size][/font][color=#000000][font=新宋体][size=9pt]<stdio.h>/*[/size][/font][font=新宋体][size=9pt]注释:这个头文件会C的人都很熟悉吧,^_^*/[/size][/font][/color][/align][align=left][color=#000000][font=新宋体][size=9pt]/*[/size][/font][font=新宋体][size=9pt]函数申明区*/[/size][/font][/color][/align][align=left][font=新宋体][size=9pt][color=#000000]LRESULT CALLBACK HookPorc([/color][color=blue]int[/color][color=#000000] nCode,WPARAM wParam,LPARAM lparam);[/color][/size][/font][/align][align=left][color=#000000][font=新宋体][size=9pt]/*[/size][/font][font=新宋体][size=9pt]主函数*/[/size][/font][/color][/align][align=left][font=新宋体][size=9pt]int[/size][/font][font=新宋体][size=9pt][color=#000000] _tmain([/color][color=blue]int[/color][color=#000000] argc, _TCHAR* argv[])[/color][/size][/font][/align][align=left][font=新宋体][size=9pt][color=#000000]{[/color][/size][/font][/align][align=left][color=#000000][font=新宋体][size=9pt] ::SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0);/*[/size][/font][font=新宋体][size=9pt]加载钩子*/[/size][/font][/color][/align][align=left][color=#000000][font=新宋体][size=9pt] puts("[/size][/font][font=新宋体][size=9pt]钩子已经加载完毕,10秒内任何键盘操作都不能执行!10秒后按任意键退出。");[/size][/font][/color][/align][align=left][color=#000000][font=新宋体][size=9pt]::Sleep(10000);/*10[/size][/font][font=新宋体][size=9pt]秒延时,参数表示10000(毫秒)*/[/size][/font][/color][/align][align=left][color=#000000][font=新宋体][size=9pt]system("pause");/*[/size][/font][font=新宋体][size=9pt]程序暂停*/[/size][/font][/color][/align][align=left][font=新宋体][size=9pt]return[/size][/font][font=新宋体][size=9pt][color=#000000] 0;[/color][/size][/font][/align][align=left][font=新宋体][size=9pt][color=#000000]}[/color][/size][/font][/align][align=left][font=新宋体][size=9pt][color=#000000]LRESULT CALLBACK HookPorc([/color][color=blue]int[/color][color=#000000] nCode,WPARAM wParam,LPARAM lparam)[/color][/size][/font][/align][align=left][font=新宋体][size=9pt][color=#000000]{[/color][/size][/font][/align][align=left][font=新宋体][size=9pt][color=#000000] [/color][color=blue]return[/color][color=#000000] 1;[/color][/size][/font][/align][font=新宋体][size=9pt][color=#000000]}[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]上面那个程序够简单吧,这么几行就可以把键盘锁定了!以上程序以加了简单的注释,为了兼顾初学者,我再做下详细的说明,最上面的头文件没什么说的,关于下面声明的那个函数就是我们用来处理键盘按键的函数,初学者可能看不懂那个什么“LRESULT CALLBACK”以及函数中的那些参数,没有关系,我们可以先不管嘛,先把它当作是固定格式!以后再做深入的介绍。[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]下面来看_tmain中的主程序,为了便于区别,我在API函数前都加了“::”,现在我们来看看SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0)这个安装钩子的API函数,它的原型是:[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]HHOOK SetWindowsHookEx([/color][/size][/font]
[color=#000000][font=新宋体][size=9pt] Int idHook,/*[/size][/font][font=新宋体][size=9pt]第一个参数是用来指定钩子类型的,钩子有很多类型,比如我们用的WH_KEYBOARD*/[/size][/font][/color]
[color=#000000][font=新宋体][size=9pt]/*[/size][/font][font=新宋体][size=9pt]就是用来“钩”键盘值的,当然钩子还有很多种,篇幅有限我们暂时先讲这么一种*/[/size][/font][/color]
[color=#000000][font=新宋体][size=9pt]HOOKPROC lpfn,/*[/size][/font][font=新宋体][size=9pt]第二个参数是指定钩子函数地址的,暂时可以直接理解为添函数名!*/[/size][/font][/color]
[color=#000000][font=新宋体][size=9pt]HINSTANCE hMod,/*[/size][/font][font=新宋体][size=9pt]第三个参数是钩子函数所在DLL的句柄*/[/size][/font][/color]
[color=#000000][font=新宋体][size=9pt]DWORD dwThreadId/*[/size][/font][font=新宋体][size=9pt]指定为那个线程安装钩子,如果为0的话讲被解释为在系统范围内*/ [/size][/font][/color]
[font=新宋体][size=9pt][color=#000000])[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]钩子的安装函数我们大致了解了,参照我们的程序中,第一个参数我们用的是WH_KEYBOARD,就是安装“键盘钩子”,第二个参数用的是HookPorc 也就是我们写的那个钩子函数的函数名,第三个参数因为我们没用DLL,所以我们用的是GetModuleHandle(NULL)使用来得到本模块的句柄,也就是把本模块当成一个dll,但是此种方法有一定的问题,我们只是在讲钩子机理的时候使用下,正真的全局钩子是需要dll的。第四个参数因为我们要截取所有键盘输入,当然要把钩子定义为系统级的啦~[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]在往后我们看HookPorc的具体内容,只是返回1?对!每当系统有键盘使用是我们的钩子就都截过来然后只返回1,当然就相当于被屏蔽了一样。[/color][/size][/font]
[color=#000000][font=新宋体][size=9pt] [/size][/font][b][font=新宋体][size=3]钩子就仅此而已吗[/size][/font][/b][/color]
[font=新宋体][size=9pt][color=#000000]通过上面的程序,大家对钩子应该有了个大概的了解,但是我们需要的钩子就仅此而已嘛?我怎样知道我的钩子是否安装成功,没有被劫杀?我要去记录人家的密码,我怎样获知密码值?面对一系列的问题,我们必须完善一下我们的“小钩钩”。[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]先来想想我们如何知道钩子是否安装成功,为了得到答案我们就得从钩子的安装函数SetWindowsHookEx入手,函数的返回值是HHOOK,HHOOK是种句柄。不知道句柄是什么?没关系,但是我们必须知道如果此函数运行失败的话它的返回为NULL,也就是0。于是针对于我们上面的程序,我们可以用if(::SetWindowsHookEx(WH_KEYBOARD,HookPorc,GetModuleHandle(NULL),0))语句来判断其是否安装成功,因为if判断的条件只有0和非0两种所以只要钩子安装成功的话if中的条件就会成立。[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]第一个问题解决了,可是我们如何获得别人的键盘值呢?也许你以为我们上面的那个程序稍加改动就可以完成了,但其实不然,我们要做的是一个可以监控所有键盘输入的钩子,但是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。[/color][/size][/font]
[color=#000000][font=新宋体][size=9pt] [/size][/font][b][font=新宋体][size=12pt]何为DLL[/size][/font][/b][/color]
[font=新宋体][size=9pt][color=#000000]关于DLL,我们经常可以在我们的电脑中看到后缀为dll的文件,但是dll究竟是什么呢?有什么作用呢?我们现在就来共同探讨一下。[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]所谓dll,它的中文翻译就是动态链接库。但是动态链接库究竟是什么呢?说深了这东西还正不怎么好说,我们暂时就这样理解,动态链接库就是包含了一些我们需要的函数,然后在我们需要的时候调用它就可以了,但是函数为什么要放到dll里呢?直接写进程序里多好?的确如此,但是如果你的函数直接写在了程序里,那这个函数就只有你的程序自己能调用了,而如果函数写在dll中的话,其他的可执行程序也可以调用它,当然节省空间只是它优点的一部分,我认为它最大的优点就是,它不属于任何一个进程,但是呢,它似乎又能和任何一个进程进行交流!作为黑客爱好者,对这一点会不会很敏感呢?[/color][/size][/font]
[font=新宋体][size=9pt][color=#000000]这次就写到这,下次我们介绍如何编写dll文件,以及如何实现一个正真的能截取键盘信息的程序![/color][/size][/font]
[font=新宋体][color=#000000][/color][/font]
[size=2][b]第一次写这种东东,希望大家不要扔转头砸我哈~[/b][/size]
[size=2][b]后面得文章我也希望尽快出来[/b][/size]
[[i] 本帖最后由 flyli 于 2007-1-5 23:13 编辑 [/i]] 顶++++++++++,木马我会做,现在主要想了解,内存密码截取,封包密码截取,能说下吗???????????? 给你说实话吧,其实内存木马截取何封包木马截取我也没有用过
只能给你大概解释一下,所谓内存木马截取就是不使用HOOK技术,也就是不用钩子的。在进程的内存空间里,根据偏移量找到明文存储的密码,很多用来查看星号的密码就是这么做的,这样的话我们用钩子是在输入时截取密码,而内存截取呢就是在输入后截取密码了^_^
关于密码封包截取呢
在网游时我们总是要把输入的密码发送到服务器端进行比对的,于是我们就在发送去的数据包中把密码结下来就好了,但是实际情况并没有那么简单,因为密码在发送前是肯定要经过加密的,而且一个包并不一定只有密码信息,所以还有个解密的问题,所以这种方法用的比较少。
目前用的最多的还是HOOK技术。呵呵
解释的不好不要怪我哈:handshake 不错啊,支持一下! 哈哈,进程插入技术 佩服版主写的那么详细,也大力支持版主写出更好的东西 可是可以,但我还没有学这个
有VB的吗? 我会一点。 [quote]原帖由 [i]jimmy971[/i] 于 2007-1-14 22:31 发表
可是可以,但我还没有学这个
有VB的吗? 我会一点。 [/quote]
要想在编程这条路上走得够远,C是避不开的,抽空可以学习下哈:handshake [quote]原帖由 [i]yoyojn[/i] 于 2007-1-14 23:16 发表
用我的处女贴感谢楼主!并期待 菜菜也学做木马(二) [/quote]
这段时间在做游戏,和写一些头文件,不过(二)会很快出来的! 这种方法不可靠.容易记录到错误的密码.优点是学习起来比较简单
好东西就要延续
学习了.谢谢,:handshake 哈哈,当然顶啦~~~~谢谢~~~我差不多懂了~~~ 哈哈,当然顶啦~~~~谢谢~~~我差不多懂了~~~ 在上不能确定的网址的时候禁止ActiveX和JS有能力在虚拟机上上网。 不错不错,很好::04:: ::04:: ::04:: ::04:: ::04:: ::04:: ::04::
狂顶```
太强了```谢谢斑竹```对于初学者能看到这么亲切的文章感觉真好```::16::
期待(二)快点出来啊```::09:: 学习.
看看...::08:: ::08:: 学习..学习~~~~好东西..谢谢LZ哦 来顶顶
的 有点看不懂,不过,可以学习嘛`~~!!::04:: ::04:: ::04:: ::04::
页:
[1]
2
