⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udialogpass.pas

📁 有密码的加壳源码.只是简单的介绍下壳方法.牛人见笑了
💻 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 + -