Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› SetThreadContext
Посл.ответ Сообщение

Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 11 декабря 2006 22:02
· Личное сообщение · #1

Проблема в следующем:
В своем отладочном цикле ставлю брекпоинты на WinAPI.
С функциями, вызываемыми из основного процесса, проблем нет.А вот с функциями, которые вызываются до вызова из отлаживаемой проги, вот такая проблема:
При заполнении структуры Context в eip оказывается такая хрень, хотя событие ExceptionBreakpoint и адреса соответствуют ExceptionAddress=APIaddr:

eip: DS:[004B5350]=7C90EB94 (ntdll.KiFastSystemCallRet)




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 11 декабря 2006 22:54
· Личное сообщение · #2

BoOMBoX/TSRh пишет:
А вот с функциями, которые вызываются до вызова из отлаживаемой проги

Нихрена не понял, кто от куда вызывается?

-----
Yann Tiersen best and do not fuck




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 01:29 · Поправил: BoOMBoX
· Личное сообщение · #3

PE_Kill пишет:
Нихрена не понял, кто от куда вызывается?



Уточним:
Когда вызывается функция, допустим MessageBox из отлаживаемой проги, то все ок.
А вот, когда прога при загрузке подгружает допустим Advapi.dll, а она уже, в свою очередь вызывает MessageBox, то теоретически мы должны остановиться в теле Advapi.dll, но этого не происходит, хотя exception происходит именно на нужном адресе, только вот в context лезет какая-то пурга.



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 12 декабря 2006 01:39
· Личное сообщение · #4

BoOMBoX/TSRh пишет:
А вот, когда прога при загрузке подгружает допустим Advapi.dll, а она уже, в свою очередь вызывает MessageBox

Разве в адвапи длл есть форварды на юзер длл ? Если и есть, то явно не мессаджбоксовские

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 01:44
· Личное сообщение · #5

я к примеру привел, чтобы ясно стало, что я имею в виду.
ну если хотите, то ставлю брэкпоинт на RegDeleteValueA, а эта функция вызывается сначала из подгружаемой wininet.dll




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 12 декабря 2006 01:47
· Личное сообщение · #6

Smon
Это было сказано для примера.

BoOMBoX/TSRh
Не очень понял, при чем тут SetThreadContext? мб GetThreadContext?

В ольке, например, если самому приостановить поток, то его EIP = ntdll.KiFastSystemCallRet.
Может быть ты читаешь контекст другого потока?..




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 декабря 2006 02:38
· Личное сообщение · #7

Скорее всего дело действительно в кривой реализации, т.к. у мну в отладчике всё нормально

-----
Yann Tiersen best and do not fuck




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 04:37 · Поправил: BoOMBoX
· Личное сообщение · #8

HoBleen пишет:
Может быть ты читаешь контекст другого потока?..


Это очень похоже на правду, только как корректно реализовать пока не нашел.
Изначально работал в Get/SetThreadContext с параметром pi.hThread, когда все вызовы идут только из самой проги, то все нормально.
Потом пробовал создать список всех потоков с их хэндлами (при событиях CreateProcess и CreateThread events) и написал функцию, возвращающую хэндл по ID потока, т.е. при возникновении события ExceptionBreakpoint на нужной API получаю хэндл так:
GetCurrentHandle(DebugEvent.dwProcessId) но толку не дало. Все тоже самое.
Как же получить хэндл текущего потока (в котором произошло исключение?).



Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 12 декабря 2006 04:51
· Личное сообщение · #9

BoOMBoX/TSRh
удивительно сумбурное у тебя изложение сути вопроса, я так и не понял =)




Ранг: 420.3 (мудрец)
Активность: 0.240
Статус: Участник

Создано: 12 декабря 2006 05:10
· Личное сообщение · #10

BoOMBoX/TSRh
Привел бы кусочки кода, чтобы не объяснять на пальцах.

-----
Сколько ни наталкивали на мысль – все равно сумел увернуться





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 12 декабря 2006 05:16 · Поправил: Hellspawn
· Личное сообщение · #11

я вроде понял в чём проблема))) но не понял почему
попробуй чтото типа этого:

CurThread:=OpenThread(THREAD_ALL_ACCESS,false,de.dwThreadId)

з.ы. http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions /Fn_O/fn_openthread.htm http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions/Fn_O/fn_openthread.htm

-----
[nice coder and reverser]




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 05:27
· Личное сообщение · #12

ValdiS пишет:
Привел бы кусочки кода, чтобы не объяснять на пальцах.


Да привел бы, только что конкретно.
Вопрос то локализовался, как получить "правильный" хэндл потока, в котором произошло брекпоинтовое исключение?



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 05:30
· Личное сообщение · #13

__ пишет:
удивительно сумбурное у тебя изложение сути вопроса, я так и не понял =)


Кто в теме я думаю поймет, а как еще проще объяснить проблему, не знаю.



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 05:35 · Поправил: BoOMBoX
· Личное сообщение · #14

Hellspawn пишет:
CurThread:=OpenThread(THREAD_ALL_ACCESS,false,de.dwThreadId)


В MS API не нашел такую функцию

уже нашел в новом MSDN. Как вариант на NT системах пройдет похоже, а как же все-таки этот приславутый хэндл получить под 9x?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 12 декабря 2006 05:59
· Личное сообщение · #15

__ пишет:
удивительно сумбурное у тебя изложение сути вопроса, я так и не понял =)

Прерываясь на брекпоинте, BoOMBoX/TSRh читал контекст главного потока, а не того, который вызвал исключение.

BoOMBoX/TSRh пишет:
В MS API не нашел такую функцию

OpenThread существует!! Правда, например, в хелпе дельфика её нету
Её описание - в ссылке Hellspawn'а.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 12 декабря 2006 06:05
· Личное сообщение · #16

Kernel 4.90.3000 из под Win ME - ф-я OpenThread. Видимо, она была просто неполностью документрирована




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 12 декабря 2006 06:27
· Личное сообщение · #17

поиск надо юзать и под 9х мона, один из способов:

function OpenThread9x2(
dwAccess: DWord;
bInheritHandle: Boolean;
dwThreadID: DWord
): DWord; stdcall;
var
pTDB : Pointer;
pOpenProcess: Pointer;
OpenThread : Pointer;
begin
Result := 0;
pTDB := Pointer(dwThreadID xor GetObsfucator);
if IsBadReadPtr(pTDB, 4) then
Exit;
pOpenProcess := GetProcAddress(GetModuleHandle('kernel32.dll'),'OpenProcess');
if (pOpenProcess = nil) then
Exit;
if (PByte(pOpenProcess)^ = $68) then
pOpenProcess := PPointer(Pointer(DWord(pOpenProcess)+1))^;

OpenThread := Pointer(DWord(pOpenProcess)+$24);
asm
PUSH DWORD PTR [dwAccess]
PUSH DWORD PTR [bInheritHandle]
PUSH DWORD PTR [dwThreadID]
MOV EAX, DWORD PTR [pTDB]
CALL OpenThread
MOV Result, EAX
end;
end;

-----
[nice coder and reverser]




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 06:28
· Личное сообщение · #18

PE_Kill пишет:
Скорее всего дело действительно в кривой реализации, т.к. у мну в отладчике всё нормально


Ну, если бы реализация была прямая, то вопрос бы и не возник

А ты OpenThread юзаешь?



Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 12 декабря 2006 06:39
· Личное сообщение · #19

BoOMBoX/TSRh
посмотри исходники плагина Red Plait'а(встроенный перл для IDA), там есть необходимый код,
правда немного замусорен перловыми API, но суть понятна



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 06:48
· Личное сообщение · #20

__ пишет:
посмотри исходники плагина Red Plait'а(встроенный перл для IDA), там есть необходимый код,
правда немного замусорен перловыми API, но суть понятна


Спасибо, конечно. Но есть уже пример - nwDebugger с исходниками на асме (без использования OpenThread).
У меня сейчас все вродь также реализовано, но хэндл не тот оказывается, нихрена не пойму....
Надо еще смотреть, ошибка то где-то есть....



Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 12 декабря 2006 06:54
· Личное сообщение · #21

у RedPlait'а используется OpenThread (смотри mydbgxs.cpp), возможно это единственный верный подход



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2006 06:56
· Личное сообщение · #22

__ пишет:
RedPlait'а используется OpenThread (смотри mydbgxs.cpp), возможно это единственный верный подход


Посмотрю обязательно, но в nwDebugger и без использования OpenThread, все работает как положено.
Хочу разобраться сначала с этим.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 декабря 2006 21:11
· Личное сообщение · #23

BoOMBoX/TSRh я использую OpenThread, хотя первая версия была без него. При создании потока тебе дается его хэндл, так вот ловишь все создания потоков и сохраняешь в массив структур
TID: DWORD;
TH : DWORD;
При убивании потока удаляешь оттуда. При возникновении отладочного события по TID ищеш хэндл в массиве и юзаешь. Но мне такой геморой не нужен, мне и NT хватает вот я и юзаю OpenThread.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 08 ноября 2011 15:52
· Личное сообщение · #24

> eip: DS:[004B5350]=7C90EB94 (ntdll.KiFastSystemCallRet)

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


 eXeL@B —› Программирование —› SetThreadContext
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати