代码的远程调用

代码的远程调用涉及到以下技术难点

1.代码的拷贝:


    
    
DWORD CodeSize  =   0 ;
DWORD CodeStart 
=   0 ;
_asm
{
   mov eax, _end
   sub eax, _begin
   mov CodeSize, eax    mov eax, _begin
   mov CodeStart, eax
   jmp _end
_begin:
   
//此处是具体的功能代码
_end:
 }
 

// 计算要分配的空间  
DWORD ToAllocateSize  =  CodeSize  +   sizeof ( int );

// 分配空间
LPVOID RemotePointer  =  VirtualAllocEx( RemoteProcess, NULL, ToAllocateSize, MEM_COMMIT  |  MEM_RESERVE, PAGE_EXECUTE_READWRITE);     

// 拷贝代码
WriteProcessMemory(RemoteProcess, RemotePointer, reinterpret_cast < char *> (CodeStart), CodeSize, NULL);   
// 释放分配的空间
VirtualFreeEx(RemoteProcess, RemotePointer, CodeSize, MEM_DECOMMIT);
VirtualFreeEx(RemoteProcess, RemotePointer, 
0 , MEM_RELEASE);

2.参数的传递:参数传递的难点在于定位,在上面的基础上面继续完成参数的传递

 

int  Param1  =  GetTickCount();               // 用于测试的参数,此处用GetTickCount来赋值是表明此值不是常量,所以需要传递给调用的代码
DWORD CodeSize  =   0 ;
DWORD CodeStart 
=   0 ;
_asm
{
   mov eax, _end
   sub eax, _begin
   mov CodeSize, eax    mov eax, _begin
   mov CodeStart, eax
   jmp _end
_begin:
//注意,下面是使用传递过来的数据
   
//获取重定位信息
   call delta
delta:  pop ebp
   mov eax, offset delta
   sub ebp, eax  
//完成重定位,得到_end的真实地址,_end之后跟的是数据
   mov ebx, _end
   add ebx, ebp
//上面的步骤执行完了之后,ebx里面就是_end的实际位置了,在这里也就是指向Param1了

_end:
}
   
// 计算要分配的空间  
DWORD ToAllocateSize  =  CodeSize  +   sizeof ( int );

// 分配空间
LPVOID RemotePointer  =  VirtualAllocEx( RemoteProcess, NULL, ToAllocateSize, MEM_COMMIT  |  MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// 拷贝代码
WriteProcessMemory(RemoteProcess, RemotePointer, reinterpret_cast < char *> (CodeStart), CodeSize, NULL);
// 接着前面的代码拷贝数据
WriteProcessMemory(RemoteProcess, RemotePointer  +  CodeSize, reinterpret_cast < char *> ( & Param1),  sizeof ( int ), NULL);

// 释放分配的空间
VirtualFreeEx(RemoteProcess, RemotePointer, CodeSize, MEM_DECOMMIT);
VirtualFreeEx(RemoteProcess, RemotePointer, 
0 , MEM_RELEASE);

 

3.调用:调用实在是再简单不过的事情了,上面的代码完成之后,可以使用你可以想到的调用方式,目前有实际意思的是远程线程以及网络调用

   远程线程的方法:

 

int  Param1  =  GetTickCount();               // 用于测试的参数,此处用GetTickCount来赋值是表明此值不是常量,所以需要传递给调用的代码
DWORD CodeSize  =   0 ;
DWORD CodeStart 
=   0 ;
_asm
{
   mov eax, _end
   sub eax, _begin
   mov CodeSize, eax    mov eax, _begin
   mov CodeStart, eax
   jmp _end
_begin:
//注意,下面是使用传递过来的数据
   
//获取重定位信息
   call delta
delta:  pop ebp
   mov eax, offset delta
   sub ebp, eax   
//完成重定位,得到_end的真实地址,_end之后跟的是数据
   mov ebx, _end
   add ebx, ebp
//上面的步骤执行完了之后,ebx里面就是_end的实际位置了,在这里也就是指向Param1了

_end:
}
   
// 计算要分配的空间  
DWORD ToAllocateSize  =  CodeSize  +   sizeof ( int );

// 分配空间
LPVOID RemotePointer  =  VirtualAllocEx( RemoteProcess, NULL, ToAllocateSize, MEM_COMMIT  |  MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// 拷贝代码
WriteProcessMemory(RemoteProcess, RemotePointer, reinterpret_cast < char *> (CodeStart), CodeSize, NULL);
// 接着前面的代码拷贝数据
WriteProcessMemory(RemoteProcess, RemotePointer  +  CodeSize, reinterpret_cast < char *> ( & Param1),  sizeof ( int ), NULL); 

// 远程调用
HANDLE RemoteThread  =  CreateRemoteThread( RemoteProcess, NULL,  0 , reinterpret_cast < PTHREAD_START_ROUTINE > (RemotePointer),  0 0 , NULL);
WaitForSingleObject(RemoteThread, INFINITE);  

// 释放分配的空间
VirtualFreeEx(RemoteProcess, RemotePointer, CodeSize, MEM_DECOMMIT);
VirtualFreeEx(RemoteProcess, RemotePointer, 
0 , MEM_RELEASE);

 

    网络调用可以把上述的代码进行修改之后,通过网络传输之后,由接受放负责调用
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值