• XSS.stack #1 – первый литературный журнал от юзеров форума

Windows 7 и перехват апи

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
С зимы понемногу разбираюсь с перехватом апи. Есть код, который перехватывает мессадбокс в блокноте (вызвать его можно при поиске). На ХР все работает отлично. На висте - сначала блокировал DEP, но по совету Apocalypse, перекомпилировал с другими флагами для секций кода, импорта - заработало. На семерке же ни в какую, при запуске прога вылетает с ошибкой. Т.е. прога тупо запускается и ошибка

Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя модуля с ошибкой: ntdll.dll
Отметка времени модуля с ошибкой: 4ba9b21e
Код исключения: c0000005
эта ошибка - это опять же, ACCESS_DENIED (код).
Немного погуглив, я понял, что проблема в токенах - т.е. делать write|read process memory чужого процесса в спермерке может лишь админ. Выходит, что бот должен быть запущен только под админом. Но как же работают формграбберы все эти, не пойму. Ведь не все сидят под админами.

В общем, алгоритм такой - я запускаю блокнот (на рабочем столе), от того же юзера на рабочем столе мой ехе - перехват. Он сразу вылетает с ошибкой которая выше. Если на моем ехе нажать правой кнопкой - запустить от админа, то все отрабатывает гуд.

В процесс эксплорере одинаковый уровень интегрити у блокнота и моей проги.
Вопрос - что я делаю не так и как это решить без манифестов? Почему оно вылетает именно на 7? Или никак не решить, ибо все таки нереально читать и писать в память чужого процесса? Кодес вот http://pastebin.com/LV0yCDHn
 
это ACCESS_VIOLATION, и ничего не понятно в твоем коде, и надо не гуглить а отлаживать, потому что опять же просто так не взглянешь и не скажешь где или какая из апишек дает этот эксепшен.

про w7 и CreateRemoteThread писали даже тут http://xakep.ru/55567/?print=true

в w7 ты не находишься в данный момент под админом, вернее ты конечно находишься но прав у тебя делать абы что нету, а то бы вся эта фигня с UAC не нужна была бы

причеши и отладь код, дабы быстро локализовать проблемы, а то ты так до следующей зимы будешь разбираться.

если ты хукаешь таки методом в данном случае мб это и не нужно, но надо стопать треды процесса. к тому же лучше юзать каллгейт ( память с реальным началом функции и джампом дальше ) дабы при вызове реальной функции не приходилось каждый раз восстанавливать/устанавливать хук, опять же это не безопасно.

другой, нормальный ( атомарный ) вариант хука, если он конечно не превышает 8 байт юзать cmpxchg8b, например вот так. хук Sleep

Код:
	call	__api_Sleep
; eax = kernel32!Sleep
	call	__set_hook
	retn
;========================================
__set_hook:
;========================================
	mov	edi,eax
	push	PAGE_EXECUTE_READWRITE
	pop	ecx
	call	__set_page_protect
	xchg	eax,ecx
	jecxz	@f
	call	__hook_handler
	push	PAGE_EXECUTE_READ
	pop	ecx
	call	__set_page_protect
@@:	retn
;========================================
__hook_api:
;========================================
	pop  ecx
	push	ebx
	mov	eax,esp
	sub	esp,0x08
	mov  byte [eax-0x08],0xb8
	mov  dword [eax-0x07],ecx
	mov  word [eax-0x03],0xe0ff
	mov  byte [eax-0x01],0x90
	xor	eax,eax
	cwd
	pop	ebx
	pop	ecx
@@:	lock	cmpxchg8b qword [edi]
	jnz	@b
	pop	ebx
	retn
;========================================
__hook_handler:
;========================================
	call	__hook_api
	call	__api_Sleep
	push	-1
	call	eax
 
Конечно таки, как уже эль написал, стоит заюзать ольку или имунити для поиска конкретного места ошибки, а далее видя код ошибки можно:
а) переписать этот код так, чтобы ошибки не было
б) погуглить ошибку, наверняка ты не первый с такой ошибкой...

без отладчика в таком деле ни о чем:)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
При отладке - если запускать олли от админа, то все отрабатывает гуд (хотя какая-то функция возвращает error_invalid_address, но пока это ерунда). А если олли запускать не от админа - то ошибка возникает после функции adjusttokenprivileges - error_not_all_assigned.

За пример кода спасибо, буду разбираться, ибо так сходу не все понятно.
 
хз как у тебя работает, CreateRemoteThread тоже не должен пройти

советую почитать
http://www.codeproject.com/Articles/19165/...efinitive-Guide
есть даже перевод
http://www.k-press.ru/cs/2008/2/UAC/uac.asp

вся суть в фразе
В Windows Vista пользователь, независимо от имеющихся у него прав, работает с ограниченными привилегиями.
в viste если я правильно помню, при малейшем шаге в сторону вылетал алерт юак, т.е. запрашиваешь привилегии - получаешь алерт, если согласился то получаешь привилегии. в w7 решили что uac больно парит юзера постоянными вопросами и подефалту отрубили ( алерт не вылетает, привилегий нет ) кучу няшек, если хочешь привилегий пускай свой процесс соответственно: службой или shellexecute runas

надо сказать что для инжекта ( по крайне мере в процессы того же юзера, il и сессии ) не нужны привилегии отладки, их запрашивают только для CreateRemoteThread, открыть и записаться можно и так, передать же управление придется например через апц, магию с контекстом, непосредственно патчем ... и т.д.

зы. надеюсь ничего не напутал
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Чтобы не плодить темы, спрошу здесь.
Разбираюсь с перехватом апи в фаерфокс. Прога для отслеживания апи вызовов показывает, что фф вызывает функцию gethostbyname из библиотеки nspr4.dll . Не могу понять, как такое может быть, и как это перехватить, потому что функция gethostbyname в этой длл, ес-но, не находится. А если ставить перехват на ws_32, то все равно не получается.
Как быть? Способ перехвата - все тот же сплайсинг, на других прогах код работает отлично, а с фф такая проблема.
 
у меня нету фф, но в гугле я нашел упоминание о PR_GetHostByName, мб это оно ?
а вообще это старая функа даже в мсдн советуют юзать getaddrinfo, мб фф обращается к ней
второй вариант, что все эти функи идут в dnsapi.dll в DnsQuery_* так что можно хукать сразу их
 
в данной либе нет экспортируемой функции gethostbyname есть PR_GetHostByName, которая сводится к вызову gethostbyname. Перехватываеца как и обычно патчем кодосекции точки входа ws2_32.dll!gethostbyname, хотя, разумееца, можна использовать костыли и прочий илитный GPE всеровноже весь ойпи прямтаки запилен на хипе
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
Прога для логирования вызова апи показывает, что фф обращается именно к gethostbyname, а не getaddrinfo. Про dnsapi не знал, спасибо. Выходит, винсок не отправляет вручную днс запросы, а является переходником к этим dns api?

TrashGen
Спасибо, но до конца не пойму - где ставить хук? На функцию PR_GetHostByName или на оригинальный gethostbyname? Юзаю негодные патчи кодосекций.
 
Quake3, по идеи все идет в днс службу, которая живет в отдельно svchost процессе, она отправляет запросы в сеть, кеширует их и предоставляет всем остальным доступ к этому через ipc.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх