浅谈软件安全设计(一)
{**************************************************************
浅谈软件安全设计(一)
code by 黑夜彩虹 & vxin with almost pure delphi
网站:http://soft.eastrise.net
2007-03-07
--- 转载时请保留作者信息。
**************************************************************}
此CM的设计模式:
1、插入一些花指令
2、写了一些代码迷惑Cracker
3、有简单的Anti_DEDE 和检测调试器
话不多说,请看以下代码:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,strutils;
Const
C1= 17856;
C2= 23589;
type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure Anti_DeDe();//检测DEDE反编译器
var
DeDeHandle:THandle;
i:integer;
begin
DeDeHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65));
if DeDeHandle0 then
begin
For i:=1 to 4500 do
SendMessage(DeDeHandle,WM_CLOSE,0,0);
end;
end;
Function ABC42():Boolean; //检测调试器;
var
YInt,NInt:Integer;
begin
asm
mov eax,fs:[30h]
movzx eax,byte ptr[eax+2h]
or al,al
jz @No
jnz @Yes
@No:
mov NInt,1
@Yes:
Mov YInt,1
end;
if YInt=1 then
Result:=True;
if NInt=1 then
Result:=False;
end;
function EncryptModule(SourceStr:String;Key:Word;N:Integer):String;
var //加密函数
I:Integer;
begin
SetLength(Result,Length(SourceStr));//利用SetLength函数指定密文长度
//对每一个索引元素进行变换
for I:=1 to Length(SourceStr) do
begin
Result[I]:=Char(byte(SourceStr[I]) xor (Key Shr N));
Key:= (byte(Result[I]) + Key)*C1+C2;
end;
end;
//==========以下是549的函数,据说没有暴破点,顺便试一试
//========函数作用:动态改变程序运行罗辑
function GetEIP: Integer;//自动生成address的方法
asm
mov eax, [esp];
sub eax, 5; //call GetEIP占用5字节
end;
function PatchOneItem(PatchItem: String): Boolean;
var
PatchAddress: Integer;
PatchLength: DWord;
PatchData: Pointer;
PatchDataStr: String;
i: Integer;
PatchByte: Byte;
PID, PHandle: THandle;
WriteCount: DWord;
begin
Result := False;
if Length(PatchItem) < 11 then Exit;
PatchAddress := StrToInt(\'0x\' + LeftStr(PatchItem, 8));
for i := 1 to Length(PatchItem) do begin
if PatchItem[i] \' \' then
PatchDataStr := PatchDataStr + PatchItem[i];
end;
PatchLength := (Length(PatchDataStr) - 9) div 2;
GetMem(PatchData, PatchLength);
try
for i := 0 to PatchLength - 1 do begin
PatchByte := StrToInt(\'0x\'+PatchDataStr[10 + i * 2] + PatchDataStr[10 + i * 2 + 1]);
Byte(Pointer(Integer(PatchData) + i)^) := PatchByte;
end;
GetWindowThreadProcessId(Application.Handle, PID);
PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
WriteProcessMemory(PHandle, Pointer(PatchAddress), PatchData, PatchLength, WriteCount);
CloseHandle(PHandle);
finally
FreeMem(PatchData, PatchLength);
end;
Result := PatchLength = WriteCount;
end;
procedure Patch(PatchFile: String);
var
PatchItems: TStrings;
PatchIndex: Integer;
begin
if not FileExists(PatchFile) then Exit;
PatchItems := TStringList.Create;
try
PatchItems.LoadFromFile(PatchFile);
for PatchIndex := 0 to PatchItems.Count - 1 do begin
PatchOneItem(PatchItems[PatchIndex]);
end;
finally
PatchItems.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Anti_DeDe; //检测DEDE,检测到关闭它。
if ABC42 then ExitProcess(0); //检测调试器,终止。
end;
procedure TForm1.Button1Click(Sender: TObject); //注册按纽,开始检测
begin
//========在这里插入一些花指令
asm
jz @Start
jnz @Start
db 0E8h, 24h, 0, 0 ;
db 0, 8Bh, 44h, 24h
db 4, 8Bh, 0, 3Dh
db 4, 0, 0, 80h
db 75h, 8, 8Bh, 64h
db 24h, 8, 0EBh, 4
db 58h, 0EBh, 0Ch, 0E9h
db 64h, 8Fh, 5, 0
db 0, 0, 0, 74h
db 0F3h, 75h, 0F1h, 0EBh
db 24h, 64h, 0FFh, 35h
db 0, 0, 0, 0
db 0EBh, 12h, 0FFh, 9Ch
db 74h, 3, 75h, 1
db 0E9h, 81h, 0Ch, 24h
db 0, 1, 0, 0
db 9Dh, 90h, 0EBh, 0F4h
db 64h, 89h, 25h, 0
db 0, 0, 0, 0EBh
db 0E6h
db 0EBh, 1, 0Fh, 31h ;
db 0F0h, 0EBh, 0Ch, 33h
db 0C8h, 0EBh, 3, 0EBh
db 9, 0Fh, 59h, 74h
db 5, 75h, 0F8h, 51h
db 0EBh, 0F1h
db 0B9h, 4, 0, 0 ;
@Start:
end;
if length(edit2.Text)>3 then //比较大于3位
begin
//============再写一些骗Cracker
if edit2.Text=EncryptModule(Edit1.Text,12345,10) then
begin
showmessage(\'请重启本软件。\');
//=======还可以再写一些记号,这里我就不写了
end;
PatchOneItem(edit2.Text); //真正的比较
showmessage(\'ok\'); //弹出OK对话框
end;
end;
end.
//====附件为CM,会破解的兄弟可以试试其强度....
软件保护--PECrcPack
如果您还在销售未经保护的软件,您可能会因软件盗版而失去应有的市场与利润。
而我们的目标就是提供给您稳定可靠的软件保护技术,保护您的合法利益免受盗版的侵蚀。
如果你是刚刚开始接触软件保护产品,或者您欲了解PECrcPack有何特殊优势,欢迎洽询!
产品特点:
PECrcPack是为软件共享作者提供的一种智能型的软件保护工具,PECrcPack顾名思义,既可压缩PE文件,
也可进行CRC校验。PECrcPack基于软件保护技术,其目的是通过对软件与数据的保护防止知识产权被非法使用。
目前市场上该类产品太多而且太杂,导致用户不知道选择哪种可靠的产品。PECrcPack新技术的推广与应用上,
始终保持着业界领先的优势。因为我们相信:为用户带来价值,就是我们的价值。
PECrcPack能给共享作者带来什么?
软件共享作者可PECrcPack对软件进行数据保护,从而保护您的软件不被盗版,保证您的市场免受盗版的侵蚀。
共享作者可以利用PECrcPack压缩,减小软件自身的大小。
使用PECrcPack,可以对软件对行自身校对验,保证您软件不被恶意修改。
使用PECrcPack,软件共享作者只需付一次费用,即可多次使用在您的软件当中。
使用PECrcPack校验,不会被杀毒软件误当为木马杀之。
使用方便、安全。价格实惠。
试用版本只使用压缩功能。其它功能必须注册版才可使用。
联系:joe-lu@163.com
网址:http://soft.eastrise.net/
我的密码箱
我的密码箱是一个简单易用并且安全可靠的密码保存的工具软件。它可以帮您保存各种帐号信息和密
码,防止被他人窃取、查看,是您可以信赖的安全可靠的保险箱。使用它,您可以:
只须记住一个密码,而忘掉其他所有的 - 我的密码箱能保护并且管理您的所有帐号和密码信息。您只需要记住登录密码保险箱的密码,登录后,您可以方便地获得您的个人隐私信息。
获得安全性 - 使用我的密码箱前,系统自动创建一个密码文件(请设置登录密码),而您今后保存在密码保险箱中的所有信息,都只有您才能访问到,换句话说,您的所有其他帐号和密码等信息都被安全地保护在您创建的这个帐号之下。其他人都无法获得或者看到您的个人隐私信息。我的密码箱使用高强度的加密算法来保存您的个人隐私信息,要被破解几乎是不可能的。另外,我的密码箱提供:由系统自动生成组合密码以及一个软键盘来帮助您输入密码等敏感信息,有了软键盘,可以防止一些木马以及“键盘记录器”等恶意程序记录下您的键盘操作来获得您的密码。
获得可靠性 - 我的密码箱提供了各种手段来保护您的数据不被破坏。它内置了“备份/恢复”等功能来保护您的数据,而“自动备份”功能更会在您每次关闭软件时自动做一次备份操作,以防各种意外的发生。
简单易用 - 我的密码箱是一个非常容易使用的工具。所有的操作都很简单和人性化,您可以用任何您喜欢的方式来查看信息,您可以自由选择按照某一列信息的顺序来查看。
简洁美观的界面 - 我的密码箱提供了一个简洁并且美观的用户界面,您在使用时,任何信息都可以一目了然。