Python源码另类隐藏——P4D

 

如果需要对python源文件加密似乎没什么好方法,编译成pyo/pyc也容易被反编译。在使用p4d的时候,发现一个另类的办法,将python源文件作为资源文件打包到EXE中,运行时动态加载,不产生文件,保密性稍好一点。

 

P4D

P4D(Python for Delphi)可以让delphi和python结合起来工作,delphi做桌面应用高效快捷,python有丰富的内裤,在网络处理方面有优势,结合起来非常强大。还可以随时修改python脚本来维护。

相关资源:

http://www.mmm-experts.com/

http://www.atug.com/andypatterns/pythonDelphiTalk.htm

http://code.google.com/p/python4delphi/

http://tech.groups.yahoo.com/group/pythonfordelphi/

 

Delphi调用Python

一.需要安装delphi、python、p4d

我只找到适用于python2.5的p4d,而本机安装的python27,按照设置方法设置后仍有错误,不想在本机上降级python就在虚拟机上安装了个环境。

网上的办法是在dephi中使用TPythonEngine时,设置TPythonEngine的属性:

DllName : python27.dll

RegVersion : 2.7
DllPath : c:\windows\system32\
UseLastknownVersion : false

 

二.编写python脚本并生成delphi的资源文件

1.python脚本

文件名:file1.py

print "Hello, P4D"

 

2.生成资源文件

新建一个文本文档,输入以下内容并保存为"file1.rc"文件

file1 FILE file1.py

需要delphi程序的bin目录下的brcc32.exe文件,使用它从file1.rc生成"file1.res"资源文件。

将file1.py和file1.rc文件放在同一目录下,使用命令提示符完成以下操作:

brcc32.exe file1.rc

则会在file1.py和file1.rc目录下生成file1.res。

更简单直接的方法是,将brcc32.exe复制到上述目录中,直接把file1.rc拖到brcc32.exe上,DONE!

说明:

file1.rc文件中的三个参数依次为:{资源名称} {资源类型} {资源文件}

资源名称即在delphi中调用的资源名字;

资源类型通常有:

    FILE: 一般文件  
    RCDATA:二进制文件; 
    AVI: AVI动画; 
    ICON: 图标;   
    BITMAP:位图;   
    CURSOR:光标文件;
    EXEFILE: exe文件 
    WAVE:声音文件;

资源文件就是要打包成资源的文件实体。

 

三.在delphi中使用资源文件

将上面生成的资源文件file1.res放在delphi的工程目录下,在工程中加上编译指令{$R file1.res}

{$R file1.res}

在需要使用资源时提取出来(python脚本内容存到TStrings中而不生成文件):

function ExtractRes(resType, resName: String; pyStrings: TStrings): Boolean;
var res : TResourceStream;
begin
  result := false;
  try
    res := TResourceStream.Create(HInstance, resName, Pchar(resType));
    pyStrings.LoadFromStream(res);
    result := true;
  finally
    res.free;
  end;
end;

 

调用:

procedure TForm1.Button2Click(Sender: TObject);
var pyStrings: TStrings;
begin
  pyStrings:= TStringList.Create;
  if ExtractRes('FILE', 'file1', pyStrings) then
    PythonEngine1.ExecStrings( pyStrings )
  else
    showmessage('Error on ExtractRes');
end;

 

 

* delphi代码(包括了一个直接执行python语句的功能)


文件名:Unit1.pas

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PythonEngine, PythonGUIInputOutput, StdCtrls, WrapDelphi;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    PythonGUIInputOutput1: TPythonGUIInputOutput;
    Button2: TButton;
    PythonEngine1: TPythonEngine;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R file1.res} //资源文件

//提取资源,pyStrings为返回
function ExtractRes(resType, resName: String; pyStrings: TStrings): Boolean;
var res : TResourceStream;
begin
  result := false;
  try
    res := TResourceStream.Create(HInstance, resName, Pchar(resType));
    pyStrings.LoadFromStream(res);
    result := true;
  finally
    res.free;
  end;
end;

//直接执行Memo1中的语句
procedure TForm1.Button1Click(Sender: TObject);
begin
  PythonEngine1.ExecStrings( Memo1.Lines );
end;

//提取资源并执行
procedure TForm1.Button2Click(Sender: TObject);
var pyStrings: TStrings;
begin
  pyStrings:= TStringList.Create;
  if ExtractRes('FILE', 'file1', pyStrings) then
    PythonEngine1.ExecStrings( pyStrings )
  else
    showmessage('Error on ExtractRes');
end;


end.

 

注:需要加入TPythonGUIInputOutput和TPythonEngine控件,安装P4D后可以python标签下看到。

源码下载:http://download.csdn.net/detail/mrqyoung/4799327

 

 

附:使用了P4D的delphi程序分发

分发时需要放入python对应版本的dll文件和使用到的lib,放在EXE同目录。

如使用的p4d对应python2.5 ,在python脚本中有“import md5”则:

在exe的目录中放入“python25.dll”、建立Lib目录并将“md5.py”放入Lib

 

--EOF--

posted on 2012-11-22 21:10  Mr.Q.Young  阅读(893)  评论(0编辑  收藏  举报

导航