首页
社区
课程
招聘
vcasm的多进程反跟踪技术学习心得(菜鸟篇)
2004-12-15 22:04 6332

vcasm的多进程反跟踪技术学习心得(菜鸟篇)

syy 活跃值
1
2004-12-15 22:04
6332
vcasm的vprotector程序中使用的多进程(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++)
        {
        //        将文件名中的\变成-
                if(*(char*)(lpFilename+i)==0x5c)*(char*)(lpFilename+i)=0x2d;
        }
mHandle=CreateFileMapping((HANDLE)-1,0,PAGE_READWRITE,0,0x400,lpFilename);
GetLastError()必须紧跟在后面,如果中间还有其他的api,他返回的就不知道是什么了.
if(GetLastError()!=ERROR_ALREADY_EXISTS)
        {
                mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum=0;                                        //初始化累加值
        }
        else
        {
                mapview=MapViewOfFile(mHandle,FILE_MAP_ALL_ACCESS,0,0,0); //提交物理内存
        sum =(char*)((char*)mapview+0x3ff);
        *sum+=1;                                        //累加值+1
        }

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

vc++的代码如下:
#include "stdafx.h"

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

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

        return 0;
}

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞7
打赏
分享
最新回复 (11)
雪    币: 319
活跃值: (2329)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
csjwaman 24 2004-12-15 22:23
2
0
厉害!学习了。
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 5 2004-12-15 23:42
3
0
冰山一角:o
雪    币: 262
活跃值: (152)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
vcasm 1 2004-12-16 02:49
4
0
恭喜..继续努力 :)
雪    币: 78
活跃值: (115)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
采臣·宁 1 2004-12-16 08:35
5
0
不错,如果再有VCASM对应的代码就更好了
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
pendan2001 4 2004-12-16 09:38
6
0
厉害啊,学习 啊
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2004-12-16 12:34
7
0
好文章。。。谢谢
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2004-12-16 12:38
8
0
逼妖人献身~~~
支持+学习
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-12-16 14:28
9
0
进程交换资料的方法很多,有 file mapping, mailslot, named pipe, etc
雪    币: 85519
活跃值: (198845)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2004-12-16 22:40
10
0
支持!!!
雪    币: 245
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
matali 2004-12-17 01:38
11
0
楼主和vcasm是不是同一个人的呀,分析得这么仔细,有可能是哦!
雪    币: 213
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
d1y2j3 2004-12-20 15:57
12
0
请楼主讲讲你调试的时候是怎么反的好了
游客
登录 | 注册 方可回帖
返回