Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398983
  • 博文数量: 57
  • 博客积分: 193
  • 博客等级: 入伍新兵
  • 技术积分: 1192
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-13 14:37
个人简介

当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘

文章分类

全部博文(57)

文章存档

2017年(5)

2015年(7)

2014年(27)

2013年(18)

我的朋友

分类: PERL

2013-04-21 13:42:38

必须先安装Win32::Process::Memory及相关模块,Win32是一系列模块,最好全部安装,说不定哪个函数就要用到这些模块了。推荐使用PPM安装,这样可以在安装过程中自动检测并安装相关联模块。

use strict;
use diagnostic;
use Win32::Process::Memory;
my $HexValue=0X5A5A5A5A; 可以直接使用16进制。
if($ARGV[0]) 这里通过VC向其传递两个参数,ARGV0是进程ID,ARGV1是通信的内存地址:注意其参数形式是这样的:perl a.pl ARGV0 ARGV1....,这上和Java的是不一样的,java的命令行参数认为:java a.java,其中a.java就是其第一个参数。
{
    根据PID打开进行内存,还有其它方式打开,比如根据可执行文件名打开,
    my $proc = Win32::Process::Memory->new({ pid  => $ARGV[0] });
    Set_XXX是个系列函数,可以写字节,双字节和四字节,还可以写一段区域。返回值是真正写入的字节数量
    my $setbytes = $proc->set_i32($ARGV[1], 0X5A5A5A5A);
    my $testString="Input by Perl,read by VC\n\n\0\0aass";
    写入字符串,也就是写一段区域
    $proc->set_buf($ARGV[1],$testString);
    
    if(($setbytes == 4))对写入的长度进行判断
    {print "OK\n";}
    else
    {print "Error\n";}

}
else
{
    print "End\n";
}
sleep(50); 休眠一会,然后退出
print "SleepOver\n";

 

 VC程序
 ::GetWindowThreadProcessId(this->m_hWnd,&pPID);
 LPVOID pAddress;
 CHAR buffer[100];
 //分配一段内存区域用于进行通信
 pAddress = ::VirtualAlloc(NULL,1024*4,MEM_COMMIT,PAGE_READWRITE);
    //格式化字符串,用于命令行启动perl,共2个参数,第一个是PID,第二个是地址
 sprintf(buffer,"perl.exe a.pl %d  %d\0",pPID,(DWORD)pAddress);
 //::system(buffer);//这个函数是阻塞的 两上方式都可以启动Perl
 WinExec(buffer,SW_HIDE);//这个函数不阻塞
 while (1)
 {
     //等待写入标志数据后,说明Perl已经完成了通信,寻就可以继续向下运行。
  if((*((DWORD*)pAddress))==0X5A5A5A5A)
  {
   MessageBox(L"COM OK");
   break;
  } 
 }
 //这里可以做点其它事情
 //释放空间
 ::VirtualFree(pAddress,1024*4,PAGE_READWRITE);

写得比较简单,希望高手指点

阅读(2764) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~