Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› SetThreadContext |
Посл.ответ | Сообщение |
|
Создано: 11 декабря 2006 22:02 · Личное сообщение · #1 Проблема в следующем: В своем отладочном цикле ставлю брекпоинты на WinAPI. С функциями, вызываемыми из основного процесса, проблем нет.А вот с функциями, которые вызываются до вызова из отлаживаемой проги, вот такая проблема: При заполнении структуры Context в eip оказывается такая хрень, хотя событие ExceptionBreakpoint и адреса соответствуют ExceptionAddress=APIaddr: eip: DS:[004B5350]=7C90EB94 (ntdll.KiFastSystemCallRet) |
|
Создано: 11 декабря 2006 22:54 · Личное сообщение · #2 |
|
Создано: 12 декабря 2006 01:29 · Поправил: BoOMBoX · Личное сообщение · #3 PE_Kill пишет: Нихрена не понял, кто от куда вызывается? Уточним: Когда вызывается функция, допустим MessageBox из отлаживаемой проги, то все ок. А вот, когда прога при загрузке подгружает допустим Advapi.dll, а она уже, в свою очередь вызывает MessageBox, то теоретически мы должны остановиться в теле Advapi.dll, но этого не происходит, хотя exception происходит именно на нужном адресе, только вот в context лезет какая-то пурга. |
|
Создано: 12 декабря 2006 01:39 · Личное сообщение · #4 BoOMBoX/TSRh пишет: А вот, когда прога при загрузке подгружает допустим Advapi.dll, а она уже, в свою очередь вызывает MessageBox Разве в адвапи длл есть форварды на юзер длл ? Если и есть, то явно не мессаджбоксовские ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels |
|
Создано: 12 декабря 2006 01:44 · Личное сообщение · #5 |
|
Создано: 12 декабря 2006 01:47 · Личное сообщение · #6 |
|
Создано: 12 декабря 2006 02:38 · Личное сообщение · #7 |
|
Создано: 12 декабря 2006 04:37 · Поправил: BoOMBoX · Личное сообщение · #8 HoBleen пишет: Может быть ты читаешь контекст другого потока?.. Это очень похоже на правду, только как корректно реализовать пока не нашел. Изначально работал в Get/SetThreadContext с параметром pi.hThread, когда все вызовы идут только из самой проги, то все нормально. Потом пробовал создать список всех потоков с их хэндлами (при событиях CreateProcess и CreateThread events) и написал функцию, возвращающую хэндл по ID потока, т.е. при возникновении события ExceptionBreakpoint на нужной API получаю хэндл так: GetCurrentHandle(DebugEvent.dwProcessId) но толку не дало. Все тоже самое. Как же получить хэндл текущего потока (в котором произошло исключение?). |
|
Создано: 12 декабря 2006 04:51 · Личное сообщение · #9 |
|
Создано: 12 декабря 2006 05:10 · Личное сообщение · #10 |
|
Создано: 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] |
|
Создано: 12 декабря 2006 05:27 · Личное сообщение · #12 |
|
Создано: 12 декабря 2006 05:30 · Личное сообщение · #13 |
|
Создано: 12 декабря 2006 05:35 · Поправил: BoOMBoX · Личное сообщение · #14 |
|
Создано: 12 декабря 2006 05:59 · Личное сообщение · #15 __ пишет: удивительно сумбурное у тебя изложение сути вопроса, я так и не понял =) Прерываясь на брекпоинте, BoOMBoX/TSRh читал контекст главного потока, а не того, который вызвал исключение. BoOMBoX/TSRh пишет: В MS API не нашел такую функцию OpenThread существует!! Правда, например, в хелпе дельфика её нету Её описание - в ссылке Hellspawn'а. |
|
Создано: 12 декабря 2006 06:05 · Личное сообщение · #16 |
|
Создано: 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] |
|
Создано: 12 декабря 2006 06:28 · Личное сообщение · #18 |
|
Создано: 12 декабря 2006 06:39 · Личное сообщение · #19 |
|
Создано: 12 декабря 2006 06:48 · Личное сообщение · #20 __ пишет: посмотри исходники плагина Red Plait'а(встроенный перл для IDA), там есть необходимый код, правда немного замусорен перловыми API, но суть понятна Спасибо, конечно. Но есть уже пример - nwDebugger с исходниками на асме (без использования OpenThread). У меня сейчас все вродь также реализовано, но хэндл не тот оказывается, нихрена не пойму.... Надо еще смотреть, ошибка то где-то есть.... |
|
Создано: 12 декабря 2006 06:54 · Личное сообщение · #21 |
|
Создано: 12 декабря 2006 06:56 · Личное сообщение · #22 |
|
Создано: 12 декабря 2006 21:11 · Личное сообщение · #23 BoOMBoX/TSRh я использую OpenThread, хотя первая версия была без него. При создании потока тебе дается его хэндл, так вот ловишь все создания потоков и сохраняешь в массив структур TID: DWORD; TH : DWORD; При убивании потока удаляешь оттуда. При возникновении отладочного события по TID ищеш хэндл в массиве и юзаешь. Но мне такой геморой не нужен, мне и NT хватает вот я и юзаю OpenThread. ----- Yann Tiersen best and do not fuck |
|
Создано: 08 ноября 2011 15:52 · Личное сообщение · #24 |
eXeL@B —› Программирование —› SetThreadContext |