自杀性软件(100分)

  • 主题发起人 主题发起人 lmax
  • 开始时间 开始时间
L

lmax

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个软件给客户用,希望过一定时间后,就会自动破坏自己的结构,然后无法运行,请问怎么实现。
说明:只是单独的exe文件,不要借助任何其他的内容
 
我也想知道这怎么搞,我以前也问过.没有人告诉我.
 
Delphi盒子上有EXE自我修改的例子,SelfModify,你查这个。
 
这个似乎不可能,要么借助注册表项或者配置文件,要么借助Dll等动态接入的方式...
 
re:Delphi盒子上有EXE自我修改的例子,SelfModify,你查这个。
我觉的这样是不可以的,我的意思希望软件自己杀死自己,你说的是修改自己,但还可以运行
 
给你转一篇文章,挺有启发的
以下为转的:


程序自杀

电脑用得久了,安装的软件乱七八糟,怎么办?一般我们会打开控制面板里的添加删除程序选项,选择相应的卸载选项就可以了。但如果我们能在自己的程序中增加一个删除功能来实现“自杀”,则会令软件增色不少。
有点电脑常识的人都知道,在Windows下如果程序正在运行,那么是无法将其删除的,当然,也不是绝对不可以。CIH大家应该知道吧,它的核心有两个,一个就是取得Ring0级权限,然后就可以随便干想干的事(比如说修改正在运行的文件),而我们一般的程序是运行在Ring3级上的。顺便提一句——NT下没有Ring的概念,所以CIH对其无效。用Delphi内镶汇编也可以取得Ring0级权限,但如果我们的程序运行在NT或者Win2000下就没有效果了。在说句题外话,现在的编译器都很不错了,大多数程序员都编不出比编译器编译出的更理想的代码,象Delphi,如果将它的某些单元代码改用内镶汇编,在某些方面如字符串处理方面会提高50倍左右的效率,但NT不支持某些汇编代码,如果程序在NT下工作就会出错,怎么办?稳定第一!所以我们不用这个方法,而且,用这个方法有点杀鸡用牛刀的味道。
用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del %0,然后运行它,怎么样?a.bat把自己删除掉了!好,我们就用它来进行程序的“自杀”!
找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为:
:pp
del abc.exe
if exist abc.exe goto pp
del %0
先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button到窗体上,点击Button,写下如下代码:
procedure TForm1.Button1Click(Sender:TObject);
var Selfname,BatFilename,s1,s2:string;
BatchFile:TextFile;
begin
Selfname:=Extractfilename(application.exename); //取EXE文件自己的名称
BatFilename:=ExtractFilePath(Application.ExeName)+a.bat; //批处理文件名称
S1:=@del+Selfname;
S2:=if exist+Selfname+goto pp;
assignfile(BatchFile,BatFilename);
rewrite(BatchFile);
writeln(BatchFile,:pp);
writeln(BatchFile,S1);
writeln(BatchFile,S2);
writeln(BatchFile,@del %0);
closefile(BatchFile);
winexec(pchar(BatFilename),sw_hide); //隐藏窗口运行a.bat
application.Terminate; //退出程序
end;
那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者WindowsSystem等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。这可能是因为Windows对系统目录有保护功能,那怎么办?别急,我们请出一个函数CreateProcess,感兴趣的读者可自行翻阅Delphi的帮助文件来查看它的原型。这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。(未完待续)
(湖北 陈经韬)
(接上期)
用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了,代码如下:
procedure TForm1.My_DeleteMe;
var
BatchFile:TextFile;
BatchFileName:string;
ProcessInfo:TProcessInformation;
StartUpInfo:TStartupInfo;
begin
BatchFileName:=ExtractFilePath(ParamStr(0))+$$a.bat;
AssignFile(BatchFile,BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile,:try);
Writeln(BatchFile,del"+ParamStr(0)+");
Writeln(BatchFile,if exist"+ParamStr(0)+"+goto try);
Writeln(BatchFile,del"+BatchFileName+");
Writeln(BatchFile,cls);
CloseFile(BatchFile);
FillChar(StartUpInfo,SizeOf(StartUpInfo),$00);
StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow:=SW_HIDE;
if CreateProcess(nil,PChar(BatchFileName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,StartUpInfo,ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
end.
补充:1.上面的批处理的del %0等同于del a.bat,用del a.bat则批处理文件必须为a.bat,用del %0则可以随意;
2.程序在Pwin98+Delphi5、Win2000+Delphi5下运行通过。
本文的标题为《安装与卸载之卸载篇——程序自杀》,下次将介绍如何用Delphi制作自己的安装程序。记得有一位著名的黑客说过:我从来不去找什么工具软件,需要的话就自己写一个。如果我们也持这种态度,则编程水平一定会越来越高。(湖北 陈经韬)
 
这下面也是转的,我没试过,不知道可不可行,跟上面的程序是一样的原理

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure My_DeleteMe; //自定义程序自杀过程
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
My_DeleteMe;
end;
procedure TForm1.My_DeleteMe; //程序自杀
//-----------------------------------------------------------
function GetShortName(sLongName: string): string; //转换长文件名
var
sShortName: string;
nShortNameLen: integer;
begin
SetLength(sShortName, MAX_PATH);
nShortNameLen := GetShortPathName(PChar(sLongName),
PChar(sShortName), MAX_PATH - 1);
if (0 = nShortNameLen) then
begin
// handle errors...
end;
SetLength(sShortName, nShortNameLen);
Result := sShortName;
end;
//-------------------------------------------------
var
BatchFile: TextFile;
BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a$$.bat';
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':try');
Writeln(BatchFile, 'del "' + GetShortName(ParamStr(0)) + '"');
Writeln(BatchFile, 'if exist "' + GetShortName(ParamStr(0)) + '"' + ' goto try');
Writeln(BatchFile, 'del %0');
Writeln(BatchFile, 'cls');
Writeln(BatchFile, 'exit');
CloseFile(BatchFile);
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_Hide;
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
end.
 
就是删除自己的程序
 
bytelife :
你给提供的资料看过了,虽然是借助外力实现自杀,但毕竟是有了一个解决方法。
我还有个想法:上面的方法是直接杀掉自己,连尸体都没有了,相当于做了火化。但我希望的是,程序自己拔出刀子捅了自己,要保留尸体,让用户能够看得到,这样可以栽赃到用户的身上,说是用户的不当把这个程序杀死了。那么这个带着刀子的程序如何实现?
 
应该是删除已经注册的软件,
我想删除部分功能就可以了,要是全部,别人可以先留一个副本,删除一个,在复制一个的,在删除时要随即删,次次不一样,中间有嵌套最好.
还有就是: 你可以将你的软件设计的,越来越漫,直到涨死自己,也就是没有自动清理功能,这种办法最好在管理系统中用(应为: 有数据库和表)
 
if DateTime = 2006-9-18 then
...
 
我觉得最好不要用工具或者函数,这样破戒最容易的,要在酸法上动脑子,别人就酸有原代码,也只能读,死读,累死他!更不要说他读反编译代码了.这样就是一人埋金子,10人找补到.
 
to:xibaixin
和我的想法一样,不要使用注册表,也不要借助什么外部控制或方法,只是在程序内部写一段代码,即住自己运行的次数,然后干掉自己
 
上面忘了说明,要保留尸体呀
 
我觉得用dll比较好一些,先写一个exe文件,调用第一个dll,然后第一个dll再调用第二个dll,同时第二个dll注册进某个正在运行的程序,比如ie,当第二个dll取得宿主后,发出指令关闭exe程序。然后开始修改你的exe文件,首先更改调用第二个dll的证据。然后做你想做的事情。如果为了不让人发现,你可以将第二个进程名称改为svchost,只是你的路径搞成一个不同的才好。当然,这只是一个思路,肯定能实现。
 
你这样效果不好,用户一般都有备份,程序坏了,再复制一遍就好了。如果用户把你的程序刻在光盘上运行呢?
正确的做法是在程序里判断,到时间不再运行。要迷惑用户,可以弹出类似系统非法操作之类的提示框。但最好不要这样,应该直接提示用户软件已到期,否则会影响你的信誉。
 
TO kaida
如果说用户手里有备份程序,你做什么都是白做,就算他自己不会分析,我想总能找到会分析的人。那时可不好办。
 
程序加密只要使解密的花费(金钱或精力)高于购买软件的费用就可以了。无论他自己解密还是请别人解密都是要花精力的。如果他花很多精力去解密,不如自己编写软件。
 
to lmax:
既然可以修改,当然可以删除或改成不能使用了。同意kaida意见,这样做了往往没有什么效果,用户重新复制一下软件就好了。
 
后退
顶部