-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMainForm.pas
168 lines (138 loc) · 4.58 KB
/
MainForm.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
unit MainForm;
interface
uses
Windows, SysUtils, Classes, Forms,
Dialogs, StdCtrls, Controls, ShellAPI, messages;
type
TCLUFrmMain = class(TForm)
PathEdit: TEdit;
UnpackBtn: TButton;
BrowseBtn: TButton;
OpenDialog1: TOpenDialog;
Label1: TLabel;
ExitBtn: TButton;
procedure UnpackBtnClick(Sender: TObject);
procedure BrowseBtnClick(Sender: TObject);
procedure ExitBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
end;
var
CLUFrmMain: TCLUFrmMain;
const verStr:ansistring= 'YYYNclocker';
type clickLockerFile= packed record
size:cardinal; //size of embedded file;
resv:array[0..7] of byte;
typef:array[0..3] of ansichar; //file type extension
resv2:array[0..8] of byte;
vStr:array[0..19] of ansiChar; //version string;
end;
implementation
{$R *.dfm}
Function FileExists(filePath:WideString):Boolean;
Var
dwAttrib:Cardinal;
Begin
dwAttrib := GetFileAttributes(@filePath[1]);
if (dwAttrib = $FFFFFFFF) or (dwAttrib =FILE_ATTRIBUTE_DIRECTORY) then
result:=false
else
result:=true;
End;
Function RemExt(FName:widestring):widestring;
var
len:cardinal;
Begin
len:=length(Fname)-length(ExtractFileExt(FName));
SetLength(result,len);
CopyMemory(@result[1],@FName[1],len*2);
End;
procedure TCLUFrmMain.UnpackBtnClick(Sender: TObject);
var
secFileHandle,sHandle:tHandle;
FileStr,sFileStr:WideString;
secFileSize,tmp:cardinal;
infoV:clickLockerFile;
FileBuf:Array of Byte;
begin
FileStr:=PathEdit.Text;
sFileStr:=ExtractFilePath(FileStr);
if FileExists(FileStr)=false then begin
MessageBoxW(Application.Handle,PWideChar('Invalid File Path. File Does Not Exist!'),PWideChar('ClickLocker Unpacker'),MB_OK);
Exit;
End;
secfileHandle:=CreateFileW(PWideChar(@FileStr[1]),GENERIC_READ,FILE_SHARE_READ,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
if secFileHandle=INVALID_HANDLE_VALUE then begin
MessageBoxW(Application.Handle,PWideChar('Error Opening File'),PWideChar('ClickLocker Unpacker'),MB_OK);
exit;
End;
secFileSize:=GetFileSize(secFileHandle, nil);
SetFilePointer(secFileHandle,secFileSize-45,NIL,FILE_BEGIN);
if ReadFile(secFileHandle,infoV,45,tmp,NIL)= false then begin
CloseHandle(secFileHandle);
MessageBoxW(Application.Handle,PWideChar('Error Reading File'),PWideChar('ClickLocker Unpacker'),MB_OK);
exit;
end;
if CompareMem(@infoV.vStr[0],@verStr[1],11)=false then Begin
CloseHandle(secFileHandle);
MessageBoxW(Application.Handle,PWideChar('Not A valid ClickLocker File'),PWideChar('ClickLocker Unpacker'),MB_OK);
Exit;
End;
setlength(FileBuf,infoV.size);
SetFilePointer(secFileHandle,secFileSize-45-infoV.size,nil,FILE_BEGIN);
If ReadFile(secFileHandle,FileBuf[0],infoV.size,tmp,NIL)=false then begin
CloseHandle(secFileHandle);
MessageBoxW(Application.Handle,PWideChar('Error Reading Embedded File'),PWideChar('ClickLocker Unpacker'),MB_OK);
exit;
end;
CloseHandle(secFileHandle);
sFileStr:=sFileStr+remExt(ExtractFileName(FileStr))+'_unpacked.'+WideString(infoV.typef);
sHandle:=CreateFileW(PWideChar(@sFileStr[1]),GENERIC_Write,FILE_SHARE_READ,NIL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL, 0);
if sHandle= INVALID_HANDLE_VALUE then begin
MessageBoxW(Application.Handle,PWideChar('Error Creating Unpacked File'),PWideChar('ClickLocker Unpacker'),MB_OK);
Exit;
end;
if WriteFile(sHandle,FileBuf[0],infoV.size,tmp,NIL)= false then begin
MessageBoxW(Application.Handle,PWideChar('Error Writing Unpacked File'),PWideChar('ClickLocker Unpacker'),MB_OK);
CloseHandle(sHandle);
exit;
end;
CloseHandle(sHandle);
MessageBeep(MB_OK);
MessageBoxW(Application.Handle,PWideChar('File Unpacked Successfully!'),PWideChar('ClickLocker Unpacker'),MB_OK);
end;
procedure TCLUFrmMain.BrowseBtnClick(Sender: TObject);
begin
if OpenDialog1.Execute=true then
PathEdit.Text:=OpenDialog1.FileName;
end;
procedure TCLUFrmMain.ExitBtnClick(Sender: TObject);
begin
ExitProcess(0);
end;
procedure TCLUFrmMain.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle,true);
end;
procedure TCLUFrmMain.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle,false);
end;
procedure TCLUFrmMain.WMDropFiles(var Msg: TMessage);
var
l:cardinal;
s:string;
Begin
l:=DragQueryFile(Msg.WParam,0,nil,0)+1;
SetLength(s,l);
DragQueryFile(Msg.WParam,0,Pointer(s),l);
if lowercase(TrimRight(ExtractFileExt(s)))='.exe' then
PathEdit.Text:=s;
End;
end.