BSOne.SFC/Tocsg.Module/RemoteSecu/EXE_RemoteSecuClient/DRSecuClientMain.pas

464 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit DRSecuClientMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls,
Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, RSecuClient,
Vcl.Menus, ManagerRdpSecu, Tocsg.Trace, Tocsg.Process, Tocsg.CommonData,
GlobalDefine;
const
// CAPTURE_APPS = 'Bandicamera.exe|SnippingTool.exe|RuntimeBroker.exe';
CAPTURE_APPS = 'Bandicamera.exe|SnippingTool.exe';
type
TDlgCoeAgentMain = class(TForm)
mmLog: TMemo;
MainMenu: TMainMenu;
miConnection: TMenuItem;
miConnect: TMenuItem;
miDisconnect: TMenuItem;
N1: TMenuItem;
miExit: TMenuItem;
N2: TMenuItem;
RDP1: TMenuItem;
tInit: TTimer;
pnBottom: TPanel;
lbTime: TLabel;
lbStatus: TLabel;
tStatus: TTimer;
btnScrSecu: TButton;
procedure miExitClick(Sender: TObject);
procedure miConnectionClick(Sender: TObject);
procedure miConnectClick(Sender: TObject);
procedure miDisconnectClick(Sender: TObject);
procedure tInitTimer(Sender: TObject);
procedure tStatusTimer(Sender: TObject);
procedure RDP1Click(Sender: TObject);
procedure btnScrSecuClick(Sender: TObject);
private
{ Private declarations }
bActive_: Boolean;
sDllPath_: String;
bIsWow64_: Boolean;
Client_: TRSecuClient;
MgRdp_: TManagerRdpSecu;
Trace_: TTgTrace;
TgAppList_: TSTringList;
ThdAppMon_: TThdProcessWatch;
SharedData_: TTgFileMapping<TSharedData>;
procedure Log(sLog: String); overload;
procedure Log(sFormat: String; const Args: array of const); overload;
procedure OnAppNotify(aSender: TThdProcessWatch; pEnt: PPwEnt; aKind: TProcessWatchKind);
procedure SetSharedData(aActive: Boolean);
function StartHookWatch: Boolean;
function StopHookWatch: Boolean;
public
{ Public declarations }
Constructor Create(aOwner: TComponent); override;
Destructor Destroy; override;
procedure process_WM_NOTI_CREATE_IMAGE_FILE(var msg: TMessage); Message WM_NOTI_CREATE_IMAGE_FILE; stdcall;
procedure process_WM_SYSCOMMAND(var msg: TWMSysCommand); Message WM_SYSCOMMAND;
procedure process_WM_RDPSECU_LOG(var msg: TMessage); Message WM_RDPSECU_LOG;
procedure process_WM_CRMCLIENT_NOTIFICATION(var msg: TMessage); Message WM_CRMCLIENT_NOTIFICATION;
procedure process_WM_COPYDATA(var msg: TMessage); Message WM_COPYDATA;
end;
var
DlgCoeAgentMain: TDlgCoeAgentMain;
implementation
uses
// BoxedAppSDK_Static,
Tocsg.Packet, Tocsg.PacketDefine, Tocsg.Registry, System.IniFiles, Tocsg.Safe,
Tocsg.Path, DConnectInfo, Define, Tocsg.DateTime, DSelRdpDest, DRdpLink,
Tocsg.WinInfo, Tocsg.Strings, Tocsg.Exception, superobject, DImgView,
Soap.EncdDecd;
{$R *.dfm}
Constructor TDlgCoeAgentMain.Create(aOwner: TComponent);
begin
Inherited Create(aOwner);
Trace_ := TTgTrace.Create(GetRunExePathDir, CutFileExt(ExtractFileName(GetRunExePath)) + '.log');
Client_ := TRSecuClient.Create(Handle);
MgRdp_ := TManagerRdpSecu.Create(Handle);
Caption := APP_TITLE;
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_NOTI_CREATE_IMAGE_FILE, MSGFLT_ADD);
// BoxedAppSDK_SetContext('21f2f010-06e4-465f-af8f-cde6a3752c39');
// BoxedAppSDK_Init;
bActive_ := false;
sDllPath_ := GetRunExePathDir + DLL_APIHOOK;
bIsWow64_ := IsWow64;
TgAppList_ := TStringList.Create;
TgAppList_.CaseSensitive := false;
SplitString(CAPTURE_APPS, '|', TgAppList_);
ThdAppMon_ := nil;
SharedData_ := TTgFileMapping<TSharedData>.Create(MAP_FILENAME_APIHOOK, SizeOf(TSharedData));
ZeroMemory(SharedData_.Data, SizeOf(SharedData_.Data));
Log(APP_TITLE + '<27><> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.');
tInit.Enabled := true;
end;
Destructor TDlgCoeAgentMain.Destroy;
begin
if ThdAppMon_ <> nil then
FreeAndNil(ThdAppMon_);
FreeAndNil(TgAppList_);
tStatus.Enabled := false;
Inherited;
FreeAndNil(MgRdp_);
FreeAndNil(Client_);
if SharedData_ <> nil then
FreeAndNil(SharedData_);
FreeAndNil(Trace_);
end;
procedure TDlgCoeAgentMain.Log(sLog: String);
begin
Trace_.T(sLog);
mmLog.Lines.Add(Format('[%s] %s', [DateTimeToStr(Now), sLog]));
end;
procedure TDlgCoeAgentMain.Log(sFormat: String; const Args: array of const);
var
str: String;
begin
FmtStr(str, sFormat, Args);
Log(str);
end;
procedure TDlgCoeAgentMain.OnAppNotify(aSender: TThdProcessWatch; pEnt: PPwEnt; aKind: TProcessWatchKind);
begin
case aKind of
pwkUnknown : {$IFDEF DEBUG} ASSERT(false) {$ENDIF};
pwkInit,
pwkExecute :
begin
if TgAppList_.IndexOf(pEnt.sPName) = -1 then
exit;
if InjectModule(pEnt.dwPid, sDllPath_, @bIsWow64_) then
begin
TTgTrace.T('InjectModule() .. PName="%s"', [pEnt.sPName]);
end else begin
// {$IFDEF WIN64}
// var sExe32: String := CutFileExt(GetRunExePath) + '32.exe';
// if FileExists(sExe32) then
// ExecutePath(sExe32, Format('-hook %d', [pEnt.dwPid]));
// {$ENDIF}
TTgTrace.T('Fail .. InjectModule() .. PName="%s"', [pEnt.sPName]);
end;
end;
pwkTerminated : ;
end;
end;
procedure TDlgCoeAgentMain.SetSharedData(aActive: Boolean);
var
sDir: String;
begin
bActive_ := aActive;
with SharedData_.Data^ do
begin
bActive := bActive_;
llRcvWnd := Handle;
sDir := GetRunExePathDir;
StrCopy(sTaskDir, PChar(sDir));
StrCopy(sLogPath, PChar(sDir + LOG_FILE));
end;
end;
function TDlgCoeAgentMain.StartHookWatch: Boolean;
begin
Result := false;
if ThdAppMon_ = nil then
begin
try
EjectModuleFromPath(sDllPath_);
DeleteFile(GetRunExePathDir + LOG_FILE);
ThdAppMon_ := TThdProcessWatch.Create;
ThdAppMon_.OnProcessWatchNotify := OnAppNotify;
ThdAppMon_.StartThread;
SetSharedData(true);
Result := true;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. StartHookWatch()');
end;
end;
end;
function TDlgCoeAgentMain.StopHookWatch: Boolean;
begin
Result := false;
if ThdAppMon_ <> nil then
begin
try
SetSharedData(false);
{$IFDEF WIN64}
// var sExe32: String := CutFileExt(GetRunExePath) + '32.exe';
// if FileExists(sExe32) then
// ExecutePath(sExe32, '-clearhook');
{$ENDIF}
ThdAppMon_.OnProcessWatchNotify := nil;
FreeAndNil(ThdAppMon_);
EjectModuleFromPath(sDllPath_);
Sleep(500);
EjectModuleFromPath(sDllPath_);
bActive_ := false;
Result := true;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. StopHookWatch()');
end;
end;
end;
procedure TDlgCoeAgentMain.btnScrSecuClick(Sender: TObject);
begin
if not bActive_ then
begin
if not StartHookWatch then
// if not LoadHookDLL then
begin
MessageBox(Handle, PChar('DLL<4C><4C> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.'), PChar(Caption), MB_ICONWARNING or MB_OK);
exit;
end;
MessageBox(Handle, PChar('DRM <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.'), PChar(Caption), MB_ICONINFORMATION or MB_OK);
end else begin
StopHookWatch;
// FreeHookDLL;
MessageBox(Handle, PChar('DRM <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.'), PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
if bActive_ then
begin
btnScrSecu.Caption := 'DRM <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>';
end else begin
btnScrSecu.Caption := 'DRM <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>';
end;
Application.ProcessMessages;
end;
procedure TDlgCoeAgentMain.miConnectClick(Sender: TObject);
var
dlg: TDlgConnectInfo;
begin
Guard(dlg, TDlgConnectInfo.Create(Self, Client_));
if dlg.ShowModal = mrOk then
begin
end;
end;
procedure TDlgCoeAgentMain.miConnectionClick(Sender: TObject);
begin
miConnect.Checked := Client_.Connected;
miConnect.Enabled := not miConnect.Checked;
miDisconnect.Enabled := not miConnect.Enabled;
end;
procedure TDlgCoeAgentMain.miDisconnectClick(Sender: TObject);
begin
if Client_.Connected then
begin
if MessageBox(Handle, PChar('<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?'),
PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
Client_.Disconnect;
end;
end;
procedure TDlgCoeAgentMain.process_WM_NOTI_CREATE_IMAGE_FILE(var msg: TMessage);
begin
if SharedData_.IsAvailable then
begin
Log(SharedData_.Data.sImgPath);
end;
end;
procedure TDlgCoeAgentMain.process_WM_SYSCOMMAND(var msg: TWMSysCommand);
begin
if msg.CmdType = SC_CLOSE then
begin
{$IFNDEF DEBUG}
miExit.Click;
exit;
{$ENDIF}
end;
Inherited;
end;
procedure TDlgCoeAgentMain.RDP1Click(Sender: TObject);
var
dlg: TDlgSelRdpDest;
dlgLink: TDlgRdpLink;
begin
Guard(dlg, TDlgSelRdpDest.Create(Self, Client_));
if dlg.ShowModal = mrOk then
begin
dlgLink := TDlgRdpLink.Create(Self, Client_, dlg.SelDestIp);
dlgLink.Show;
end;
end;
procedure TDlgCoeAgentMain.process_WM_RDPSECU_LOG(var msg: TMessage);
begin
Log(PChar(msg.LParam));
end;
procedure TDlgCoeAgentMain.tInitTimer(Sender: TObject);
var
ini: TIniFile;
sEmpNo: String;
begin
tInit.Enabled := false;
Guard(ini, TIniFile.Create(CutFileExt(GetRunExePath) + '.ini'));
if ini.ReadBool('TCheckBox', 'chAutoConn', false) then
begin
sEmpNo := ini.ReadString('TEdit', 'edEmpNo', '');
if sEmpNo = '' then
exit;
Client_.EmpNo := sEmpNo;
if not Client_.Connect(ini.ReadString('TEdit', 'edIp', ''),
ini.ReadInteger('TEdit', 'edPort', 0)) then
begin
ini.WriteBool('TCheckBox', 'chAutoConn', false);
end;
end;
end;
procedure TDlgCoeAgentMain.tStatusTimer(Sender: TObject);
begin
if Client_.Connected then
lbTime.Caption := ConvSecBetweenToProgTime(Client_.ConnDT, Now);
case MgRdp_.State of
rssNone :
begin
lbStatus.Caption := Format('RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%d)', [MgRdp_.RdpPort]);
lbStatus.Font.Color := clGray;
end;
rssPrevent :
begin
lbStatus.Caption := Format('RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (%d)', [MgRdp_.RdpPort]);
lbStatus.Font.Color := clBlue;
end;
rssOpenRdp :
begin
lbStatus.Caption := Format('RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%d)', [MgRdp_.RdpPort]);
lbStatus.Font.Color := clGreen;
end;
end;
Application.ProcessMessages;
end;
procedure TDlgCoeAgentMain.process_WM_CRMCLIENT_NOTIFICATION(var msg: TMessage);
var
Rcv: IRcvPacket;
Send: ISendPacket;
begin
case msg.WParam of
NOTI_RCV_TEST :
begin
Rcv := IRcvpacket(msg.LParam);
Log('Server Send : ' + Rcv.S['Msg']);
end;
NOTI_CLIENT_CONN :
begin
tStatus.Enabled := true;
Log('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.');
MgRdp_.State := rssRqPrevent;
end;
NOTI_CLIENT_DISCONN :
begin
tStatus.Enabled := false;
Log('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.');
lbTime.Caption := '<27>غ<EFBFBD><D8BA><EFBFBD>';
lbStatus.Caption := 'RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>';
lbStatus.Font.Color := clBlack;
MgRdp_.State := rssNone;
end;
REQ_RDP_OPEN :
begin
Rcv := IRcvpacket(msg.LParam);
Log('%s(%s) <20><><EFBFBD><EFBFBD> RDP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.', [Rcv.S['RqIP'], Rcv.S['ComName']]);
Send := TTgPacket.Create(Rcv);
if MgRdp_.OpenSafeRdp then
begin
Send.I['Port'] := MgRdp_.RdpPort;
end else begin
Log('RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>...');
Send.Result := 11;
Send.ResultMsg := 'RDP<44><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.';
end;
Client_.SendPacket(Send);
end;
REQ_RDP_CLOSE :
begin
MgRdp_.CloseSafeRdp;
end;
end;
Application.ProcessMessages;
end;
procedure TDlgCoeAgentMain.miExitClick(Sender: TObject);
begin
if MessageBox(Handle, PChar('<27><><EFBFBD><EFBFBD><EFBFBD>Ͻðڽ<C3B0><DABD>ϱ<EFBFBD>?'),
PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit;
Close;
end;
procedure TDlgCoeAgentMain.process_WM_COPYDATA(var msg: TMessage);
var
dwData: DWORD;
pCpData: PCopyDataStruct;
O: ISuperObject;
begin
dwData := 0;
pCpData := PCopyDataStruct(msg.LParam);
try
dwData := pCpData.dwData;
case dwData of
RSCMD_CAPUTRE_DATA :
begin
O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData));
var pBuf: TBytes := DecodeBase64(O.S['Data']);
var ms: TMemoryStream := TMemoryStream.Create;
ms.Write(pBuf[0], Length(pBuf));
var dlg: TDlgImgView := TDlgImgView.Create(Self, ms, O.S['Path'], O.I['PID'], Handle);
if dlg.LoadFromStream(ms) then
dlg.Show
else
dlg.Free;
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, Format('Fail .. process_WM_COPYDATA(), dwData=%d', [dwData]));
end;
end;
end.