对于 windows 的 exe 文件如果为了防止破解也就是防止被被人修改市面上有很多加密工具各自实现方法不一样但是最通用最简单的就是给 exe 文件进行数字签名通过验证数字签名从而实现exe文件的放修改。windows的exe文件包含有资源文件、执行代码等一般不可以直接修改如果需要破解那一定是必须修改可执行代码因为资源文件可以通过命令或者第三方工具进行替换修改增加。那么如果我们对整个exe文件进行数字签名运行的时候再检查数字签名是否正确这样就从原理上可以实现防止exe文件被修改。这样就涉及到数字签名放到哪里数字签名是否可以伪造?是否可以直接跳过判断数字签名针对以上问题我们逐条探讨一、数字签名放到哪里理论上讲可以防在exe文件的资源文件中但是这样将来验证签名比较麻烦会出现循循环签名从而导致签名验证不成功。事实上大多数的exe签名都将签名数据放置在exe文件的末尾相当于将签名内容附加到exe文件的尾部。二、数字签名是否可以伪造?理论上讲数字签名是可以伪造的一般来讲签名算法是公开的那就是破解了签名算法这样当然是可以的。假如签名算法没有被破解那就只有知道被签名的内容才有可能正确的造出签名。这样只要我们不让破解者知道被签名的内容那么就无法为造出正确的数字签名。这就是我们对被签名的exe文件增加一个签名密钥值保存好这个值不让破解者发现签名就不可以伪造三、是否可以直接跳过判断数字签名破解软件如何破解最终都可能是汇编语言中的JZ改成JNZ或者JNZ改成JZ亦或是指令码改成NOP空指令执行从而避开验证。那么对于我们的程序就需要混淆更多的指令尽可能的不让破解者找到相关跳转的指令理论上讲如果破解者无法找到相关的指令那软件也就没有被破解。事实上这个没有什么绝对所谓道高一尺魔高一丈破解和反破解一直在互相促进共同进步以上原理已经讲清除了我们用delphi开发了一款签名工具可以直接给exe文件进行签名只要在被签名的程序中增加如下验证代码即可实现程序防破解当然原理已经清楚了如何增加混淆代码就是你自己的事了。procedure TForm4.SpeedButton1Click(Sender: TObject); var A_MD5 : string; B_MD5 : string; B_Bytes : TBytes; errmsg : string; B : Boolean; begin B_MD5 : GetFileContentMD5_SaltAndWithoutTail(ParamStr(0),LabeledEdit_Salt.Text); //获取实际的MD5 B : ExtractBytesFromExe(ParamStr(0),B_Bytes,errmsg); A_MD5 : TEncoding.UTF8.GetString(B_Bytes); if SameText(B_MD5,A_MD5) then Application.MessageBox(PWideChar(程序签名验证成功),提示,MB_OK MB_ICONINFORMATION) else Application.MessageBox(PWideChar(程序签名验证失败),错误,MB_OK MB_ICONERROR); end;签名工具界面A、exe 文件签名工具演示版本下载演示版本B、exe 文件签名工具源代码版本下载收费签名工具源代码