Max1414 Napisano Luty 11, 2007 Zgłoś Share Napisano Luty 11, 2007 Zrobiłem tak: - przykładową aplikację (Project3.exe) z ListView1 po 2 itemy w tym po 2 subitemy,- następną aplikację (kod poniżej), która za pomocą Inject Dll, próbuje pobrać dane z ListView Project3.exe, ponieważ normalnie to nie działa, a ktoś z 4p powiedział: [quote] Ale najpierw musisz funkcję wywołać w ramach pamięci adresowej tego procesu z ListView. [/quote]- biblioteke dll, która ma pobrać ten tekst z ListView.Coś w tym wszystkim jest źle tylko nie wiem co... może ktoś potrafi pomóc?Program:Delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XiButton, CommCtrl, StdCtrls, TLHelp32; type TMainForm = class(TForm) XiButton1: TXiButton; procedure XiButton1Click(Sender: TObject); private procedure InjectDll(hProcess: THandle); { Private declarations } public { Public declarations } end; var MainForm: TMainForm; function Dane: String; stdcall external 'Project2.dll' name 'Dane';implementation {$R *.dfm} procedure TMainForm.XiButton1Click(Sender: TObject);var hProcess: THandle; _HWND : THandle; Proc : TProcessEntry32;begin _HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0); Proc.dwSize:=SizeOf(Proc); // okresl rozmiar struktory if Integer(Process32First(_HWND, Proc)) <> 0 then repeat if proc.szExeFile = 'Project3.exe' then begin hProcess:= OpenProcess(PROCESS_CREATE_THREAD + PROCESS_QUERY_INFORMATION + PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_VM_READ, false, Proc.th32ProcessID); Break; end; until Integer(Process32Next(_HWND, Proc)) = 0; // dopoki wartosc nie osiagnie 0 CloseHandle(_HWND); InjectDll(hProcess); Showmessage(Dane); CloseHandle(hProcess); end; procedure TMainForm.InjectDll(hProcess: THandle);var pLibRemote: Pointer; szLibPath: array[0..MAX_PATH] of Char; Bytes, ThreadId: cardinal; hLibModule: DWORD; hThread: THandle; hKernel32: HMODULE;begin hLibModule:=0; pLibRemote:= nil; hKernel32:= GetModuleHandle('Kernel32'); szLibPath:='C:Documents and SettingsMaxPulpitNowy folderProject2.dll'; pLibRemote := VirtualAllocEx(hProcess, nil, sizeof(szLibPath), MEM_COMMIT, PAGE_READWRITE ); WriteProcessMemory( hProcess, pLibRemote, @szLibPath, sizeof(szLibPath), Bytes ); hThread := CreateRemoteThread( hProcess, nil, 0, GetProcAddress( hKernel32, 'LoadLibraryA' ), nil, ThreadId, ThreadId); WaitForSingleObject( hThread, INFINITE ); GetExitCodeThread( hThread, hLibModule ); CloseHandle( hThread ); VirtualFreeEx( hProcess, pLibRemote, sizeof(szLibPath), MEM_RELEASE );end; end. Biblioteka DLL (Project2.Dll):Delphi library Project2; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes, Windows, CommCtrl; var Uchwyt: HWND; Haslo: String; {$R *.res} procedure Dll_Proc(Reason : Integer);var hWindow, hList: HWND; item:tagLVITEMA; text: array[0..31] of char;begin if Reason <> DLL_PROCESS_ATTACH then Exit; hWindow:= FindWindow('TForm1', 'Form1'); hList:=FindWindowEx(hWindow, 0, 'TListView', nil); Uchwyt:= hList; ZeroMemory(@item, sizeof(item)); item.iItem:=0; item.iSubItem:=0; item.pszText:=text; item.mask:=LVIF_TEXT; item.cchTextMax:=sizeof(text); SendMessage(Uchwyt, LVM_GETITEM, 0, Integer(@item)); Haslo:=text;end; function Dane: String;begin Result:= Haslo;end; exports Dane name 'Dane'; beginend. I otrzymuje pusty komunikat... Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KKKas Napisano Luty 11, 2007 Zgłoś Share Napisano Luty 11, 2007 Na pewno nie trzeba inject'ować dll'ki, bo LVM_GETITEMCOUNT pobiera poprawnie. Zaraz dojdę jak pobrać itema ;-) ҉ Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 11, 2007 Autor Zgłoś Share Napisano Luty 11, 2007 byłbym wdzięczny bo już wszystkiego probuje ;( Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KKKas Napisano Luty 11, 2007 Zgłoś Share Napisano Luty 11, 2007 Hm, jednak to nie jest takie proste. Faktycznie trzeba wykonać kod w tym samym zakresie pamięci ;-) Znalazłem dwa rozwiązania (pierwsze na szybko sprawdzałem, ale mi nie działało, drugiego już mi się nie chce):http://groups.google.com/group/borland.pub...7757beda9db3d4bhttp://groups.google.com/group/borland.pub...da55537c1e54039Powodzenia ;-) ҉ Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 11, 2007 Autor Zgłoś Share Napisano Luty 11, 2007 Nie lapie o co biega w tym drugim a pierwszy tak jak tobie, nie dziala...W tym drugim to nie bardzo rozumiem jak używać to ...EDIT: A moze zamiast szukania nowych rozwiazan, ktos poprawi moj kod ? Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
ktoś Napisano Luty 13, 2007 Zgłoś Share Napisano Luty 13, 2007 WriteProcessMemory( hProcess, pLibRemote, @szLibPath, sizeof(szLibPath), Bytes ); przyznaję, że przeczytałęm tylko pobieżnie, i nie mam zbyt wielkiej wiedzy na temat włamywania się do innych aplikacji, ale to WRITE trochę dziwnie mi tu wygląda... może READ?chyba, że zapisanie czegoś do procesu ma umożliwić łatwiejszy dostęp do niego.... Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 13, 2007 Autor Zgłoś Share Napisano Luty 13, 2007 musimy przypisac do pamięci procesu scieżke do biblioteki Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 16, 2007 Autor Zgłoś Share Napisano Luty 16, 2007 Nikt nie potrafi pomoc ?? ;(;( Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KaYou Napisano Luty 16, 2007 Zgłoś Share Napisano Luty 16, 2007 To Ci powinno pomoc:http://www.delphi-library.de/topic_48816.h...36c6b420b37ff37Kod pokazuje jak pobrac liste z winampa i wklejac do progoska, jak nie znasz niemca proponuje Ci wklejac kod i zobaczyc jak dziala.Pozdrawiam KaYou "(2b || !(2b)) == question" W. Shakespeare http://jakubniwa.pl - świat sztucznej inteligencji Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 16, 2007 Autor Zgłoś Share Napisano Luty 16, 2007 [delphi][/delphi]Zrobilem cos takiego... wiem ze MPointer jest zle ale nie wiem o co w tym chodzi bo tamto jest na konkretnych komunikatach winampa robione... Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KaYou Napisano Luty 17, 2007 Zgłoś Share Napisano Luty 17, 2007 Chodzilo o ogolna idee dzialania na procesach, wykorzystaj to i bedzie git :> "(2b || !(2b)) == question" W. Shakespeare http://jakubniwa.pl - świat sztucznej inteligencji Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Luty 17, 2007 Autor Zgłoś Share Napisano Luty 17, 2007 [delphi][/delphi]Wytłumaczy mi ktos co tu jest zle:)? Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.