多进程:Vcasm的多进程反跟踪技术学习心得体会(菜鸟篇)

vcasmvprotector中使用多进程(Process)反跟踪技术很有新意反跟踪技术中比较常见是多线程(Thread)技术我以前见到多进程主要是使用个进程调试另个进程这种方式只能认为是调试反跟踪不能称为真正多进程反跟踪技术而vcasm思路方法本人认为是真正意义上多进程反跟踪技术这里简单介绍说明
要想利用多进程必须处理好多个进程的间数据交换问题和进程同步问题如果各进程的间没有数据交换就不成其为多进程技术了谈到进程间数据交换我们首先想到是动态连接库(dll)但vcasm采用了种更为简便思路方法下面就说说这种思路方法
在谈vcasm数据交换思路方法的前先看几个API
CreateFileMapping用来生成个内存文件映射对象定义如下
HANDLE CreateFileMapping(
  HANDLE hFile,              // 映射文件句柄
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                             // 安全属性
  DWORD flProtect,           // 对象保护属性
  DWORD dwMaximumSizeHigh,   // 对象大小高32位
  DWORD dwMaximumSizeLow,    //对象大小第32位e
  LPCTSTR lpName             // 文件映射对象名
);
当hFile=(HANDLE)-1时得到不是实际文件映射对象而是个操作系统分页文件返回个特定大小内存块对象这个内存块对象可以被多个进程用对象名进行操作这就是说可以用它来交换数据了判断这个对象是否存在呢?这又要用到
DWORD GetLastError(VOID)
当返回值等于ERROR_ALREADY_EXISTS时则介绍说明这个对象已经存在了
好了下面就用实际介绍说明vcasm比较复杂我并没按原写代码而是简化成了段介绍说明思路方法代码只想介绍说明下这种思路方法线程同步代码这里就不写了,
有兴趣自己逆向

  GetModuleFileName(0,lpFilename,0x200); //取得文件名
   然后将文件名加以变动作为mapview
for(i=0;i<0x200;i)
  {
  //  将文件名中\变成-
    (*(char*)(lpFilename+i)0x5c)*(char*)(lpFilename+i)=0x2d;
  }
mHandle=CreateFileMapping((HANDLE)-1,0,PAGE_READWRITE,0,0x400,lpFilename);
GetLastError必须紧跟在后面,如果中间还有其他api,他返回就不知道是什么了.
(GetLastError!=ERROR_ALREADY_EXISTS)
  {
    mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum=0;                                        //化累加值
  }
  
  {
    mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum1;                                        //累加值+1
  }

   (*sum>5)     //大于5次就该结束了
   {
     MessageBox(0,"yes","ok",0);
     UnmapViewOfFile(mapview);   打开fileview可以不要了
     CloseHandle(mHandle);        handle也可以关掉了
   }
   
   {
    还没到 5次,再开个进程
    CreateProcess(0,GetCommandLine,0,0,0,0,0,0,&StartupInfo,&ProcessInformation);
   }
   Sleep(50);    将执行权交出去,休息
   ExitProcess(0);  其他进程已经打开了,本进程就可以关掉了.

vc代码如下:
# "stdafx.h"

 APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                            nCmdShow)
{
   
  DWORD i;
  LPVOID mapview;
  HANDLE mHandle;
  PCHAR  sum;
  LPTSTR lpFilename=(LPTSTR)malloc(0x200);
  STARTUPINFO StartupInfo;
  StartupInfo.cb=(STARTUPINFO);
  PROCESS_INFORMATION ProcessInformation;  
  GetModuleFileName(0,lpFilename,0x200); //取得文件名
  GetStartupInfo(&StartupInfo); //填写StartupInfo结构
    for(i=0;i<0x200;i)
  {
  //  将文件名中\变成-
    (*(char*)(lpFilename+i)0x5c)*(char*)(lpFilename+i)=0x2d;
  }
    mHandle=CreateFileMapping((HANDLE)-1,0,PAGE_READWRITE,0,0x400,lpFilename);
  (GetLastError!=ERROR_ALREADY_EXISTS)
  {
    mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum=0;                                        //化累加值
  }
  
  {
    mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum1;                                        //累加值+1
  }

   (*sum>5)
   {
     MessageBox(0,"yes","ok",0);
     UnmapViewOfFile(mapview);
     CloseHandle(mHandle);
   }
   
   {
    
    CreateProcess(0,GetCommandLine,0,0,0,0,0,0,&StartupInfo,&ProcessInformation);
   }
   Sleep(0);
   ExitProcess(0);

   0;
}


  • 篇文章: 用编程思路方法突破NT安全机制

  • 篇文章: Linux平台socks5代理
  • Tags:  windows多进程编程 多线程多进程 php多进程 多进程

    延伸阅读

    最新评论

    发表评论