精典的ASP传奇的J2EE新生的NETFTP服务器服务器安全WINDOWSB/S 模式WEB安全WAP世界动态网站推广宣传
空间服务器数据库技术邮局服务器站長工具硬设与组建Alexa专题DHTML项目管理WEB标准电脑硬件
病毒知识电脑使用布线协议接入交换路由局域网无线网络网络规划
Visual BasicVisual C/C++MssqlMySqloracleSybase 存在安全风险进程系统进程列表应用程序进程列表其它进程列表
黑客编程漏洞分析本地提权免杀技术脚本漏洞数据库注入安全防护内网渗透加密解密工具使用
WAP技术WAP入门
 您的位置:   >> 相关知识 >> 黑客技术 >> 加密解密 >>

用进程注入来实现一个壳(原理)

合金网络科技

 
  添加日期:2007-12-23 点击次数:3次  
   
  感谢 too2y , 老王.
这是我在学习老王的壳后, 参考网上的一些例子做的。
比老王的壳差的太远, 希望各位不要见笑.
如果各位写出了类似的加壳器, 希望发一个给我。

启动前先启动 Calc.exe, 改一下, 用 Explorer.exe 也可以。



代码:

--------------------------------------------------------------------------------

#define UNICODE
#define _UNICODE
             
#include <windows.h>
#include <tchar.h>
#include <conio.h>
#include <psapi.h>

typedef struct _remoteparameter
{
    DWORD    rpwinexec;
    DWORD    rpcreatemutex;
    DWORD    rpsleep;
    DWORD    rpclosehandle;

    char    rpwinexecname[MAX_PATH];
  HANDLE   rphMutex;
  TCHAR    rpMutex[30];
    
}REMOTEPARAMETER, *PREMOTEPARAMETER;

DWORD  WINAPI remote(LPVOID);
DWORD  processtopid(TCHAR*); 
HANDLE createremote(PTSTR);   


TCHAR       cMutex[8];


int main()
{
     TCHAR       ExeName[MAX_PATH];
    HANDLE      hRemoteThread;
    HANDLE      hMutex;
    int        ret; 

  _tcscpy(cMutex,_T('simonzh'));
    hMutex = OpenMutex(SYNCHRONIZE, TRUE, cMutex );
    if (hMutex == NULL)
    {
        ret=GetModuleFileName(NULL,ExeName,MAX_PATH);
        if(ret==0)
        {
            OutputDebugString(_T('GetModuleFileName Error\n'));
            getche();       
            return -1;
        }


        if((hRemoteThread=createremote(ExeName))==NULL)  
        {
            OutputDebugString(_T('CreateRemote Error\n'));
            getche();       
          return -1;
        }
    
        return 0;
    }

    CloseHandle(hMutex);
  
    // 上面相当于一个壳的 Loader 
      // 下面相当于被加壳的原程序.
    _tprintf(_T('---[ This is not me.  HaHaHa... ]---\n'));  
    getche();
    return 0;
}
        

DWORD processtopid(TCHAR *processname)
{
    DWORD  lpidprocesses[1024],cbneeded,cprocesses;
    HANDLE  hprocess;
    HMODULE hmodule;
    UINT   i;
    TCHAR  normalname[MAX_PATH]=_T('UnknownProcess');
  
    if(!EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded))
    {
        OutputDebugString(_T('EnumProcesses Error\n'));
        return -1; 
    }

    cprocesses=cbneeded/sizeof(DWORD);
    
    for(i=0;i<cprocesses;i++)
    {
        hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
        if(hprocess)
        {
            if(EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded))
            {
                GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
                if(!_tcsicmp(normalname,processname)) 
                {
                    CloseHandle(hprocess);
                    return (lpidprocesses[i]);
                }
            }
        }

    }

    CloseHandle(hprocess);
    return 0;
}


HANDLE createremote(PTSTR ExeName)
{
  HANDLE      ethread;
    HANDLE      rphandle;
    TCHAR       name[15];
    TCHAR       *remotethr;
    TCHAR       *remotepar;
    DWORD       remotepid;
    int        cb;
    HINSTANCE     hkernel32;
    REMOTEPARAMETER  rp;

    _tcscpy(name,_T('Calc.exe'));

    
    while(1)
    {
        remotepid=processtopid(name); 
        
        if(remotepid==-1)
        {
            return NULL;
        }
        else if(remotepid==0)
        {
            OutputDebugString(_T('Remote Process isnt running\n')); 
            Sleep(1000);
            continue;
        }


      rphandle=OpenProcess(PROCESS_CREATE_THREAD |   
                    PROCESS_VM_OPERATION |   
                            PROCESS_VM_WRITE,      
                           FALSE,remotepid);
      if(rphandle==NULL)
        {
          Sleep(1000);
            continue;
        }
        else
        {
            break; 
        }
    }

    cb=sizeof(TCHAR)*4*1024;
    remotethr=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE); 
    if(remotethr==NULL)
    {
        OutputDebugString(_T('VirtualAllocEx for Thread Error\n'));
    CloseHandle(rphandle);    
        return NULL;
    }

  if(WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL)==FALSE)
    {
        OutputDebugString(_T('WriteProcessMemory for Thread Error\n'));
    CloseHandle(rphandle);
        return NULL;
    }

    {  
        memset(&rp,0,sizeof(rp));
    _tcscpy(rp.rpMutex, cMutex);
        WideCharToMultiByte(CP_ACP,0,ExeName,-1,rp.rpwinexecname,_tcslen(ExeName),NULL,NULL);
        
        hkernel32=GetModuleHandle(_T('kernel32.dll'));
        rp.rpwinexec=(DWORD)GetProcAddress(hkernel32,'WinExec');
        rp.rpcreatemutex=(DWORD)GetProcAddress(hkernel32,'CreateMutexW');
        rp.rpsleep=(DWORD)GetProcAddress(hkernel32,'Sleep');
        rp.rpclosehandle=(DWORD)GetProcAddress(hkernel32,'CloseHandle');
    }  
    
    cb=sizeof(TCHAR)*sizeof(rp);
    remotepar=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
    if(remotepar==NULL)
    {
        OutputDebugString(_T('VirtualAllocEx for Parameter Error\n'));
        CloseHandle(rphandle);
        return NULL;
    }

    if(WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL)==FALSE)
    {
        OutputDebugString(_T('WriteProcessMemory for Parameter Error:'));
        CloseHandle(rphandle);
        return NULL;
    }
  
    
    ethread=CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
    if(ethread==NULL)
    {
        OutputDebugString(_T('CreateRemoteThread Error\n'));
        CloseHandle(rphandle);
        return NULL;
    }

    return ethread;
}


DWORD WINAPI remote(LPVOID pvparam)
{
    PREMOTEPARAMETER erp=(PREMOTEPARAMETER)pvparam;

     typedef UINT  (WINAPI *EWinExec)(LPCSTR, UINT);
    typedef HANDLE (WINAPI *ECreateMutex)(LPSECURITY_ATTRIBUTES , BOOL, LPCTSTR);
     typedef VOID  (WINAPI *ESleep)(DWORD);
  typedef BOOL  (WINAPI *ECloseHandle)(HANDLE);
    
    EWinExec       tWinExec;
  ECreateMutex     tCreateMutex;
     ESleep        tSleep;
    ECloseHandle     tCloseHandle;

    tWinExec=(EWinExec)erp->rpwinexec;
    tCreateMutex=(ECreateMutex)erp->rpcreatemutex;
    tSleep=(ESleep)erp->rpsleep;
    tCloseHandle=(ECloseHandle)erp->rpclosehandle;

    erp->rphMutex=tCreateMutex(NULL, TRUE, erp->rpMutex);

    if(tWinExec(erp->rpwinexecname, SW_SHOW)<=31)       
    {
        return -1;
    }
  
    tSleep(4000);
    tCloseHandle(erp->rphMutex);
    return 0;
}
精典的ASP精选TOP
· 利用ADODB.Stream 防盗链
· Adodb.Stream说明手册
· 采集需要登录
· ASP 判断远程图片是否存在
· 在ServerXMLHTTP组件中使用代理服务器
· 用XMLHTTP通过代理服务器从服务提取数据的一些问题
· objXML.readystate的值
· 互联网HTTP连接等出错代码大全
· 利用XMLHTTP实现的二级连动Select
· 利用 xmlhttp 分块上传文件
 
服务器安全点击TOP
· 新云最新漏洞总结篇
· 各类网站的默认数据库和密码
· Windows Server2003 防木马权限设置IIS服务器安全配置整理
· 针对ASP网站的Win 2003硬盘安全设置
· IIS 6 的PHP 最佳配置方法
· 利用SA.exe 将Iusr_victim克隆为Administrator
· Cmd模式下的入侵技术大全
· 破解网页代码加密
· SERV-U 6.4提权方法,通杀SERV-U版本
· 新云网站管理系统文件注入漏洞
 
硬设与组建点击TOP
· 从头到尾教你组建小型局域网20
· 从头到尾教你组建小型局域网19
· 从头到尾教你组建小型局域网18
· 从头到尾教你组建小型局域网17
· 从头到尾教你组建小型局域网16
· 从头到尾教你组建小型局域网15
· 从头到尾教你组建小型局域网14
· 从头到尾教你组建小型局域网13
· 从头到尾教你组建小型局域网12
· 从头到尾教你组建小型局域网11
 
病毒知识点击TOP
· 不再重装 手动清除顽固病毒AutoRUN
· 木马静态变动态 DLL木马程序大揭秘
· 详解一个很牛X的网马
· 一个网马
· Trojan-Downloader.Win32.Delf.bab
· 抓了一个AJAX的网马
· 迅雷5 最新0day利用程序
· 自动关掉270种杀毒软件
· RealPlayer 最新网马
· 五个反弹型后门的源代码
 
WINDOWS点击TOP
· 4【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 3【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 2【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 1【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· Capture an HTML document as an image
· 如何给eWebEditor编辑器加上运行代码框功能
· 给CuteEditor5增加了高亮代码显示功能
· CuteEditor6.0使用配置心得体会
· 关于IE插件的CLSID问题
· 对开发的程序(制作CAB)进行签名,并允许网站中使用
  "凌风微型文章系统",针对"搜索引擎"完美设计,提高"搜索引擎"对网站容量,质量的评估值,"扁平化,转静态 ..."