如何使软件不被破解,或很难破解? 请看下面代码。(100分)

  • 主题发起人 主题发起人 ptfjy
  • 开始时间 开始时间
我想只有能破解一般人的加密, 才能防止被一般人解密!
就像上面的代码, 很简单, 但我就不知道如何破解,
有谁能告之, 马上给分!
 
来自:fdltc, 时间:2003-12-15 11:26:00, ID:2354291
谁说"不能破解是不可能的"?我的软件现在就从来没有人破解过。
只不过要做到这一点并不容易,需要懂得许多底层的知识,我也是经过半年的努力才做得到这一步的。具体实现比较复杂,基本上很多反破解函数是靠汇编来写的,因此不推荐菜鸟深入研究,还是买个现成的加密软件最好
你的软件从来没人破解?哈哈,建议老兄把你的方法快告诉MS,这样他们就不用
为盗版发愁了~~~
 
我自己做过一个加密工具,仅仅是将文件中的字符根据你加的密钥,转换成ASCII码,然后加上个简单的算法,比如s=s+12,(密钥是你给文件加密前,你自己定的,如1234)
解密则反之,只要是文件,应该都可以加密,一般的菜鸟打不开的
你可以也用delphi做一个
 
MS自从XP后早就无法破解了,所有可用的盗版软件都是不加密,不需激活的企业大客户版
 
的确很好破解,软件用D6写的,我花了10分钟左右crack。
所以要寻找比较好的方式,比如压栈的方法,和防动态反跟踪
PS:你的机器码不是动态算出来的吗?
 
foxphone2003的简单加密方法如同没加密一样,如果还采用str1 <> str2 的方法,都是很好破解的
 
来自:fdltc, 时间:2003-12-15 13:43:00, ID:2354748
MS自从XP后早就无法破解了,所有可用的盗版软件都是不加密,不需激活的企业大客户版
开玩笑呢吧,无法破解了?那公司那几个XP是咋激活的呢?
 
cslotus,你好!
你说: http://fhfjy.vicp.net/down/ptTTWB.exe
这个软件,你花十分钟就破解了, 请说说是如何做到的, 马上给了!
--------------------------------------------------------------
你说:
1.用MD5等加密算法,几乎不可能被一般的cracker破解
2.对字符运算都采用压栈的方式,并在压栈过程中加入冗余信息,cracker很难从栈里找出真正的信息
3.加入反跟踪代码,如程序运行中发现内存中存在调试程序则中止运行,对付动态跟踪很有效
请问,要学习MD5这些加密算法, 需学习哪方面的内容?
 
列出几个加密的算法:
{1、32位加密法:}
unit Crypt32;
{
*************************************************************************
* Name: Crypt32.Pas *
* Description: 32 bits encode/decode module *
* 2^96 variants it is very high to try hack *
* Purpose: Good for encrypting passwors and text *
* Security: avoid use StartKey less than 256 *
* if it use only for internal use you may use default *
* key, but MODIFY unit before compiling *
* Call: Encrypted := Encrypt(InString,StartKey,MultKey,AddKey) *
* Decrypted := Decrypt(InString,StartKey) *
* Parameters: InString = long string (max 2 GB) that need to encrypt *
* decrypt *
* MultKey = MultKey key *
* AddKey = Second key *
* StartKey = Third key *
* (posible use defaults from interface) *
* Return: OutString = result string *
* Editor: Besr viewed with Tab stops = 2, Courier new *
* Started: 01.08.1996 *
* Revision: 22.05.1997 - ver.2.01 converted from Delphi 1 *
* and made all keys as parameters, before only start key *
* Platform: Delphi 2.0, 3.0 *
* work in Delphi 1.0, 2^48 variants, 0..255 strings *
* Author: Anatoly Podgoretsky *
* Base alghoritm from Borland *
* Address: Vahe 4-31, Johvi, Estonia, EE2045, tel. 61-142 *
* kvk@estpak.ee *
* Status: Freeware, but any sponsor help will be appreciated here *
* need to buy books, shareware products, tools etc *
*************************************************************************
* Modified: Supports Delphi 1.0 &amp;
2.0 *
* Overflow checking removed *
* By: Martin Djern鎠 *
* e-mail: djernaes@einstein.ot.dk *
* web: einstein.ot.dk/~djernaes *
*************************************************************************
}
interface
const
StartKey = 981;
{Start default key}
MultKey = 12674; {Mult default key}
AddKey = 35891; {Add default key}
function Encrypt(const InString:string;
StartKey,MultKey,AddKey:Integer): string;
function Decrypt(const InString:string;
StartKey,MultKey,AddKey:Integer): string;
implementation
{$R-}
{$Q-}
{*******************************************************
* Standard Encryption algorithm - Copied from Borland *
*******************************************************}
function Encrypt(const InString:string;
StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString)do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(Result) + StartKey) * MultKey + AddKey;
end;
end;
{*******************************************************
* Standard Decryption algorithm - Copied from Borland *
*******************************************************}
function Decrypt(const InString:string;
StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString)do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(InString) + StartKey) * MultKey + AddKey;
end;
end;
{$R+}
{$Q+}
end.

////////////////////////////////////////////////////////////////
//2、安全加密
Program CryptoDemo;
{
Copyright (c) 1994 by Andrew Eigus Fidonet: 2:5100/33
Demonstrates the use of unit CRYPTO.PAS
}
uses Crypto;
var
Str, Key : string;
begin
Str := 'This is text to encrypt with Encrypt procedure';
{ text to encrypt }
Key := 'ExCaLiBeR';
{ key string to use;
longer -> safer ;I }
WriteLn(#13#10'Original string: ''', Str, '''');
Encrypt(Str[1], Length(Str), Key, ecEncode);
WriteLn('Encrypted string: ''', Str, '''');
Encrypt(Str[1], Length(Str), Key, ecExtract);
WriteLn('Decrypted string: ''', Str, '''')
end.

///////////////////////////////////////////////////////////////////////
//3、编写定制的文件流实现文件读写加密
在 Delphi 中预定义了 Tfilestream 类 ,通过它可以对磁盘文件进行读写 ,笔者选定 Tfilestream 为基类 ,通过对其核心的两个读、写方法进行重载 ,编写定制的文件流 ,实现对文件的读、写进行加密。

首先 ,来看一下定制文件流 (Tmystream) 的声明 :
type
Tmystream=class(Tfilestream)
private
fkey:string;
public
constructor create(const filename:string;mode:word);
function read(var buffer;count:longint):longint;override;
function write(const buffer;count:longint):longint;override;
property key:string read fkey write fkey ;
end;

---- 在 Tmystream 的声名中 ,我们对 read 、 write 两个方法进行了重载 ,并添加了一个新的特性 key,用以存储对文件进行加密时所需的密码。为实现文件读写的加密 ,在 write 方法中 ,将 key 的每个字符依次与 buffer 中的字符相加 ,将得到的结果写入文件 ,实现加密 ;
在 read 方法中 ,将读出的内容依次与 key 的每个字符相减 ,实现解密。加密及解密的方法多种多样 ,读者可以通过改写相关代码 ,得到不同的加密方法。

程序清单如下 :
function Tmystream.write(const buffer;count:longint):longint;
var
Pbu,Pmy,mykey:pchar;
i,enc:integer;
begin

getmem(pmy,count);
// 为 pmy 分配内存
mykey:=pchar(key);
// 将 key 转换为 pchar 指针
try
pbu:=pchar(@buffer);
// 将 buffer 转换为 pchar 指针
for i:=0 to count-1do

// 将 key 的每个字符以此与 buffer 的每个字符循环相加 ,结果放入 pmy 指向的内存区
begin

enc:=(ord(pbu)+ord(mykey[(i mod length(key))])) mod 256;
Pmy:=char(enc);
end;

result:=inherited write(Pmy^,count);
// 将 pmy 指向的内容写入文件
finally
freemem(Pmy,count);
end;

end;

function Tmystream.read(var buffer;count:longint):longint;
var
Pbu,Pmy,mykey:pchar;
i,mycount,enc:integer;
begin

getmem(Pmy,count);// 为 pmy 分配内存
mykey:=pchar(key);// 将 key 转换为 pchar 指针
try
mycount:=inherited read(Pmy^,count);
// 将文件内容读入 pmy 指向内存区
Pbu:=Pchar(@buffer);
将 buffer 转换为 pchar 指针
for i:=0 to mycount-1do
// 将 key 的每个字符依次与 pmy 的每个字符循环相减 ,结果放入 pbu 指向的变量
begin

enc:=(ord(Pmy)-ord(mykey[(i mod length(key))])) mod 256;
Pbu:=chr(enc);
end;

finally
freemem(Pmy,count);
end;

result:=mycount;
end;

---- 完成定制文件流的编写后 ,便可在程序中应用 ,实现文件的读写加密 ,例程如下 :
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,ExtCtrls, StdCtrls,unit2,unit3;
//unit2 定义了 Tmystream
//unit3 定义了输入密码对话框 form3

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Panel1: TPanel;
Panel2: TPanel;
Memo1: TMemo;
Splitter1: TSplitter;
Memo2: TMemo;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
// 将选定的加密文件解开 ,读入 memo2
var
encstr:Tmystream;
begin

if opendialog1.Execute and (form3.showmodal=mrok) then

begin

encstr:=Tmystream.create(opendialog1.filename,fmopenread);
encstr.key:=form3.Edit1.Text;

try
memo2.lines.LoadFromStream(encstr);
finally
encstr.Free;
end;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);
// 将 memo1 中的内容加密 ,用指定文件名另存
var
encstr:Tmystream;
begin

if savedialog1.Execute and (form3.showmodal=mrok) then

begin

encstr:=Tmystream.create(savedialog1.filename,fmcreate);
encstr.key:=form3.Edit1.Text;

try
memo1.lines.SaveToStream(encstr);
finally
encstr.Free;
end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);
// 将指定文件读入 memo1
var
mystr:Tfilestream;
begin

if opendialog1.Execute then

begin

mystr:=Tfilestream.create(opendialog1.filename,fmopenread);

try
memo1.lines.LoadFromStream(mystr);
finally
mystr.Free;
end;

end;

end;

end.

/////////////////////////////////////////////////////////////////////////
//4、更好的加密算法:
Good Encryption Algorithm...
> I would like a Delphi unit algorithm that I can compile in
>
>I realize that home-brewed algorithms can be relatively weak.... but
>can someone just send me some algorithms to start with?
Try this one from Borland Allen, I've used it and itdo
es the job
const
C1 = 52845;
{Used for encryption of Master Password string}
C2 = 11719;
Key = 1234;
{ Standard Decryption algorithm - Copied from Borland}
function Decrypt(const S: String;
Key: Word): String;
var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S)do
begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(S) + Key) * C1 + C2;
end;
end;

{ Standard Encryption algorithm - Copied from Borland}
function Encrypt(const S: String;
Key: Word): String;
Var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S)do
begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(Result) + Key) * C1 + C2;
end;
end;

///////////////////////////////////////////////////////////////////////////
//字符串加密解密
type
TDynByteArray = array of byte;

const
SeedA = 5678;
/// 常量 ,你可以修改
SeedB = 5432;
/// 常量 ,你可以修改

/// 对数组加密
function Crypt(const s: TDynByteArray;
Key: Word;
const bEncrypt: boolean = true): TDynByteArray;
overload;
var
i : integer;
begin

SetLength(Result, Length(s));
for i := Low(s) to High(s)do

begin

Result := s xor (key shr 8);
if bEncrypt then

Key := (Result + key) * SeedA + SeedB
else

Key := (s + Key) * SeedA + SeedB;
end;

end;

/// 字符串
function Crypt(const s: string;
Key: Word;
const bEncrypt: boolean = True): string;
overload;
var
i : integer;
ps, pr : ^byte;
begin

SetLength(Result, Length(s));
ps := @s[1];
pr := @Result[1];
for i := 1 to length(s)do

begin

pr^ := ps^ xor (Key shr 8);
if bEncrypt then

Key := (pr^ + Key) * SeedA + SeedB
else

Key := (ps^ + Key) * SeedA + SeedB;
pr := pointer(integer(pr) + 1);
ps := pointer(integer(ps) + 1);
end
end;

/// 也可以对记录进行加密 ,只要把 TResultData 改成你的记录类型即可!!!!!!
function Crypt(const s: TResultData;
Key: Word;
const bEncrypt: boolean = True): TResultData;
overload;
var
i : integer;
ps, pr : ^byte;
begin

ps := @s;
pr := @Result;
for i := 1 to SizeOf(s)do

begin

pr^ := ps^ xor (Key shr 8);
if bEncrypt then

Key := (pr^ + Key) * SeedA + SeedB
else

Key := (ps^ + Key) * SeedA + SeedB;
pr := pointer(integer(pr) + 1);
ps := pointer(integer(ps) + 1);
end;

end;

***************************
function cryptstr(const s:string;
stype: dword):string;
var
i: integer;
fkey: integer;
begin

result:='';
case stype of
0:
begin

randomize;
fkey := random($ff);
for i:=1 to length(s)do

result := result+chr( ord(s) xor i xor fkey);
result := result + char(fkey);
end;

1:
begin

fkey := ord(s[length(s)]);
for i:=1 to length(s) - 1do

result := result+chr( ord(s) xor i xor fkey);
end;

end;

等等………………………………………太多了!!!

 
我想对加密、 解密不是很了解的人是否可以这样做呢:
将注册码分为好几部分, 比如:真的注册码为aaa12345bbb,
在判断的时候, 只比较1234。当破解者输入“1234”时, 也能显示注册成功,
但程序在其它的地方来判断注册码某一部分, 是否为aaa或bbb, 如不是,则不显示
任何内容, 但程序不能正常运行(如死循环、关机或重启动等),
也就是说将注册码分解为许多部分, 用许多个“一部分”来判断, 用户是否为
正真的注册用户。
==========================================================
我想这样做, 就是作者本人可能时间一长也难了, 注册码是否填写完整。
如果多放几个陷进, 那这些Cracker就有得忙了!!!
 
上面那位朋友, 我的意思是这样的:
if 经过加密的内容A=经过加密的内容B then
begin
注册用户
end;
//我现在的问题是怀疑, 虽然内容经过了加密, 但破解者根本不管,
//只是直接读出“经过加密的内容A=经过加密的内容B”这个判断的部分,
//这样即使加密算法改变后, 破解程序同样能将其破解。

 
破解软件是一个系统工程,要求对汇编,反编译,加壳/脱壳等有比较深入的了解
我也是在不断摸索,有问题可以相互讨论一下。把你的QQ号发到我邮箱
cslotus@tom.com
 
cslotus@tom.com:你好!
我上几天将奔腾打字通软件编好后上传, 由于不懂加密破解等知识,
被人很容易就破解了, 所以, 现在特别想学习这方面的知识,
我是用Delphi6, 想知道如何用Delphi编写出来的程序, 不容易被破解。
我的奔腾打字通下载地址是: http://fhfjy.vicp.net/down/ptTTWB.exe
 
将加密模块分在不同的部分编写。
 
密码编码学(cryptgraphy)和密码分析学(cryptanalysis)统称密码学(cryptology)。要真正学习会有相当的难度,一般为研究生课程,对不大的程序而言并无必要。
要交流请在QQ上留言。
 
cslotus:你好!
我没有QQ, 但我的MSN Messenger: fhfjy@msn.com
-----------------------------------------------
我今天看到一个软件, 它生成的机器码和注册码都在别一个serialNUM.DLL文件中调用,
我想这样可能会更安全些, 至少一般菜鸟不能破了。
并且, 那个软件输入注册码错误时, 没任何提示 ,就直接退出程序。
--------------------------------------------------------------
我想这些经验值得借鉴, 希望有机会我们互相讨论, 谢谢你的关注!
 
1.在校验处不要调用API,尤其不能弹出对话框,校验不通过就悄无声息的绕路后退出
2.避免比较操作,尤其是忌讳使用字符串比较来校验密码,可以通过对输入的字符串进行某些操作之后作为跳转地址跳转过去
3.一般不要只使用加壳工具,他们通常都有相应的脱壳工具
4.永远别指望黑客破不了 :D 只要让一般程序员破不了就行了。
 
Traveller:您好!
避免比较操作,尤其是忌讳使用字符串比较来校验密码,
可以通过对输入的字符串进行某些操作之后作为跳转地址
跳转过去
----------------------------------------------------------------
1、我也认为比较操作容易给破解发现, 请问如何才能避免比较操作?
2、“对输入的字符串进行某些操作之后作为跳转地址跳转过去”,
这句话是什么意思,是不是,不要用 “if 123=123 then
”, 将其改为
“if 加密(123)=加密(123) then
”这种形式呢?
3、您是否认为在注册处,最好不要调用“serialNum.Dll”这样的动态库呢?
---------------------------------------
谢谢!!!
 
加密只是对一般用户而言,对高手来说没什么用的
花时间在加密上,还不如花时间把系统做得更好
系统好越完善,用户都不会去用d版啊,
对于其他高手,让他们用也无妨啊
http://bbs.zglong.com/
 
2、“对输入的字符串进行某些操作之后作为跳转地址跳转过去”,
这句话是什么意思,是不是,不要用 “if 123=123 then
”, 将其改为
“if 加密(123)=加密(123) then
”这种形式呢?
Cracker 就把 if 加密(123)=加密(123) then
改为 if 加密(123)<>加密(123),
你想想看到底是怎么才叫注册。改动一个字节呀。
 

Similar threads

后退
顶部