 |
Delphi инжект скилла по любому таргету. - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
20.10.2014, 14:24
|
#1
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Delphi инжект скилла по любому таргету.
Сообственно, как сделать инжект скилла(либо отправка пакета скилла) в делфи по любому таргету, ведь как известно пакет "привязывается к таргету". Никак не могу придумать как это реализовать, чтобы не менять код после каждой смены таргета. В долгу не останусь.
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 15:27
|
#2
|
|
|
|
|
|
Пехотинец
|
 Регистрация: 02.08.2009
 Сообщений: 57
 Популярность: 417
 Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
|
Re: Delphi инжект скилла по любому таргету.
Эмм, оО
|
|
|
|
20.10.2014, 16:09
|
#3
|
|
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
Сообственно, как сделать инжект скилла(либо отправка пакета скилла) в делфи по любому таргету, ведь как известно пакет "привязывается к таргету". Никак не могу придумать как это реализовать, чтобы не менять код после каждой смены таргета. В долгу не останусь. |
|
 |
|
 |
|
Ты бы сначала форум полистал.
Я выкладывал обновленный инжект на скил. (кастуеется как будто жмем на панели, инжектится такое инжектором)
Delphi:
Код:
CallAddress:=Pointer($0047CBF0);
P1:=aPParams^.Param1;//DWord скил
Po1:=Pointer(P1);//pointer
asm
pushad
MOV ECX,DWORD PTR DS:[$0C9DFAC]
MOV EDX,DWORD PTR DS:[ECX+$1C]
MOV ESI,DWORD PTR DS:[EDX+$30]
push -1 // -1
push 0
push 0
mov ecx,Po1 // указатель на скил
push ecx
mov ecx,esi
CALL CallAddress
popad
end;
|
|
|
|
20.10.2014, 16:20
|
#4
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Указатель на скилл? Там что-то нужно написать? Или эту команду нужно как-то вызвать? Сначала пишу инжект памяти, потом этот инжект, да? А как именно отправить скилл? Что на кнопку поставить?
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 16:47
|
#5
|
|
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
P1 - id скила.
Держи сорц старой библиотеки. Написана она давно, функции обновил(работать должна), так что код там не идеален. Думаю разберешся при желании, ничего сложного в инжектах нет. Надеюсь лайкнеш хоть).
Последний раз редактировалось bestbeer; 20.10.2014 в 16:48.
Причина: 1
|
|
|
|
20.10.2014, 18:28
|
#6
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 19:09
|
#7
|
|
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Открываеш процесс пв, в событии клика кнопки вызываеш процедуру Skill, передаеш параметры(открытый процесс, айди скила).
|
|
|
|
|
Пользователь сказал cпасибо:
|
|
20.10.2014, 21:39
|
#8
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
Открываеш процесс пв, в событии клика кнопки вызываеш процедуру Skill, передаеш параметры(открытый процесс, айди скила). |
|
 |
|
 |
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,Param2,Param3: DWord;
Param4: array [1..100] of widechar;
end;
type
P3DPoint = ^T3DPoint;
T3DPoint = packed record
Px, Py, Pz: DWORD;
end;
const
BaseAdress = $BBC26C;
var
Form1: TForm1; ProcessId: Cardinal;
implementation
{$R *.dfm}
procedure PackedCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
Len:DWord;
begin
CallAddress:=Pointer($6B4220);
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [BaseAdress]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure InjectFunc(ProcessID: Cardinal; aParams: Pointer; aParamsSize: DWORD);stdcall;export;
var
hThread: THandle;
qzq : cardinal;
lpNumberOfBytes: Cardinal;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, @PackedCall, 256, qzq);
ParamAddr := VirtualAllocEx(ProcessID, nil, sizeof(TParams), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, qzq);
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end;
end;
procedure InjectFunc1(hProcess: Cardinal; Func, aParams: Pointer; aParamsSize: DWORD);stdcall;export;
var
ThreadAddr, ParamAddr: Pointer;
lpNumberOfBytes: DWORD;
hThread: THandle;
begin
if hProcess<>0 then
begin
ThreadAddr:=VirtualAllocEx(hProcess,nil,256,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,ThreadAddr,Func,256,lpNumberOfBytes);
ParamAddr:=VirtualAllocEx(hProcess,nil,aParamsSize,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,ParamAddr,aParams,aParamsSize,lpNumberOfBytes);
hThread:=CreateRemoteThread(hProcess,nil,0,ThreadAddr,ParamAddr,0,lpNumberOfBytes);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(hProcess,ThreadAddr,0,MEM_RELEASE);
end
end;
procedure StrToByte(bytecode:string; var aParams:TParams);
var
i:integer;
begin
i:=(length(bytecode) div 2)-1;
aParams.Param1:=i+1;
for i:=0 to i do
aParams.Packet[i]:=strtoint('$'+bytecode[i*2+1]+bytecode[i*2+2]);
end;
Procedure Packet(pid:Cardinal;tPacket: string);stdcall;export;
var
aParams: TParams;
begin
StrToByte(tPacket,aParams);
InjectFunc(PID,@aParams,sizeof(aParams))
end;
Function GetByte(Aint: Integer):string;
Var
Bytes: array of Byte;
begin
Result:='';
SetLength(Bytes, SizeOf(AInt));
CopyMemory(Bytes, @Aint, SizeOf(AInt));
Result:=IntToHex(bytes[0],2)+IntToHex(bytes[1],2)+IntToHex(bytes[2],2)+IntToHex(bytes[3],2);
SetLength(Bytes,0);
end;
Procedure AddPacket(ProcID:Cardinal;ttPacket:string);stdcall;export;
Begin
Packet(ProcID,ttPacket);
End;
procedure SkillCall(aPParams:PParams);stdcall;export;
var CallAddress:pointer;
Po1:pointer;
P1:DWord;
begin
CallAddress:=Pointer($0047CBF0);
P1:=aPParams^.Param1;//DWord
Po1:=Pointer(P1);//pointer
asm
pushad
MOV ECX,DWORD PTR DS:[$0C9DFAC]
MOV EDX,DWORD PTR DS:[ECX+$1C]
MOV ESI,DWORD PTR DS:[EDX+$30]
push -1 // -1
push 0
push 0
mov ecx,Po1 // ????????? ?? ????
push ecx
mov ecx,esi
CALL CallAddress
popad
end;
end;
procedure Skill(ProcessID:Cardinal;SkillID:Cardinal);stdcall;export;
var
aParams: TParams;
begin
aParams.Param1:=SkillID;
InjectFunc1(ProcessID,@SkillCall,@aParams,SizeOf(aParams));
end;
Exports Skill;
Exports AddPacket;
procedure TForm1.Button1Click(Sender: TObject);
var
KlientWindow:HWND;
ProcessId:Integer;
hProcess:Integer;
begin
KlientWindow := FindWindow(nil, PChar(Edit1.Text));
GetWindowThreadProcessId(KlientWindow,@ProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Skill(ProcessID,555);
end;
end.
Вот так?
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 21:55
|
#9
|
|
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Последний раз редактировалось bestbeer; 20.10.2014 в 22:00.
Причина: Добавлено сообщение
|
|
|
|
20.10.2014, 22:06
|
#10
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 22:11
|
#11
|
|
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
ох жесть, это называется в первый день изучения хочу написать чит на игру. по моему по PW уже разжевали все от А до Я, все что можно, а дальше уже хотя бы основы выучить Delphi
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Последний раз редактировалось Ginrey; 20.10.2014 в 22:26.
|
|
|
|
20.10.2014, 22:13
|
#12
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Нигде не видел, как это реализовать. И не первый день.
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
20.10.2014, 22:34
|
#13
|
|
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Ну ты бы написал как ругается то). Я уже давно дельфи забросил и все реализовал на своем языке. Предполагаю что несоответствие типов, попробуй найти функцию которая переводит значение к типу - cardinal .
|
|
|
|
21.10.2014, 00:41
|
#14
|
|
|
|
|
|
Разведчик
|
 Регистрация: 21.11.2010
 Сообщений: 41
 Популярность: -75
 Сказал(а) спасибо: 31
Поблагодарили 25 раз(а) в 12 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,Param2,Param3: DWord;
Param4: array [1..100] of widechar;
end;
type
P3DPoint = ^T3DPoint;
T3DPoint = packed record
Px, Py, Pz: DWORD;
end;
const
BaseAdress = $00BBC26C;
var
Form1: TForm1; hProcess:Integer;
implementation
{$R *.dfm}
procedure PackedCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
Len:DWord;
begin
CallAddress:=Pointer($006B4220);
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [BaseAdress]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure InjectFunc(ProcessID: Cardinal; aParams: Pointer; aParamsSize: DWORD);stdcall;export;
var
hThread: THandle;
qzq : cardinal;
lpNumberOfBytes: Cardinal;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, @PackedCall, 256, qzq);
ParamAddr := VirtualAllocEx(ProcessID, nil, sizeof(TParams), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, qzq);
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end;
end;
procedure InjectFunc1(hProcess: Cardinal; Func, aParams: Pointer; aParamsSize: DWORD);stdcall;export;
var
ThreadAddr, ParamAddr: Pointer;
lpNumberOfBytes: DWORD;
hThread: THandle;
begin
if hProcess<>0 then
begin
ThreadAddr:=VirtualAllocEx(hProcess,nil,256,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,ThreadAddr,Func,256,lpNumberOfBytes);
ParamAddr:=VirtualAllocEx(hProcess,nil,aParamsSize,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,ParamAddr,aParams,aParamsSize,lpNumberOfBytes);
hThread:=CreateRemoteThread(hProcess,nil,0,ThreadAddr,ParamAddr,0,lpNumberOfBytes);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(hProcess,ThreadAddr,0,MEM_RELEASE);
end
end;
procedure StrToByte(bytecode:string; var aParams:TParams);
var
i:integer;
begin
i:=(length(bytecode) div 2)-1;
aParams.Param1:=i+1;
for i:=0 to i do
aParams.Packet[i]:=strtoint('$'+bytecode[i*2+1]+bytecode[i*2+2]);
end;
Procedure Packet(pid:Cardinal;tPacket: string);stdcall;export;
var
aParams: TParams;
begin
StrToByte(tPacket,aParams);
InjectFunc(PID,@aParams,sizeof(aParams))
end;
Function GetByte(Aint: Integer):string;
Var
Bytes: array of Byte;
begin
Result:='';
SetLength(Bytes, SizeOf(AInt));
CopyMemory(Bytes, @Aint, SizeOf(AInt));
Result:=IntToHex(bytes[0],2)+IntToHex(bytes[1],2)+IntToHex(bytes[2],2)+IntToHex(bytes[3],2);
SetLength(Bytes,0);
end;
Procedure AddPacket(ProcID:Cardinal;ttPacket:string);stdcall;export;
Begin
Packet(ProcID,ttPacket);
End;
procedure SkillCall(aPParams:PParams);stdcall;export;
var CallAddress:pointer;
Po1:pointer;
P1:DWord;
begin
CallAddress:=Pointer($006B4220);
P1:=aPParams^.Param1;//DWord
Po1:=Pointer(P1);//pointer
asm
pushad
MOV ECX,DWORD PTR DS:[BaseAdress]
MOV EDX,DWORD PTR DS:[ECX+$1C]
MOV ESI,DWORD PTR DS:[EDX+$30]
push -1 // -1
push 0
push 0
mov ecx,Po1 // ????????? ?? ????
push ecx
mov ecx,esi
CALL CallAddress
popad
end;
end;
procedure Skill(ProcessID:Cardinal;SkillID:Cardinal);stdcall;export;
var
aParams: TParams;
begin
aParams.Param1:=SkillID;
InjectFunc1(ProcessID,@SkillCall,@aParams,SizeOf(aParams));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
KlientWindow:HWND;
ProcessId:Integer;
hProcess:Integer;
begin
KlientWindow := FindWindow(nil, PChar(Edit1.Text));
GetWindowThreadProcessId(KlientWindow,@ProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Skill(hProcess,1111);
end;
end.
Вот полный код, объявил глобально hProcess : Cardinal, программа запускается, пишу в edit1 название окна, привязываю к окну программу, жму кнопку 2, но скилл не отправляет? В чем может быть проблема? добавь меня в скайп, если не трудно ( в подписи скайп ).
________________
Помог? - тыкни спасибку
Perfect world Forever ***Skype:slike7 IcQ:358024861
|
|
|
|
21.10.2014, 00:42
|
#15
|
|
|
|
|
|
Сержант
|
 Регистрация: 16.02.2012
 Сообщений: 105
 Популярность: 651
 Сказал(а) спасибо: 19
Поблагодарили 39 раз(а) в 31 сообщениях
|
Re: Delphi инжект скилла по любому таргету.
Код:
const
// для руоф
base_addr = $C9DFAC;
skill_addr = $47CBF0;
GameOfs = $1C;
GamerOfs = $34;
type
PParams = ^TParams;
TParams = packed record
Param1,Param2,Param3: DWord;
end;
procedure InjectFunc(ProcessID: NativeUInt; Func, aParams: Pointer; aParamsSize: NativeUInt);
var
hThread: THandle;
lpNumberOfBytes: NativeUInt;
lpThreadId: Cardinal;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID <> 0 then
begin
// ---- Выделяем место в памяти процесса, и записываем туда нашу функцию
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpThreadId);
// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);
// ---- подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end
end;
procedure SkillCall(aPParams: PParams); stdcall;
var
BaseAddr, CallAddress: Pointer;
P1: DWord;
begin
BaseAddr := Pointer(aPParams^.Param1);
CallAddress := Pointer(aPParams^.Param2);
P1 := aPParams^.Param3;
asm
pushad
mov ecx, BaseAddr
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+GameOfs]
mov ecx, dword ptr [ecx+GamerOfs]
push $FFFFFFFF
push $00
push $00
mov edx, P1
push edx
call CallAddress
popad
end;
end;
procedure Skill(skillId: DWord);
var
aParam: TParams;
begin
aParam.Param1 := base_addr;
aParam.Param2 := skill_addr;
aParam.Param3 := skillId;
InjectFunc(_hProcess, @SkillCall, @aParam, SizeOf(aParam));
end;
Вызывать Skill(ID скила);
________________
backup - акт проявления трусости
Последний раз редактировалось pw.assistant; 21.10.2014 в 00:50.
|
|
|
|
|
Пользователь сказал cпасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 01:44.
|
 |