设为首页 收藏本站
查看: 1091|回复: 0

[经验分享] Windows***编程基础(下)

[复制链接]

尚未签到

发表于 2018-6-27 09:21:30 | 显示全部楼层 |阅读模式
终于到了《Windows ***编程基础》的下集,在这期里我们注重于实践,特别是作者介绍的几个基本技巧,菜鸟们要是学会了,编一个功能简单的***程序不是很难的,单单是修改注册表的技巧,就几乎能做到像“万花谷”般恶毒的程序了,好!废话少说,是好是坏,请大家随小编我走一趟就知道了,诸位请--  Windows***编程基础(下)
  文/劲风
  四、***编程的几个基本技巧
  以下将要谈到的几个基本技巧很重要,虽然对于编程高手来说这是在玩小孩子把戏,但对于一位初学者,掌握以下几个技巧将为你的编程扫清道路,而且很容易编写出有趣的程序,培养你对编程的兴趣。
  技巧⒈学会修改注册表。
  相信大家都知道当浏览了一些网页恶意代码,IE标题、默认主页等被改得面目全非,这就是通过改动注册表来更改系统设置的例子。Windows中的注册表是个好东东,它是windows系统的灵魂,是许多软件记录数据的地方(当然也包括windows本身)。windows通过它记录大量的数据,然后在下一次启动时再读取相应的数据来设置系统。通过控制注册表就可以控制整个系统,所以很多的***程序都在注册表上动手脚(尤其是***程序和作恶剧程序),学会修改注册表可以实现一些有趣而强大的功能。我们完全可以通过编程来操作注册表,达到与手动更改注册表编辑器产生一样的效果。“超级兔子”中的大部分功能就是通过修改注册表来完成的。操作注册表有专门的API函数,大家可以参考有关资料,下面笔者以C++ Builder为例说明如何在程序中操作注册表:
  程序二:编程修改IE标题内容
  新建一个工程,在Unit1.h文件中包含Registry单元:
  #include
  然后就可以在.cpp文件操作注册表了,接着来!在窗体的OnCreate()里加入以下代码(你可以在try{}里面加入任何操作注册表的代码):
  TRegistry* Registry;
  Registry = new TRegistry();创建一个TRegistry类型的对象Registry,用于修改注册表。
  try{
  Registry->RootKey = HKEY_CURRENT_USER;//设置主键,这是必不可少的,设置好主键后,就可以操作这个主键下所有的键值了。
  if( Registry->OpenKey("Software//Microsoft//Internet Explorer//Main",FALSE))//调用OpenKey()打开括号里所指的键
  {

  Registry->WriteString("Window>  Registry->CloseKey();//关闭该键
  }
  else
  {//如果打开失败的话
  Registry->CreateKey("Software//Microsoft//Internet Explorer//Main");//就调用CreateKey()新建上述键

  Registry->WriteString("Window>  Registry->CloseKey();//最后关闭该键,这个也不能忽视,它跟上面的OpenKey成对使用的
  }//End of try
  __finally
  {//要是出错,跳到这里处理
  Registry->CloseKey();//关闭所要打开的键
  delete Registry;//销毁Registry对象,释放资源。
  }
  编译运行上面的代码就可以将IE的标题改为“台湾是中国的一部分,世界上只有一个中国!”了。笔者写了个小程序,可以测出当前的IE标题和默认主页是什么,并可随意修改他们,还可以禁止别人修改你的默认主页和注册表编辑器,运行界面如图2所示(详细的代码请参考黑防的光盘)。
  技巧⒉调用API编程
  其实这是最简单的,API是系统在DLL里为我们提供的程序接口,可以直接调用的。只要我们有一本《Windows API大全》之类的书就足够了,下面举个简单的例子:
  程序三:调用API函数隐藏Windows的任务栏:
  HWND WndHandle;//定义句柄类型变量
  WndHandle=FindWindow("Shell_TrayWnd",NULL);//调用API函数FindWindow()获得任务栏的句柄
  ShowWindow(WndHandle,SW_HIDE);//再调用API函数ShowWindow()隐藏任务栏
  大家看到,在上面调用API函数FindWindow()和ShowWindow()的过程中,只要我们知道函数的名字和括号里的参数是什么就行了,至于实现的过程不必理会,也轮不到我们这些菜鸟去理会:)学会调用API,你可以写出功能强大的程序来,这一技巧对于初学者来说是必须掌握的(代码请参考黑防光盘)。
  技巧⒊多线程编程技术
  通过上一篇的介绍 ,大家都很清楚线程的概念了,它是进程内部的一个执行单元(如一个函数等),上期说了那么多理论,现在该派上用场了。编写多线程应用程序是指使程序在运行时创建多个线程并发地运行于同一个进程中。今年6月份横空出世的“中国***”病毒不是采用了全球独创的“三线程技术”吗?虽然笔者没机会分析它的样本代码,但此种病毒的工作效率如此之高是与它的多线程技术分不开的。
  使用多线程技术编程有如下优点:
  ①提高CPU的利用率。由于多线程并发运行,可以使用户在做一件事情的时候还可以做另外一件事。特别是在多个CPU的情况下,更可以充分地利用硬件资源的优势:将一个大任务分成几个小任务,由不同的CPU来合作完成。
  ②采用多线程技术,可以设置每个线程的优先级,调整工作的进度。
  清楚了使用多线程技术的优势之后,下面便来谈谈如何在C++ Builder环境下开发多线程的应用程序,在C++ Builder 环境中,通过 TThread 类就可以很方便地编写多线程应用程序(但不能直接使用,因此要派生新类),具体流程如下:
  从TThread 类派生出一个新的线程类->创建线程对象->设置线程对象的属性项->挂起或唤醒线程(根据具体情况操作)->结束线程。
  要说明一点的是:在应用程序中要合理地设置线程的优先级。不要因为某些线程的优先级很高而使其他一些线程因为等不到CPU的处理时间而被“饿死”,也不要因为线程的级别都差不多而导致的频繁切换花费大量的CPU时间。(本段引自《C++ Builder 5 编程实例与技巧》P284)。
  技巧⒋让程序实现后台监控
  这是一个很基本的技巧。如果你是一个***程序的爱好者,当你阅读众多的***源程序的时候,就会发现100%的***程序都很注意自身的后台监控本领,也就是隐身技术,面对不同的系统要施展不同的对策才能实现。很多杀毒程序就采用了这种后台监控技术,使程序随着系统的启动而运行,然后在后台悄悄地监视系统的一举一动,一发现有不对路的程序就把它“揪”出来示众。实现程序的后台监控技术有如下几个关键:
  ①正常运行时,不显示程序的窗体;
  ②系统每次启动都自动运行程序一次;
  ③程序图标不显示在任务栏上;
  ④不显示在按Ctrl+Alt+Del 调出的任务列表中;
  ⑤通过热键可以调出隐藏的窗体
  实现方法:对于①,要不显示窗体,我们可以编辑WinMain函数,设置ShowMainForm值为False就可以隐藏程序的窗体了。参考代码:Application->ShowMainForm = false ;对于②,可以利用技巧1所介绍的方法修改注册表,键值如下:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run ,使用的是WriteString()方法。这是冰河等多种旧***惯用的启动手段之一(当然还有文件关联、注入dll等方法);对于③,要使程序图标不显示在任务栏上,也很简单,调用API函数SetWindowLong 可以让程序运行后不出现在任务栏里,不过要放在窗体的OnCreate()里面。代码如下:
  SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
  对于④,调用RegisterServiceProcess API 函数将程序注册成为一个服务模式程序,让它运行在较高的优先级下,就不会出现在程序列表中(对Win9X有效,WinNT/2000/XP下无效)。具体的代码请参考笔者的《一个简单***程序的编写与伪装策略》一文,不在此重叙(请参考《***防线》2002年第6期)。对于⑤,要先定义捕获Windows消息WM_HOTKEY的钩子函数,然后向Windows加入一个全局原子,并保留其句柄,最后向Windows登记热键,这个可以调用API函数RegisterHotKey来实现。
  技巧⒌使用定时触发器
  在C++ Builder 环境下,定时触发器即Timer控件,有时候我们希望程序隔一段时间重复执行相同的动作,比如对QQ密码截获的时候,就要隔一段间隔寻找一次QQ登录窗口。在C++ Builder 中,只要将执行这些动作的代码放到一个Timer中去就OK了。
  听说“中国***”病毒运行几分钟后就自动创建一个新的线程,用于寻找OICQ的“发送消息”窗口,在10分钟内一直在找,一旦找到就将“去******”等带有政治色彩的言论发送给受害者QQ上的好友,10分钟后自动结束该线程。我想在查找“发送消息”窗口的10分钟内就运用了定时器,该病毒是用汇编开发的。可是在C++ Builder中是如何运用的呢?其实控件的出现使得编程变得很简单,添加一个Timer控件,设置几下控件的属性,双击Timer控件,将代码放到里面去就行了。程序执行的时候,相隔指定的时间就重复执行里面的代码了。实际上笔者在上一期的“程序一”中寻找QQ登录窗口时,就运用了定时器,请读者参考光盘中的源程序。
  有关编程技巧的介绍到此为止,请读者参考另类书籍,掌握更多的***编程技巧,编写出受欢迎的***程序来。
  五、Socket 编程与网络通信基础
  由于本文的主题是“***编程基础”,而***是互连网上“来无影,去无踪”的黑衣人,如冰河、网络神偷等***程序都是基于互连网的,谈***编程离开网络编程就会大失其味。所以,下面接着谈谈网络编程,大凡基于网络应用的程序都离不开Socket。
  Socket 为套接字之意,是作为计算机与计算机之间通信的接口。有关Socket的概念在第6期《***防线》的《Socket 编程的基础和基本过程》一文中有详细的描述,请大家参考,不在此多叙。需要指出的是:Winsock是访问众多的基层网络协议的一种接口,在每个Win32平台上,它都以不同的形式存在着,Winsock 是网络编程的接口,不是协议,这是容易弄错的地方。
  现在来谈谈Winsock 编程的过程,大凡在Win32平台上的Winsock编程都要经过下列的基本步骤:定义变量->获得Winsock版本->加载Winsock库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载Winsock库,释放所有资源。
  下面以一道极其简单的程序来说明如何进行Winsock编程。程序四:编一个程序来获取本地机器的IP地址。

  使用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...>  加载好文件之后,就可以在CheckIP.cpp文件里加入以下代码了:
  //-------Begin from ------------
  //包含需要使用的头文件
  #include "stdafx.h"
  #include "windows.h"
  #include
  #include "stdio.h"
  #include "stdlib.h"
  #include "string.h"
  void CheckIP(void) //定义CheckIP()函数,用于获取本机IP地址
  {
  WORD wVersionRequested;// WORD类型变量,用于存放Winsock版本的正确值
  WSADATA wsaData;
  char name[255];//定义用于存放获得的主机名的变量
  CString ip;//定义IP地址变量
  PHOSTENT hostinfo;
  wVersionRequested = MAKEWORD( 2, 0 );
  //调用MAKEWORD()获得Winsock版本的正确值,用于下面的加载Winsock库
  if ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) {
  //现在是加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行

  if( gethostname ( name,>  //如果成功地将本地主机名存放入由name参数指定的缓冲区中
  if((hostinfo = gethostbyname(name)) != NULL) {
  //这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo为PHOSTENT型的变量,下面即将用到这个结构体
  LPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
  //调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的点分表示的IP地址(如192.168.0.1)
  printf("%s/n",ip);//输出IP地址 } }
  WSACleanup( );//卸载Winsock库,并释放所有资源 } }
  int main(int argc, char* argv[])//主函数,程序的入口
  {
  CheckIP();//调用CheckIP()函数获得、输出IP地址
  return 0;//由于main()定义为int型,所以应带回一个int型的数值
  }
  下面接着来看看在C++ Builder 下如何实现,其实两者的思想是一样的,只是在C++ Builder下实现的界面友好点而已,实现方法:打开C++ Builder 5,默认情况下已经新建一个工程,保存这个工程文件就可以了,构造如下面图4所示的界面,在相应之处添入下面的代码即可。
  程序代码:
  //包含头文件
  #include
  #include
  #pragma hdrstop
  #include "Unit1.h"
  #pragma package(smart_init)
  #pragma resource "*.dfm"
  TForm1 *Form1;
  __fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
  { }
  void TForm1::GetHostIpAddress()
  {// GetHostIpAddress()获得本机IP地址
  struct hostent *thisHost;
  struct in_addr in;
  char MyName[80];
  char *ptr;
  WORD wVersionRequested;
  WSADATA wsaData;
  int err;
  wVersionRequested = MAKEWORD( 2, 0 );
  err = WSAStartup( wVersionRequested, &wsaData );
  if( err != 0 )
  return;
  if(LOBYTE( wsaData.wVersion ) != 2 ||
  HIBYTE( wsaData.wVersion ) != 0 )
  { WSACleanup( );
  return; }
  if(gethostname(MyName,80)==SOCKET_ERROR)
  return;
  if(!(thisHost=gethostbyname(MyName)))
  return;
  memset((void *)&in,sizeof(in),0);
  in.s_addr=*((unsigned long *)thisHost->h_addr_list[0]);
  if(!(ptr=inet_ntoa(in)))
  return;
  WSACleanup( );
  Edit1->Text=AnsiString(ptr);}
  void __fastcall TForm1::FormCreate(TObject *Sender)
  { GetHostIpAddress();}
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {Close();//添加一个“确定”按钮,点击即关闭程序。}
  程序在 C++ Builder 5 下编译通过,运行界面如图4所示。通过比较你会发现他们是大同小异的,对于同一程序,两者工具各有秋千,至于选择哪种由你决定,最好是两者相得益彰。
  “临渊羡鱼,不如退而结网”,虽说“通往电脑的路不止一条”,然而对于编程,道路却只有一条,就是:动手去做,亲身实践。
  兄弟,愿你成为一个出色的舵手,用代码去驽驾电脑的世界,用编程去填充七彩的人生!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-531193-1-1.html 上篇帖子: Windows下的find命令详解 下篇帖子: Windows Live Messenger 所需的网络端口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表