当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘
全部博文(57)
分类: 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);
写得比较简单,希望高手指点