老问题:如何防止要发布的程序被破解?

jukyy 2005-12-16 04:25:48
老问题了,可我对这方面没尝试过,渴望大侠指点一二。
也可以发到我的邮箱juken@21cn.com。谢谢啦!
...全文
561 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jukyy 2006-01-05
  • 打赏
  • 举报
回复
有没有一点关于防破解/跟踪的BCB的代码呀?
jukyy 2005-12-29
  • 打赏
  • 举报
回复
jukyy 2005-12-26
  • 打赏
  • 举报
回复
不走两个极端。适当地整一下就行啊。
cczlp 2005-12-20
  • 打赏
  • 举报
回复
矛和盾,没用绝对的办法
netsys2 2005-12-19
  • 打赏
  • 举报
回复
最后提醒大家一句,不要在加密上花太多的功夫!你应该把更多的时间和精力都用来完善你的软件,这样会更合算。借用一位前辈的话来忠告大家吧:花点时间考虑你自己的软件,看看它是否值得保护?如果没人用你的软件,保护也就没有意义了,不要过高估计你的软件“对世界的重要性”!
netsys2 2005-12-19
  • 打赏
  • 举报
回复
其它算法,如对称算法和Hash算法也要注意改名,否则这样:

  EncryptedCode = Blowfish(MD5(UserName),MD5(Key));

   //你的加密算法,使用了Blowfish(对称算法)和MD5(Hash算法)

   虽然那些Cracker不了解Blowfish和MD5算法的原理,也不会逆向推测它们,但他们了解你的校验算法的流程和算法名,便可马上从网上找到类似的Blowfish和MD5算法包,从而模拟你的软件仿造出注册机。

   如果你用不常见的,算法如Skipjack(NASA美国航天局标准算法)、LOKI、3-WAY、Safer之类不出名但保密程度很高的算法,并且全部改名,这样就会伤透他们脑筋了。

  当然,最好把Hash算法也全部改名,会给他们制造更多的困难。但注意,MD5和SHA之类的Hash初始值会被Cracker从内存中找到,这样他就知道你用的Hash了。所以建议同时使用MD5的变形算法Ripe-MD(RMD)128或160或其它的Hash,如Tiger、Haval等算法。

第三招:阻止别人调试

   还有一点,调试器对我们的威胁很大,我们不会让Cracker们舒舒服服地使用SoftICE、TRW或OllyDbg来调试我们的程序。除了常用的MeItICE方法外,这里我给一个笔者写的方法:

   {检查自己的进程的父进程是否为Explorer.exe,否则是被调试器加载了}

   {不过注意,控制台程序的父进程在WinNT下是Cmd.exe!}

   {注意加载TlHelp32.pas单元}

  procedure CheckParentProc;
   var //检查自己的进程的父进程
   Pn: TProcesseNtry32;
   sHandle:THandle;
   H,ExplProc,ParentProc:Hwnd;
   Found:Boolean;
   Buffer:array[0..1023]of Char;
    Path:string;
   begin
   H:= 0;
   ExplProc:= 0;
   ParentProc:= 0;
   //得到Windows的目录
   SetString(Path,Buffer)
   GetWindowsDirectory(Buffer,Sizeof(Buffer)- 1));
   Path:= UpperCase(Path)+ '\EX PLORER.EXE';//得到Explorer的路径
   //得到所有进程的列表快照
   sHandle:= CreateToolHelp32Snap Shot(TH32CS_SNAPALL,0);
   Found:= Process32First(sHandle,Pn);//查找进程
   while Found do //遍历所有进程
   begin
   if Pn.szExeFile = ParamStr(0)then //自己的进程
   begin
   ParentProc:= Pn.th32ParentProcessID://得到父进程的进程ID
   //父进程的句柄
   H:= OpenProcess(PRO CESS_ALL_ACCESS,True,Pn.th32Parent ProcessID);
   end
   else if UpperCase(Pn.szExeFile)= Path then
   ExplProc:= Pn.th32ProcessID;//Ex plorer的PID
   Found:= Process32Next(sHandle,Pn);//查找下一个
   end;
   //父进程不是Explorer,是调试器……
   if ParentProc <> ExplProc then
   begin
   TerminateProcess(H,0);//杀之!除之而后快也! :)
   //你还可以加上其它什么死机代码来消遣消遣这位可爱的Cracker:)
    end
   end

   你可以在Delphi或者VC中试试,这样可以把Delphi和VC杀掉了,因为你现在用的是Delphi和VC的内置调试器来运行你的程序。调试的时候你还是把它的注释删掉吧,发布时别忘记激活哟!

第四招:保护字符串

  最后一个问题,这也是一个非常重要的问题:保护你的字符串!字符串在注册模块中非常重要!当一个富有经验的Cracker破解你的软件时,首先做的就是窃取你的字符串。比如他会输入错误的注册码,得到你关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或者“Invalid key(please input again)”等等,然后用OllyDbg进行断点调试或者用WinDASM、IDA Pro等静态分析工具在被他脱壳后的程序中查找那个字符串,找到后进行分析。因此,请一定加密你的字符串! 使用时再临时解密出来,而且要尽量少使用消息提示框,避免被Cracker找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。
jukyy 2005-12-19
  • 打赏
  • 举报
回复
啊。我只想简单地搞一搞,就是不让一下子就给破解了!还是提供点可行的方法吧。最好给点源代码,谢了啊!
ccrun.com 2005-12-19
  • 打赏
  • 举报
回复
象网游一样,频繁发布升级包~~~





呵呵,开个玩笑,会被用户骂死的。
happyct 2005-12-19
  • 打赏
  • 举报
回复
if ParentProc <> ExplProc then两个永远都等于0
happyct 2005-12-19
  • 打赏
  • 举报
回复
把 netsys2(来电!) 提供的方法试了一下,没有效果,就是不见窗体,其他一切正常。难得我哪里错了?还是能运行的啊

var
Form1: TForm1;
procedure CheckParentProc;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
CheckParentProc;
end;

procedure CheckParentProc;
var //检查自己的进程的父进程
Pn: TProcesseNtry32;
sHandle:THandle;
H,ExplProc,ParentProc:Hwnd;
Found:Boolean;
Buffer:array[0..1023]of Char;
Path:string;
begin
H:= 0;
ExplProc:= 0;
ParentProc:= 0;
//得到Windows的目录
SetString(Path,Buffer,1023);
GetWindowsDirectory(Buffer,Sizeof(Buffer)-1);
Path:= UpperCase(Path)+ '\EXPLORER.EXE';//得到Explorer的路径
//得到所有进程的列表快照
sHandle:= CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
Found:= Process32First(sHandle,Pn);//查找进程
while Found do //遍历所有进程
begin
if Pn.szExeFile = ParamStr(0)then //自己的进程
begin
ParentProc:= Pn.th32ParentProcessID;//得到父进程的进程ID
//父进程的句柄
H:= OpenProcess(PROCESS_ALL_ACCESS,True,Pn.th32ParentProcessID);
end
else if UpperCase(Pn.szExeFile)= Path then
begin
ExplProc:= Pn.th32ProcessID;//Ex plorer的PID
Found:= Process32Next(sHandle,Pn);//查找下一个
end;
//父进程不是Explorer,是调试器……
if ParentProc <> ExplProc then
begin
Found := true;
TerminateProcess(H,0);//杀之!除之而后快也! :)
break;
//你还可以加上其它什么死机代码来消遣消遣这位可爱的Cracker:)
end;
end;
end;

只是测试一下。
oldtab 2005-12-19
  • 打赏
  • 举报
回复
留个记号。
jukyy 2005-12-19
  • 打赏
  • 举报
回复
呵呵呵。

感谢!还是希望有人提供一些简单易行的BCB源代码!
编译失败 2005-12-17
  • 打赏
  • 举报
回复
老答案:

如果你的东西好,再高明的的加密都会被破解
如果东西不好,加的再好又有什么用呢
constantine 2005-12-17
  • 打赏
  • 举报
回复

老答案:

如果你的东西好,再高明的的加密都会被破解
如果东西不好,加的再好又有什么用呢
--------------
俺严重同意,windows都给破了,难道你比ms厉害
kwokwinglau 2005-12-17
  • 打赏
  • 举报
回复
我倒,楼上高啊.
  • 打赏
  • 举报
回复
所以说,做软件就要做行业软件,拉住大客户就行了。
搞什么加密?:)
loujing 2005-12-17
  • 打赏
  • 举报
回复
用加密狗,看起来专业一点。
samchoy 2005-12-17
  • 打赏
  • 举报
回复
简单,软件别写得太好,自然没人有兴趣去破解了 ^_^
lhj 2005-12-16
  • 打赏
  • 举报
回复
不过花那么多时间去防破解,除非软件特别好,否则还是多花时间在完善软件上。总是会有人愿意买的。
lhj 2005-12-16
  • 打赏
  • 举报
回复
破解是永远都存在的,这是咱们中国程序员的悲哀。就说BCB吧,我现在用的就是破解版的,没有办法,穷啊。

如果都反盗版,那咱们也只能用一些开源的产品了,什么eclipse也可以编译C/C++的代码,linux + mysql + eclipse(或者vi + gcc等)恐怕要成为首选了。

不过简单的加密方法是
1,欺骗性加壳,比如BCB写的代码,伪装成VC的。
2,自己在程序内部关键部位加入汇编代码和花指令,防止一般的反编译。
3,加入反跟踪技术(检测系统有没有跟踪软件,加上代码执行时间片判断,一般跟踪时间片和正常运行的时间不一样,检测到不一样后进入乱代码让跟踪者陷入麻烦)。


加载更多回复(2)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧