免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fosterpok
打印 上一主题 下一主题

[ZT]Windows黑客编程基础 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-08-18 23:31 |只看该作者
  技巧4.让程序实现后台监控 \r\n\r\n  这是一个很基本的技巧。如果你是一个木马程序的爱好者,当你阅读众多的木马源程序的时候,就会发现100%的木马程序都很注意自身的后台监控本领,也就是隐身技术,面对不同的系统要施展不同的对策才能实现。很多杀毒程序就采用了这种后台监控技术,使程序随着系统的启动而运行,然后在后台悄悄地监视系统的一举一动,一发现有不对路的程序就把它“揪”出来示众。实现程序的后台监控技术有如下几个关键: \r\n\r\n  ①正常运行时,不显示程序的窗体; \r\n  ②系统每次启动都自动运行程序一次; \r\n  ③程序图标不显示在任务栏上; \r\n  ④不显示在按Ctrl+Alt+Del 调出的任务列表中; \r\n  ⑤通过热键可以调出隐藏的窗体 \r\n\r\n  实现方法:对于①,要不显示窗体,我们可以编辑WinMain函数,设置ShowMainForm值为False就可以隐藏程序的窗体了。参考代码:Application-〉ShowMainForm = false ;对于②,可以利用技巧1所介绍的方法修改注册表,键值如下:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run ,使用的是WriteString()方法。这是冰河等多种旧木马惯用的启动手段之一(当然还有文件关联、注入dll等方法);对于③,要使程序图标不显示在任务栏上,也很简单,调用API函数SetWindowLong 可以让程序运行后不出现在任务栏里,不过要放在窗体的OnCreate()里面。代码如下: \r\nSetWindowLong(Application-〉Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); \r\n对于④,调用RegisterServiceProcess API 函数将程序注册成为一个服务模式程序,让它运行在较高的优先级下,就不会出现在程序列表中(对Win9X有效,WinNT/2000/XP下无效)。具体的代码请参考笔者的《一个简单木马程序的编写与伪装策略》一文,不在此重叙(请参考《黑客防线》2002年第6期)。对于⑤,要先定义捕获Windows消息WM_HOTKEY的钩子函数,然后向Windows加入一个全局原子,并保留其句柄,最后向Windows登记热键,这个可以调用API函数RegisterHotKey来实现。

论坛徽章:
0
12 [报告]
发表于 2006-08-18 23:31 |只看该作者
  技巧5.使用定时触发器 \r\n\r\n  在C++ Builder环境下,定时触发器即Timer控件,有时候我们希望程序隔一段时间重复执行相同的动作,比如对QQ密码截获的时候,就要隔一段间隔寻找一次QQ登录窗口。在C++ Builder 中,只要将执行这些动作的代码放到一个Timer中去就OK了。 \r\n\r\n  听说“中国黑客”病毒运行几分钟后就自动创建一个新的线程,用于寻找OICQ的“发送消息”窗口,在10分钟内一直在找,一旦找到就将“去*******功”等带有政治色彩的言论发送给受害者QQ上的好友,10分钟后自动结束该线程。我想在查找“发送消息”窗口的10分钟内就运用了定时器,该病毒是用汇编开发的。可是在C++ Builder中是如何运用的呢?其实控件的出现使得编程变得很简单,添加一个Timer控件,设置几下控件的属性,双击Timer控件,将代码放到里面去就行了。程序执行的时候,相隔指定的时间就重复执行里面的代码了。实际上笔者在上一期的“程序一”中寻找QQ登录窗口时,就运用了定时器,请读者参考光盘中的源程序。 \r\n  \r\n  有关编程技巧的介绍到此为止,请读者参考另类书籍,掌握更多的黑客编程技巧,编写出受欢迎的黑客程序来。

论坛徽章:
0
13 [报告]
发表于 2006-08-18 23:32 |只看该作者
  五、Socket 编程与网络通信基础 \r\n\r\n  由于本文的主题是“黑客编程基础”,而黑客是互连网上“来无影,去无踪”的黑衣人,如冰河、网络神偷等黑客程序都是基于互连网的,谈黑客编程离开网络编程就会大失其味。所以,下面接着谈谈网络编程,大凡基于网络应用的程序都离不开Socket。 \r\n\r\n  Socket为套接字之意,是作为计算机与计算机之间通信的接口。有关Socket的概念在第6期《黑客防线》的《Socket 编程的基础和基本过程》一文中有详细的描述,请大家参考,不在此多叙。需要指出的是:Winsock是访问众多的基层网络协议的一种接口,在每个Win32平台上,它都以不同的形式存在着,Winsock 是网络编程的接口,不是协议,这是容易弄错的地方。 \r\n\r\n  现在来谈谈Winsock编程的过程,大凡在Win32平台上的Winsock编程都要经过下列的基本步骤:定义变量-〉获得Winsock版本-〉加载Winsock库-〉初始化-〉创建套接字-〉设置套接字选项-〉关闭套接字-〉卸载Winsock库,释放所有资源。 \r\n\r\n  下面以一道极其简单的程序来说明如何进行Winsock编程。程序四:编一个程序来获取本地机器的IP地址。 \r\n  \r\n  使用Winsock提供的API函数是最基本的网络技术,为了给初学者看个清楚,笔者打算在Visual C++ 和C++ Builder下各写一个,便于大家区分这两种不同的编程工具的特性(对于本程序来说,他们都差不多,而对于某些通信程序,他们实现起来就相差很远了,但本质是差不多的)。先来看Visual C++ 下的源程序,实现步骤:打开Visual C++ ,从“File”菜单中的“New”新建一个工程,选中“Win 32 Console Application”,意思是说生成的是Win32的控制台程序。另外,初学者要注意一点:只要程序中用到了 Winsock API 函数,都要在工程设置的 Link 中增加 Ws2_32.lib 文件,不然程序将不能通过编译,方法是:点击“Project”菜单,选择“Settings... ALT+F7” ,在弹出的“Project Settings”对话框右侧选“Link”标签,再在“Project Options”下方的编辑框中增加Ws2_32.lib文件,点“OK”就可以了。

论坛徽章:
0
14 [报告]
发表于 2006-08-18 23:32 |只看该作者
加载好文件之后,就可以在CheckIP.cpp文件里加入以下代码了: \r\n\r\n//-------Begin from ------------ \r\n//包含需要使用的头文件 \r\n#include \"stdafx.h\" \r\n#include \"windows.h\" \r\n#include \r\n#include \"stdio.h\" \r\n#include \"stdlib.h\" \r\n#include \"string.h\" \r\nvoid CheckIP(void) //定义CheckIP()函数,用于获取本机IP地址 \r\n{ \r\nWORD wVersionRequested;// WORD类型变量,用于存放Winsock版本的正确值 \r\nWSADATA wsaData; \r\nchar name[255];//定义用于存放获得的主机名的变量 \r\nCString ip;//定义IP地址变量 \r\nPHOSTENT hostinfo; \r\nwVersionRequested = MAKEWORD( 2, 0 ); \r\n//调用MAKEWORD()获得Winsock版本的正确值,用于下面的加载Winsock库 \r\nif ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) { \r\n//现在是加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行 \r\nif( gethostname ( name, sizeof(name)) == 0) { \r\n//如果成功地将本地主机名存放入由name参数指定的缓冲区中 \r\nif((hostinfo = gethostbyname(name)) != NULL) { \r\n//这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo为PHOSTENT型的变量,下面即将用到这个结构体 \r\nLPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo-〉h_addr_list); \r\n//调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的点分表示的IP地址(如192.168.0.1) \r\nprintf(\"%s\\n\",ip);//输出IP地址 } } \r\nWSACleanup( );//卸载Winsock库,并释放所有资源 } } \r\nint main(int argc, char* argv[])//主函数,程序的入口 \r\n{ \r\nCheckIP();//调用CheckIP()函数获得、输出IP地址 \r\nreturn 0;//由于main()定义为int型,所以应带回一个int型的数值 \r\n}

论坛徽章:
0
15 [报告]
发表于 2006-08-18 23:32 |只看该作者
  下面接着来看看在C++ Builder 下如何实现,其实两者的思想是一样的,只是在C++ Builder下实现的界面友好点而已,实现方法:打开C++ Builder 5,默认情况下已经新建一个工程,保存这个工程文件就可以了,在相应之处添入下面的代码即可。 \r\n\r\n程序代码: \r\n\r\n\r\n//包含头文件 \r\n#include \r\n#include \r\n#pragma hdrstop \r\n#include \"Unit1.h\" \r\n#pragma package(smart_init) \r\n#pragma resource \"*.dfm\" \r\nTForm1 *Form1; \r\n__fastcall TForm1::TForm1(TComponent* Owner) \r\n: TForm(Owner) \r\n{ } \r\nvoid TForm1::GetHostIpAddress() \r\n{// GetHostIpAddress()获得本机IP地址 \r\nstruct hostent *thisHost; \r\nstruct in_addr in; \r\nchar MyName[80]; \r\nchar *ptr; \r\nWORD wVersionRequested; \r\nWSADATA wsaData; \r\nint err; \r\nwVersionRequested = MAKEWORD( 2, 0 ); \r\nerr = WSAStartup( wVersionRequested, &wsaData ); \r\nif( err != 0 ) \r\nreturn; \r\nif(LOBYTE( wsaData.wVersion ) != 2 || \r\nHIBYTE( wsaData.wVersion ) != 0 ) \r\n{ WSACleanup( ); \r\nreturn; } \r\nif(gethostname(MyName,80)==SOCKET_ERROR) \r\nreturn; \r\nif(!(thisHost=gethostbyname(MyName))) \r\nreturn; \r\nmemset((void *)&in,sizeof(in),0); \r\nin.s_addr=*((unsigned long *)thisHost-〉h_addr_list[0]); \r\nif(!(ptr=inet_ntoa(in))) \r\nreturn; \r\nWSACleanup( ); \r\nEdit1-〉Text=AnsiString(ptr);} \r\nvoid __fastcall TForm1::FormCreate(TObject *Sender) \r\n{ GetHostIpAddress();} \r\nvoid __fastcall TForm1::Button1Click(TObject *Sender) \r\n\r\n  \r\n\r\n\r\n  程序在 C++ Builder 5 下编译通过。通过比较你会发现他们是大同小异的,对于同一程序,两者工具各有秋千,至于选择哪种由你决定,最好是两者相得益彰。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP