Rozpoznanie lokalizacji pliku a następnie skopiowanie do katalogu systemowego

Odpowiedz Nowy wątek
2011-08-05 00:35
0

Hej jestem nowym użytkownikiem forum, i słabo znam się na Delphi nie mniej jednak inspiruje mnie tej język ze względu na łatwość i możliwości, mam problem dotyczący kopiowania plików plików do katalogu systemowego.
Chcę skopiować plik z lokalizacji w której się znajduje (przyjmuję że może być różna) do katalogu Windows bądź system32, bądź Program Files.
Do rozpoznania katalogu bieżącego i docelowego chciałem użyć funkcji opisanej po tym linkiem:

http://4programmers.net/Delphi/FAQ/Jak_odczyta%C4%87_%C5%9Bcie%C5%BCki_folder%C3%B3w_specjalnych

I tu się pojawia problem ponieważ to nie działa. Proszę o analizę i pomoc w rozwiązaniu;)

 unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShlObj, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
const
 
  CSIDL_WINDOWS=$0023;
 
  var
  Buffer: array[0..255] of Char;
  BufferSize: Cardinal;
                       sciezka : string;
                       plik : string;
function GetDirectory(const Folder: Integer): String;
var
  Buffer: array[0..255] of Char;
  BufferSize: Cardinal;
begin
  BufferSize := 255;
  case Folder of
    CSIDL_WINDOWS: GetWindowsDirectory(Buffer, BufferSize);
 
  end;
  Result := String(Buffer);
end;
begin
plik :='lol.exe' ;
sciezka := Buffer+ '' +plik;
CopyFile('D:\lol.exe'  ,  PChar(sciezka)  , False);
 
end;
 
end. 
edytowany 2x, ostatnio: phx_pro, 2011-08-05 00:42

Pozostało 580 znaków

2011-08-05 02:18
2

Ja rozumiem początki, ale...

  1. Kod niesformatowany po ludzku oraz wklejony bardzo niedbale, aż się czytac nie chce. Nie umiesz sam formatować to używaj zmodyfikowanego GExperts z formaterem kodu albo programu z: http://olesio/delfor
  2. Funkcja GetDirectory jest idiotycznie napisana, bo zwracasz nią tylko ścieżkę w przypadku kiedy ktoś poda stałą dla katalogu Windowsa, a co będzie jeżeli ktoś będzie chciał pobrać na przykład %AppData%? Nie dostanie nic. Bez sensu. Poczytaj uważnie jak autor sugerował zrobić funkcję w tym artykule http://4programmers.net/Delphi/FAQ/Jak_odczytać_ścieżki_folderów_specjalnych - podal gotowca, z którego nie umiesz nawet wkleić tylko coś kombinujesz aż nadto i nie wiem po co.
  3. Po co sprawdzać co zwrociło GetDirectory. Kopiować na chama, a jakże! Backslash na końcu ściezki czy jest czy nie ma, a co to za różnica.
  4. Czuję tutaj chęć stworzenia malware. Kopiowanie do katalogu Windowsa, które przy obecnych systemach i włączonym UAC bez praw admina spełznie na niczym oraz pro w Twoim nicku sugeruje mi że bawisz się domorosłego pr0 h4x0r4, ale chiałbym się mylić.
  5. Kod powinien wyglądać według mnie raczej tak jak poniżej. I polecam zanim zaczniesz bawić się w tworzenie malware na przykład wykradającego kolegom hasła do tibii to polecam szukać samodzielnie najpierw w google, pokombinować samodzielnie, a dopiero później pytac. Wiadomo każdy kiedyś zaczynał, ale Delphi to nie BrainFuck i tutaj przy tak prostych rzeczach o jakie pytasz wystarczyło minimum samodzielności i logicznego myślenia. Nie potrzeba tutaj żadnych pr0 5ki1100w.
     
    function AddBackSlash(Path : string) : string;
    begin
    Result := '';
    if Path = '' then
    begin
    Exit;
    end;
    if Path[Length(Path)] <> '\' then
    begin
    Result := Path + '\'
    end
    else
    begin
    Result := Path;
    end;
    end;

function GetWinDir : string;
var
Dir : array[0..MAX_PATH] of Char;
begin
GetWindowsDirectory(Dir, MAX_PATH);
Result := AddBackSlash(StrPas(Dir));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFile('D:\lol.exe', PChar(GetWinDir + 'lol.exe'), False);
end;


Analize chciałeś, to przeanalizowałem. Pomoc dostarczona. Next ;P

edytowany 2x, ostatnio: olesio, 2011-08-05 02:21
"malware na przykład wykradającego kolegom hasła do tibii " - troche przesadziłeś, stary ;) . Wybaczysz za -1 :-] - payl 2011-08-05 03:37

Pozostało 580 znaków

2011-08-05 02:39
0

Dzięki za pomoc, choć przykro mi czytać takie słowa, gdyż jestem nowy na tym forum, phx_pro to nick którym się posługuję od kilku lat więc proszę nie oceniaj użytkownika po nicku. Może nie jestem tak inteligentny, ale wszystko przede mną, aha i brzydzę się tibią...
Jeszcze nie mogę rozszyfrować użytych przez Ciebie słów/ zwrotów: pr0 h4x0r4 i pr0 5ki1100w.

Pozostało 580 znaków

2011-08-05 03:04

Nie znięchęcaj się :) Jeżeli pro to normalny dopisek i nie chcesz bawić się w hackera to dobrze. Sorry, może źle Ciebie oceniłem. Ale już napatrzyłem się na tym forum na takich domorosłych hakierów co to podstaw nie znają, ale keyloger albo grę chcieli by stworzyć jak stronę w pajączku (to akurat autenytk, bo ostatnio był tutaj taki co chciał grę stworzyć bez własnego wkłądu i żeby jak stronę w pajączku się "pisało"). I rownież ja, jak i wielu na tym forum jestem wyczulony na chęć pisania malware, bo malware to zło. I tak potrakrowałem chęć kopiowania jakiś lolów do katalogu Windowsa. Do Program Files ok, ale po co zaśmiecać komuś i tak zaśmiecony katalog windowsa. Pobrać ścieżkę się przydaje, ale po to aby ewentualnie odszukać jakiś plik do uruchomienia nieszkodliwego na przykład explorer.exe, ale po co tam śmiecić jeszcze to nie widze celowości. Podsumowując, najprościej pobrać katalog specjalny korzystając z pierwszej funkcji, którą podał autor artykułu do którego podałeś link. Tylko zrobić sprawdzanie koncowego znaku. I nie wiem po co autor artykułu upierał się później przy pokazaniu innej metody i jak widać chyba tylko wprowadził początkujących w błąd. Dlatego wystarczy takie coś jak poniżej i nie będzie raczej problemów.

uses
  ShlObj;
 
const
  CSIDL_WINDOWS = 36;
 
function GetSpecialFolderPath(const Folder : Integer) : string;
var
  Path : array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderPath(0, Path, Folder, False);
  Result := Path;
  if Result <> '' then
  begin
    if Result[Length(Result)] <> '\' then
      Result := Result + '\';
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := GetSpecialFolderPath(CSIDL_WINDOWS);
end;

Pozostało 580 znaków

2011-08-05 03:56
0

Ok jeszcze raz dzięki za pomoc. Z tego co widzę to za bardzo zaawansowane jak dla mnie, pogubiłem się. Na razie poćwiczę prostsze rzeczy.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0