dll:TMemoryStream + Użycie

0

Witam, mam pewien problem a mianowicie
posiadam dllkę wczytaną do Tmemorystream

MemoryStream:TmemorySTream

W memorystream znajduje się dll o nazwie lol.dll
I potrzebuję wczytać to do kodu

dll_name := 'C:\lol.dll';
WindowName := FindWindow(nil,WindowTitle);
ThreadId := GetWindowThreadProcessId(WindowName,@PID);
hProzess := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
pdll_name := VirtualAllocEx(hProzess, 0, length(dll_name), MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProzess, pdll_name, PChar(dll_name), length(dll_name), bw);
CreateRemoteThread(hProzess, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryA'), pDLL_name, 0, hRemote_Thread);
CloseHandle(hProzess);

Czyli Zamiast Korzystać z dllki z dysku użyć ją prosto z pamięci(nie wchodzi w grę zapisanie dllki na dysku a potem jej użycie.
Są jakieś pomysły?

0

Tak, zaintersowałem się tym już wcześniej tylko niezbyt wiem jak mam to użyć?

0

karek314: napisałeś na forum, tak jak Tobie radzilem na PW, ale źle sprecyzowales. Ty coś z injekcją dllki kombinujesz,
a ja nie mam pojęcia jak wstrzyknąć kod z TMemoryStreama, bo o ile chodzi o samo użycie dllki pobranej z Internetu z
www przez Synapse, a nie z dysku to już przykladowy kod Tobie podesłalem i on działa, bo korzysta z tego modułu pod
wskazanym tu linkiem, tylko że znowu Twoj kod zacytowany przez Ciebie jest jakiś dziwny. Bo ja się dosyć slabo znam
na tych funkcjach co podałeś. Niektorych z nich nigdy nie używałem poza chyba XxxxxxProcesMemory. Teraz dopiero
zauważyłem, że używasz w jakiś dziwny, jak dla mnie, sposob funkcji LoadLibrary. Nie wiem dlaczego akurat tak, a
nie po prostu LoadLibrary... a i jak widzialeś w moim przykładowym kodzie dllloader nie laduje dllki przez LoadLibrary,
bo ta funkcja ładuje z dysku. Popatrz jeszcze raz na poniższy kod. Do pozostałych czytających, o ile potraficie mu jakoś
pomóc to dopasujcie Jego kod z wycinka do tego poniżej. Tylko ja użyłem, wiadomej funkcji DLL.FindExport z tej klasy
TDllLoader. Natomiast w Twoim wycinku, nie widzę, abyś w ogóle ładowal jakąś funkcję z dllki. Nie znam się na takim
sposobie ładowania dll, a poniżej podaję kod jaki mu wysłałem. Link do dllki jest nadal aktualny, więc kod oczywiście
działa, tylko że pytający chce metodą, ktorej nie rozumiem coś zrobić z pobraną już dllką z TMemoryStream Document

Moja przykładowa dllka

library dll_from_net;

uses
  Windows;

procedure TestFunc; stdcall;
begin
  MessageBox(GetActiveWindow,
    PChar('Jeżeli widzisz ten komunikat, to wszystko działa prawidłowo.'),
    PChar('Komunikat z dll'), MB_ICONINFORMATION + MB_OK);
end;

exports
  TestFunc;

begin
end.

Kod programu:

//...
uses
  dllloader, httpsend;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.Title := Caption;
end;

procedure TMainForm.GetBtnClick(Sender : TObject);
const
  Dll_Url = 'http://swos-gg.cba.pl/a/dll_from_net.dll';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30';
var
  DLL : TDllLoader;
  SynHttp : THttpSend;
  TestFunc : procedure;
begin
  DLL := TDllLoader.Create;
  SynHttp := THttpSend.Create;
  SynHttp.KeepAlive := True;
  SynHttp.Protocol := '1.1';
  SynHttp.UserAgent := Opera_UserAgent;
  SynHttp.HTTPMethod('GET', Dll_Url);
  if (SynHttp.ResultCode <> 404) and (SynHttp.Document.Size > 0) then
  begin
    DLL.Load(SynHttp.Document);
    TestFunc := DLL.FindExport('TestFunc');
    if @TestFunc <> nil then
    begin
      TestFunc;
    end;
  end;
  DLL.Free;
  SynHttp.Free;
end;
0

temat do zamkniecia.

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