2015-04-01 84 views
-3

我想用VMProtect's Markers来标记包含应该受保护的字符串常量的代码块。Delphi 7 - VMProtect实现的一些错误

uses VMProtectSDK; 

VMProtectBegin(MARKER_NAME); 
... 
VMProtectEnd; 

// DELPHI FUNCTION EXAMPLE : 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
VMProtectBegin('Test marker'); 
if StrToIntDef(Edit1.Text, 0) mod 17=13 then 
    MessageDlg(VMProtectDecryptStringA('Correct password'), mtInformation, [mbOK], 0) 
else 
    begin 
    MessageDlg(VMProtectDecryptStringA('Incorrect password'), mtError, [mbOK], 0); 
    Edit1.SetFocus; 
    end; 
VMProtectEnd; 
end; 

我试图实现它,但我得到了一些错误:

[Error] Unit1.pas(xx): Unterminated string 
[Error] Unit1.pas(xx): ')' expected but identifier 'Krypt1' found 
[Error] Unit1.pas(xx): Unterminated string 
[Error] Unit1.pas(xx): Missing operator or semicolon 
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' 

如何解决这个问题呢?我可以问你教我如何编写正确的代码行(或示例)。

我在我的Delphi 7代码的实现:

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread); 
var Payload, Host, Header, Krypt1, Krypt2:String; 
begin 
VMProtectBegin 
(' 
Krypt1 := EncryptString('website.com', 'pwd'); 
Krypt2 := EncryptString('website.net', 'pwd'); 
'); 
VMProtectEnd; 
     if (pos('CONNECT',athread.NetData)<>0) or (pos('HTTP',athread.NetData)<>0) then begin 
     if host.Text = 'Host' then begin 
      Payload := 'GET http://'+Krypt1+'/ HTTP/1.1'+#13#10; 
      Host := AddHeader(AThread.NetData,'Host: '+Krypt2+''#13#10); 
      AThread.NetData := Payload+Host; 
      end; 
    end; 
end; 

我希望得到任何帮助。

干杯, RZV

+0

您提供的节目究竟是如何从Delphi代码调用,具有特定的代码示例的链接。 (这是两张图片之间的内容)很明显,你发布的代码是无效的Delphi代码(你不能像在这里完成的那样将两行源代码作为函数参数传递)。仔细阅读链接页面,并研究它提供的代码,这确实会加密嵌入的**字符串常量** - 它不会以您尝试使用它的方式加密**变量**,因为这些内容变量在编译时不知道.. – 2015-04-01 22:28:04

+0

谢谢。那么,你能帮我写一个基于上述VMWare的delphi7函数来在我的代码中使用吗? – RzV 2015-04-02 00:42:45

+0

你能解释一下VMWare是如何突然出现的。你能不能认识到你问过关于编译错误的问题?我希望你不要指望我们为你写程序。 – 2015-04-02 08:59:47

回答

0
VMProtectBegin 
(' 
Krypt1 := EncryptString('website.com', 'pwd'); 
Krypt2 := EncryptString('website.net', 'pwd'); 
'); 

当编译器说,这是一个未终止字符串。报价打开一个字符串,必须在同一行上终止。多行字符串没有语法。最重要的是,您需要避免出现在字符串文字中的引号字符。

你正在尝试写这样的事情我想:

VMProtectBegin 
('Krypt1 := EncryptString(''website.com'', ''pwd'');'+sLineBreak+ 
'Krypt2 := EncryptString(''website.net'', ''pwd'');'); 

这将编译,但我不认为它会做任何有用的东西。您需要将标记名称传递给VMProtectBegin。我完全不清楚传递包含Pascal代码的字符串是否合理。

也许你需要的是这样的:

VMProtectBegin(nil); 
Krypt1 := EncryptString('website.com', 'pwd'); 
Krypt2 := EncryptString('website.net', 'pwd'); 
VMProtectEnd; 
+0

请注意,该问题询问编译错误,这是我试图回答。 – 2015-04-01 20:40:29

+0

嗨,谢谢你的回答。你的第一个语法给了我[很多错误](http://pastebin.com/a76TJg4Y)。第二,没有发现错误,但由于** nil **命令,VMProtect无法隐藏和保护我的字符串。 – RzV 2015-04-01 21:09:12

+0

对不起,我忘了逃避报价。我现在已经做到了。如果您需要使用VMProtect的帮助,请向供应商寻求支持。我想我回答了关于编译错误的问题,迟到了。 – 2015-04-02 08:01:17