Сейчас на форуме: tyns777, zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› RtlCreateUserThread - приложение падает с ошибкой 0xC0000005 |
Посл.ответ | Сообщение |
|
Создано: 07 мая 2013 13:38 · Поправил: AlexSun · Личное сообщение · #1 Собственно, у меня проблема подобная на рассматриваемую в Только я пишу на C# и система Windows 8 x64. Хочу в каком-то другом процессе вывести сообщение "Hello world". Вот код: Code:
Другое приложение падает с ошибкой 0xC0000005. RtlCreateUserThread возвращает 0, thread и clientid инициализируются. Приложения x64. Экспериментирую на notepad.exe, пока что руками пишу его pid в OpenProcess. |
|
Создано: 07 мая 2013 14:16 · Личное сообщение · #2 notepad.exe: Code:
|
|
Создано: 07 мая 2013 14:19 · Личное сообщение · #3 |
|
Создано: 07 мая 2013 14:24 · Личное сообщение · #4 |
|
Создано: 07 мая 2013 14:31 · Личное сообщение · #5 |
|
Создано: 10 мая 2013 00:27 · Личное сообщение · #6 ДЛЛ пиши, подгружай в АП цели, и будет счастье. Передача указателя на свою обертку вокруг managed-метода - жесть. Даже если скопировать этот метод в АП цели (хз как), всё равно там ведь не будет всей .NET FW подгруженной, не будет ВМ. В общем, запускать managed-код в АП нативного приложения - имхо, жуткий изврат. |
|
Создано: 17 мая 2013 23:23 · Поправил: AlexSun · Личное сообщение · #7 r_e Написал так: Code:
Работает. RtlExitUserProcess находится в том же адресном пространстве, что и notepad? А так не работает: Code:
Та же C0000005. |
|
Создано: 17 мая 2013 23:38 · Поправил: AlexSun · Личное сообщение · #8 Загружаю функцию из своей DLL на С++ в чужой процесс, все возвращаемые значения ок, RtlCreateUserThread возвращает 0, чужой процесс падает с ошибкой 0xC0000005... Итого код: Code:
У кого какие мысли? |
|
Создано: 17 мая 2013 23:53 · Поправил: UnameR · Личное сообщение · #9 alloc это у тебя адрес строки, а ты на него поток создаешь... Тебе поток надо создавать на адрес LoadLibrary и StartParameter как alloc Так ты свою библиотеку загрузишь в чужой процесс. Потом можно как-нибудь получить базу твоей загруженой либы. Ну а там адрес нужной функции легко уже можно вычислить и создать поток. >>Работает. RtlExitUserProcess находится в том же адресном пространстве, что и notepad? kernel32 user32 ntdll и некоторые другие для всех процессов имеют одинаковую базу (с оптимизацией связанно, CopyOnWrite) Твоя либа каждый раз при загрузке на новом месте. Да и плюс её может просто не быть в процессе нужном. |
|
Создано: 17 мая 2013 23:57 · Поправил: AlexSun · Личное сообщение · #10 |
|
Создано: 18 мая 2013 00:07 · Личное сообщение · #11 Кажется, понял о чем ты. Переписал: Code:
Теперь чужой процесс не падает, но моя функция из dll не выполняется. Код dll: Code:
|
|
Создано: 18 мая 2013 00:32 · Поправил: UnameR · Личное сообщение · #12 Расшифровка шел кода: 01405301 E8 00000000 CALL 01405306 01405306 58 POP EAX 01405307 83C0 16 ADD EAX,0x16 0140530A 50 PUSH EAX 0140530B 50 PUSH EAX 0140530C FF50 FC CALL DWORD PTR DS:[EAX-0x4] 0140530F 59 POP ECX 01405310 8941 F8 MOV DWORD PTR DS:[ECX-0x8],EAX 01405313 C3 RETN DD сюда запишется база твоей либы DD сюда надо записать адрес LoadLibrary Дальше null-terminated путь до либы (D:\hello.dll например) Псевдокод: unsigned char ddd[] = "\xE8\x00\x00\x00\x00\x58\x83\xC0\x16\x50\x50\xFF\x50\xFC\x59\x89\x41\xF8\xC3\x00\x00\x00\x00\x00\x00\x00\x00C:\Hello.dll\x00"; unsigned char *dd = ddd; *((unsigned int*)(dd+23)) = (unsigned int)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); unsigned char *alloc = VirtualAllocEx(hProc, 0, sizeof(ddd), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTEREADWRITE); WriteProcessMemory(hProc, alloc, ddd, sizeof(ddd), written); RtlCreateUserThread(на alloc без параметра); int fff = 0; ReadProcessMemory(hProc, alloc+19, &fff, 4, readen); fff будет содержать базу твоей либы в новом процессе myBASE = LoadLibrary("D:\hello.dll"); XAddr = GetProcAddress(myBASE, "HelloAlexSun")-myBASE ; RtlCreateUserThread(создать поток на fff+XAddr); Не проверял, но идея должна быть понятна |
|
Создано: 21 мая 2013 05:19 · Личное сообщение · #13 |
|
Создано: 21 мая 2013 14:09 · Личное сообщение · #14 Dr0p Пора уже слезть с виндоус хп и открыть для себя NT6X и x64. Функционал этой рутины существенно отличается в современных версиях венды от того как он выглядел в гавне мамонта, см. матчасть NtCreateThreadEx. Твой пост не имеет смысла. AlexSun Инжекты длл через RtlCreateUserThread осилили даже на autoit-e, что говорит о том что у вас кривой код. |
|
Создано: 21 мая 2013 15:59 · Личное сообщение · #15 AlexSun пишет: У кого какие мысли? http://www.delphisources.ru/pages/sources/system/2010-year/dll-injector.html Alchemistry пишет: Пора уже слезть с виндоус хп Не нужно. ----- http://ntinfo.biz | Сообщение посчитали полезным: Abraham |
|
Создано: 22 мая 2013 05:26 · Личное сообщение · #16 |
|
Создано: 22 мая 2013 11:08 · Личное сообщение · #17 Alchemistry пишет: И тема про инжект в Windows 8, CreateRemoteThread там работать не будет Всё там работает. Alchemistry пишет: И смысл твоего поста? Еще раз показать какой ты дурак? Почти в каждом своём сообщении Вы жалуетесь на то, что плохо понимаете смысл, который окружающие Вас люди пытаются до Вас донести. Не переживайте, на начальном этапе легкие расстройства прекрасно лечатся. Главное вовремя принять меры, чтобы не мучать себя и близких родственников. ----- http://ntinfo.biz | Сообщение посчитали полезным: Dr0p |
|
Создано: 22 мая 2013 17:49 · Личное сообщение · #18 |
|
Создано: 22 мая 2013 18:39 · Личное сообщение · #19 |
|
Создано: 23 мая 2013 19:51 · Поправил: Dr0p · Личное сообщение · #20 |
eXeL@B —› Программирование —› RtlCreateUserThread - приложение падает с ошибкой 0xC0000005 |