找回密码
 注册
搜索
热搜: 回贴

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

2010-1-30 18:16| 发布者: admin| 查看: 105| 评论: 0|原作者: 云天青


Vcasm的多进程反跟踪技术学习心得(菜鸟篇) ,反跟踪,反跟踪技术
2008年06月23日 星期一 下午 01:47
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;

}




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 01:26 , Processed in 0.156979 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部