WEB开发网
开发学院软件开发VC WinNT & Win2K下实现进程的完全隐藏 阅读

WinNT & Win2K下实现进程的完全隐藏

 2006-07-19 11:36:57 来源:WEB开发网   
核心提示: 到这里,对于隐藏的方法就算告一段落,WinNT & Win2K下实现进程的完全隐藏(2),相信看过的朋友对这个思路有个非常明确的概念了吧,在理解隐藏的方法后,我们这里也与他有点类似,言归正传,我们着重开始写线程的执行部分了,如下:DWORD __stdcall ThreadProc(voi

到这里,对于隐藏的方法就算告一段落,相信看过的朋友对这个思路有个非常明确的概念了吧。

在理解隐藏的方法后,我们着重开始写线程的执行部分了。如下:

DWORD __stdcall ThreadProc(void *lpPara){
  MessageBox(NULL,"hello","hello",0);
  return 0;
}

编译执行后,你会发现出现一个非法操作错误,为什么呢?在我们以段页式内存管理的win2K操作系统中,编译时会把所有的常量编译在PE文件的.data节中,而代码段则在.text中,所以,我们拷备到宿主进程中的代码是在.text中的代码,MessageBox(NULL,(char *)指针,p,0);所指向的地址是本进程的内存虚拟地址。而在宿主进程中是无法访问的。解决的方法很简单,按旧照搬的将"hello"也拷备到目标进程中,然后再引用。同理,MessageBox函数地址编译时,也是保存在.Import中,写过Win2k病毒的朋友都知道,所有常量与函数入口地址都需在代码段定义与得出,我们这里也与他有点类似。言归正传,同样情况我们也把函数的入口地址一起写入目标进程中。

//先定义参数结构
typedef struct _RemotePara{//参数结构
  char pMessageBox[12];
  DWORD dwMessageBox;
}RemotePara;
//付值
RemotePara myRemotePara;
::ZeroMemory(&myRemotePara,sizeof(RemotePara));
HINSTANCE hUser32 = ::LoadLibrary ("user32.dll");
myRemotePara.dwMessageBox =(DWORD) ::GetProcAddress (hUser32 , "MessageBoxA");
strcat(myRemotePara.pMessageBox,"hello\0");
//写进目标进程
RemotePara *pRemotePara =(RemotePara *) ::VirtualAllocEx (hWnd ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);//注意申请空间时的页面保护属性
if(!pRemotePara)return 0;
if(!::WriteProcessMemory (hWnd ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;
//启动进将参数传递进入
HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
if(!hThread){
  return 0;
}

上一页  1 2 3 4 5  下一页

Tags:WinNT WinK 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接