kiedy dolaczam swoja dllke do jakiegos programu i probuje operowac na pamieci tegoz programu, dostaje blad access violation - ktos moze mnie oswiecic i powiedziec czym to jest spowodowane i jak obejsc/wylaczyc/zrobic tak by program nie blokowal mi dostepu do pamieci?
Napisz jakieś szczegóły, bo to może mieć różne przyczyny... Tak Ci nikt nie pomoże, ale jeśli zaczynasz programować i używasz tablic dynamicznych to lepiej się im przyjrzyj :-)
nothing to do z tablicami dynamicznymi
po prostu mam program i chcac czytac z pamieci bez uzywania readprocessmemory, tylko pointerami injectuje dllke do tejze aplikacji i dziala, ale kiedy chce cos odczytac to access violation
kumpel mi napomknal cos o thread safety, ale nie wiem jak to obejsc
jak tą dllkę wstrzykujesz, hm? Bo większość 'programistów delphi' nie wie, że istnieją odrębne przestrzenie adresowe dla każdego programu, programy nie widzą się wzajemnie...
http://delphi.about.com/cs/adptips2003/a/bltip1003_2.htm
podobnie jak tu
lol, ale ten art jest o ładowaniu dll w przestrzeni adresowej Twojego procesu... Po jakiegoś grzyba wymyślono w Intelu tryb chroniony aby utrudnić bezpośrednią interakcję pomiędzy procesami... Czyli miałem rację pisząc w czudzysłowiu 'programistów delphi' - jak zwykle nie mają pojęcia o organizacji pamięci...
wiec jakies inne pomysly, jak wrzucic swoja dllke do programu?
na pewno da sie to zrobic, tylko jak?
Coldpeer iniekcja dllki to ładowanie jej w inny proces, a w podanych przez Ciebie artach są tylko informacje o pracy z własnym procesem. Odnoszę wrażenie, że autor tematu sam nie wie czego chce, ale... Jako, że nie piszę w delphi, gdyby ktoś był tak miły - mógłby to przepisać z C++.
bool InjectDll2 (HANDLE hProcess, char* pLibName)
{
DWORD ExitCode;
FARPROC LoadLib = GetProcAddress (GetModuleHandle ("kernel32.dll"), "LoadLibraryA");
void* pMem = VirtualAllocEx (hProcess, 0, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pMem, pLibName, lstrlen (pLibName), 0);
HANDLE hThread = CreateRemoteThread (hProcess, 0, 0, (LPTHREAD_START_ROUTINE) LoadLib, pMem, 0, &ExitCode);
WaitForSingleObject (hThread, INFINITE);
GetExitCodeThread (hThread, &ExitCode);
VirtualFreeEx (hProcess, pMem, MAX_PATH, MEM_DECOMMIT);
/* ExitCode zawiera adres zaladowanej biblioteki lub 0 jesli zaladowanie sie nie powiodlo */
return (ExitCode);
};
Jako, że LoadLibrary przyjmuje taką samą liczbę argumentów co THREAD_START_ROUTINE można wywołać LL bezpośrednio w 'atakowanym' procesie bez wstrzykiwania własnego kodu. Należy jednak umieścić w przestrzeni adresowej programu nazwę dll'ki do załadowania... i przekazać jej adres jako argument wątku. Jedna z moich kilku procek do iniekcji, najprostsza i w większości wypadków wystarczająca... przykład wywołania:
InjectDll2 (GetCurrentProcess(), "dllek.dll");
Jak już pisałem, gdyby ktoś był tak miły...
Dałoby radę, żeby ktoś pomógł? ;)
Nie sprawdzałem czy działa, sprawdziłem tylko czy się kompiluje:
function InjectDll2(hProcess: Cardinal; pLibName: PChar): Boolean;
var
ExitCode: DWORD;
LoadLib: FARPROC;
pMem: Pointer;
lpNumberOfBytesWritten, hThread: Cardinal;
begin
LoadLib := GetProcAddress (GetModuleHandle('kernel32.dll'), 'LoadLibraryA');
pMem := VirtualAllocEx (hProcess, nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, pMem, pLibName, lstrlen(pLibName), lpNumberOfBytesWritten);
hThread := CreateRemoteThread (hProcess, nil, 0, LoadLib, pMem, 0, ExitCode);
WaitForSingleObject (hThread, INFINITE);
GetExitCodeThread (hThread, ExitCode);
VirtualFreeEx (hProcess, pMem, MAX_PATH, MEM_DECOMMIT);
Result := ExitCode <> 0;
end;
Dzięki, zaraz sprawdzę.
Dobra, niby inject działa. Ale nic nie moge z dllką zrobić... Nie działa nic, nawet msgboxa mi nie chce wyświetlić. WTF?!
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.