Здравствуйте ALL. Мне нужно загрузить DLL в пространство smss. Но CreateRemoteThread ругается error code 8. Вроде как нет памяти. Помогите пожалуйста.
я пытался туда dll внедрять... Плохо сказывается на работе системы. Странно, но все системные процессы шутки не поняли. Winlogon вообще до синего экрана доводит. Может они контролируют свою целостность? Либо внедряемый код затирает память...
SnugForce Простите, а до этого вы хоть единожды успешно внедряли DLL в любой другой процесс? Код в студию.
to stainer дык память под код вроде и не надо было. Я просто пытался вызвать LdrLoadDLL указав ее в качестве точки входа. Правда здес я исходил из того что ntdll мапится в одни и теже адреса как kernel32.dll. Результат error code 8. Через ZwCreateThread вроде все нормально - нить запускается (но пока только убивает smss интересно что винда после этого остается живой только новые сессии не запускает). По поводу CreateRemoteThread я думаю здесь какая то хрень с WIN32 подсистемой, наверняка она не только нить в чужом процессе создает но и еще чего то в crss (как следствие CreateRemoteThread работает в одной сессии), а smss он чиста нативный процесс причем еще и не принадлежащий ни одной сессии (судя по EPROCESS), хотя ТМ кажет его в 0ой. Но это всё мои догадки. Честно говоря с виндой у меня опыт очень небольшиой я недавно на неё с линукса переполз. to ALL Еще вопрос 2 вопроса: 1. Каким образом корректно завершить нить созданную через ZwCreateThread в чужом процессе. Т.е. куда должен указывать последний return в стеке или система сама об этом думает? 2. Как узнать адреса интересующих меня процедур в ntdll в удаленном процессе. (например smss
слушай ну чего тут разговаривать - то запости код и посмотрим мне кажется что ты забыл записать в память удалённого процесса имя dll которую ты собираешься грузить адреса ntdll всегда одни и теже в пределах build операционной системы ( проще говоря в пределах сервиспака )
Quantum Все по Рихтеру, только в delphi. К большинству процессов dll внедрялась успешно. Я там на точку входа в dll поставил MessageBox. Вот боюсь еще, что dll на delphi не надо было писать.
большой разницы нет , на чём писать у меня и на дельфи всё работало , посмотри код у ms-rem и статью почитай, может упустил что ещё попробуй поставить faults on в сфтайсе , нет ли там чего , и попробуй не импортировать в длл ничего кроме exitprocess, хотя в дельфи по моему sysallocstring автоматом импортируется, а это тянет за собой user32 и тд
asgard Видимо это из-за отсутствия kernel32.dll в пространстве smss.exe, вот такой из него код должен создавать поток Код (Text): 793A9824 33ED XOR EBP,EBP 793A9826 53 PUSH EBX 793A9827 50 PUSH EAX 793A9828 6A 00 PUSH 0 793A982A 55 PUSH EBP 793A982B 8BEC MOV EBP,ESP 793A982D 6A FF PUSH -1 793A982F 68 60D33A79 PUSH 793AD360 793A9834 68 B4F03B79 PUSH 793BF0B4 793A9839 64:A1 00000000 MOV EAX,FS:[0] 793A983F 50 PUSH EAX 793A9840 64:8925 00000000 MOV FS:[0],ESP 793A9847 51 PUSH ECX 793A9848 51 PUSH ECX 793A9849 51 PUSH ECX 793A984A 51 PUSH ECX 793A984B 53 PUSH EBX 793A984C 56 PUSH ESI 793A984D 57 PUSH EDI 793A984E 8965 E8 MOV [EBP-18],ESP 793A9851 8365 FC 00 AND DWORD PTR [EBP-4],0 793A9855 64:A1 18000000 MOV EAX,FS:[18] 793A985B 8945 E0 MOV [EBP-20],EAX 793A985E 8178 10 001E0000 CMP DWORD PTR [EAX+10],1E00 793A9865 75 0F JNZ SHORT 793A9876 793A9867 803D 08004079 00 CMP BYTE PTR [79400008],0 793A986E 75 06 JNZ SHORT 793A9876 793A9870 FF15 B0123A79 CALL [<&NTDLL.CsrNewThread>] ; ntdll.CsrNewThread 793A9876 FF75 0C PUSH DWORD PTR [EBP+C] 793A9879 FF55 08 [b]CALL [EBP+8][/b] ; LPTHREAD_START_ROUTINE 793A987C 50 PUSH EAX 793A987D E8 B9C6FFFF CALL ExitThread Думаю ядро тупо проверяет есть ли код по адресу 0x793A9824, если его там нет - CreateRemoteThread возвращает ERROR_NOT_ENOUGH_MEMORY (00000008), если он есть то вызывает эту ф-цию с параметром LPTHREAD_START_ROUTINE Там скорее жестко прошит 0x793A9824(ф-ция вызова потока), точно также как и 0x793A87B3(ф-ция вызова процесса), я на w2ksp4 делал прогу без kernel32.dll, специально делал её imagebase таким, чтобы по 0x793A87B3 оказывалось не пусто Код (Text): ;===================================================================== format pe gui at 0x793A0000 ; imageBase kernel32.dll rb 1024*64 ; ~< sizeof kernel32.dll ;===================================================================== int3 @@: jmp @b ;===================================================================== Тогда процесс успешно стартовал, при вызове CreateRemoteThread для такого процесса, поток тоже успешно создается, НО выполняется не LPTHREAD_START_ROUTINE, а код по адресу 0x793A9824!(есс-но все адреса у сервиспаков разные) XP у меня нет проверить, но насколько я знаю там kernel32.dll грузится по-умолчанию
Тут получается палка в двух концах, удаленно kernel32.dll не загрузишь без CreateRemoteThread, а та не выполнится без kernel32.dll, остается вроде WriteProcessMemory, но нужно знать куда писать (тогда можно впихнуть даже вызов LdrLoadDLL) Код (Text): ;===================================================================== hmodule dd 0 sobject dd size shl 16 or (size-2) pobject dd object object du 'kernel32.dll',0 size = $-object ;===================================================================== invoke LdrLoadDll,0,0,sobject,hmodule ;===================================================================== Или действительно получалось через ZwCreateThread?
Да с ZwCreateThread нитка запускается и пока я только упел вызвать из нее ZwTerminateThread (что приводит к её корректному завершению) но думаю что с LdrLoadDLL проблем не будет. Придется немного со стеком поизвращаться. A CreateRemoteThread при создании нити вызывает кучу вского хлама типа CsrClientCallServer. А smss как известно нативный процесс и сервер WIN32 скорее всего про него ничего не знает. К тому же как я уже говорил в EPROCESS он помечен как не принадлежащий сессии. А по MSDN CreateRemoteThread ваще только в одной сесии работает.