📄 udialogpass.~pas
字号:
unit UDialogPass;
interface
uses
Windows, StdCtrls, Buttons, Controls, Classes, Forms, Sysutils ,
UnitLockConst;
type
TFormPassDialog = class(TForm)
Label1: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
TempFileName: string; {临时文件}
iTempFileName: Integer; {临时文件的句柄}
TryTimes: Byte; {尝试密码次数}
procedure LockFile;
function StringEncrypt(S: string): string;
{ Private declarations }
public
{ Public declarations }
end;
var
FormPassDialog: TFormPassDialog;
implementation
{$R *.DFM}
{运行文件,并防止拷贝该可执行文件}
function WinExecAndWait32(CommandLine: string; Visibility: Integer): Cardinal;
var
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
{应用程序的工作目录}
WorkDir := ExtractFileDir(Application.ExeName);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
{设置进程显示标志}
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
{创建进程,执行该文件}
if not CreateProcess(nil,
PChar(CommandLine), {指向命令行字符串}
nil, {指向进程安全属性}
nil, {指向线程安全属性}
True, {句柄继承标志}
CREATE_NEW_CONSOLE or {创建标志}
NORMAL_PRIORITY_CLASS,
nil, {指向环境块}
PChar(WorkDir), {指向当前目录}
StartupInfo, {指向结构STARTUPINFO }
ProcessInfo) {指向结构PROCESS_INFO }
then Result := INFINITE {-1} else
begin
FormPassDialog.Hide;{隐藏输入密码的窗口}
{防止拷贝该临时文件}
FormPassDialog.iTempFileName := FileOpen(FormPassDialog.TempFileName, fmShareExclusive);
{设置应用程序的风格}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
{提交系统控制权}
Application.ProcessMessages;
{等待刚才创建的进程运行结束}
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
{获取进程的退出代码}
GetExitCodeProcess(ProcessInfo.hProcess, Result);
{关闭进程}
CloseHandle(ProcessInfo.hProcess);
{关闭进程}
CloseHandle(ProcessInfo.hThread);
{退出本应用程序}
FormPassDialog.Close;
end;
end;
{自定义的加密运算,对密码进行简单的加密}
function TFormPassDialog.StringEncrypt(S: string): string;
var
i: Byte;
begin
for i := 1 to Length(S) do
S[i] := Char(i or $75 xor ord(S[i]));
Result := S;
end;
{还原加壳前的程序,并执行它}
procedure TFormPassDialog.LockFile;
var
I,iSourceFile, iTargetFile: Integer;
NumRead, NumWritten: Integer;
MyBuf: array[0..MaxBufferSize - 1] of Char;
LockedFile: TLockedFile;
s: string;
begin
{打开当前的EXE文件}
iSourceFile := FileOpen(Application.ExeName, fmOpenRead or fmShareDenyNone);
try
{定位到密码等信息}
FileSeek(iSourceFile, -SizeOf(LockedFile), soFromEnd);
{读取密码等信息}
FileRead(iSourceFile, LockedFile, SizeOf(LockedFile));
{如果是指定的标志}
if LockedFile.Flag = CFlag then
begin
{检测密码是否正确}
if LockedFile.PassWord = StringEncrypt(Edit1.Text) then
begin
{定位到被加壳程序的开始}
FileSeek(iSourceFile, LockedFile.AdditionalCodeLen,
soFromBeginning);
{临时文件是在原文件名之前加上"-"}
TempFileName := '_' + LockedFile.Name;
{建立临时文件}
iTargetFile := FileCreate(TempFileName);
try
repeat {把当前EXE文件内嵌的被加壳程序拷贝到临时文件中}
NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
until (NumRead = 0) or (NumWritten <> NumRead);
finally
{最后SizeOf(LockedFile)字节是密码等信息,不需要读取到临时文件中}
FileSeek(iTargetFile, -SizeOf(LockedFile), soFromEnd);
SetEndOfFile(iTargetFile);
FileClose(iTargetFile);
end;
{此时,临时文件实际上就是被加壳的原程序}
{设置文件为隐藏}
FileSetAttr(TempFileName, faHidden);
{当前EXE文件的参数作为临时文件的执行参数}
s := TempFileName;
for i:=1 to ParamCount do
s:=s+' '+Paramstr(i);
{执行临时文件,并等待其结束}
WinExecAndWait32(s, SW_SHOWNORMAL);
end else
begin
{检查尝试密码次数}
if TryTimes >= 3 then
begin
FileClose(iSourceFile);
Close;
end else
begin
inc(TryTimes);
Label1.Caption := Format('密码错误,还可以重试%d次', [4 - TryTimes]);
Edit1.Text := '';
end;
end;
end
else Label1.Caption := '没有发现加密记录';
finally
FileClose(iSourceFile);
end;
end;
procedure TFormPassDialog.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TFormPassDialog.Button1Click(Sender: TObject);
begin
{判断密码是否正确,并脱壳后执行}
LockFile;
end;
procedure TFormPassDialog.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{关闭文件句柄}
if iTempFileName > 0 then FileClose(iTempFileName);
{删除临时文件}
if FileExists(TempFileName) then DeleteFile(TempFileName);
end;
procedure TFormPassDialog.FormCreate(Sender: TObject);
begin
TryTimes := 1;
TempFileName := '_' + ExtractFileName(ParamStr(0));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -