![]() |
eXeL@B —› Вопросы новичков —› Многопоточные приложения |
Посл.ответ | Сообщение |
|
Создано: 01 августа 2007 03:20 · Личное сообщение · #1 Здравствуйте! Как выйти на код второго потока в приложении?? HANDLE CREATEThread ( LPSECURITY_ATTRIBUTES lptthreadAttributes, //pointer ti security attributes DWORD dwstackSize, //initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress , //pointer to thread function LPVOID lpparameter, //argument for new thread DWORD dwcreationflags, //creation flags LPDWORD lpthreadId //pointer to receive thread ID ); Согласно прототипу функции CREATEThread указатель на код потока должен находится в esp+c, ставлю бряк по адресу, на который указывает указатель и брякаюсь где то в системной библиотеке. Как брякнуться именно на коде приложения? Уже облазил весь интернет и ничего не нашел, заранее спасибо всем за любую оказанную помощь! ![]() ![]() |
|
Создано: 01 августа 2007 03:40 · Личное сообщение · #2 Толи я не так считаю, толи ты.... Стоим на вызове. ESP=0012F7BCh. В стеке 0012F7BC 00000000 |pSecurity = NULL 0012F7C0 00000000 |StackSize = 0 0012F7C4 77C2A341 |ThreadFunction = msvcrt.77C2A341 ESP+8 вроде как) Да и для ломки этого крякмиса это тебе совершенно не требуется ![]() ----- Уважайте других и пишите грамотно. ![]() |
|
Создано: 01 августа 2007 03:49 · Личное сообщение · #3 |
|
Создано: 01 августа 2007 13:27 · Поправил: smex · Личное сообщение · #4 Большое спасибо что Executioner откликнулся, но ты возможно непонял немного моего вопроса. Собственно досюда 0012F7C4 77C2A341 |ThreadFunction = msvcrt.77C2A341 я добрался. Далее ставлю бряк на 77C2A341 и оказываюсь само собой в библиотеке msvcrt. А необходимо найти именно код самого потока приложения. Люди подсказали вот этот код: . text: 00401740 push есх так оно и есть, это начало кода потока. Но как они нашли эти 401740? Подскажите кто знает о возможности! PS: А насчет правки двух байт оно конечно можно, но главное не сломать защиту, а понять как она работает... ![]() |
|
Создано: 01 августа 2007 21:32 · Личное сообщение · #5 |
|
Создано: 01 августа 2007 21:39 · Личное сообщение · #6 |
|
Создано: 02 августа 2007 02:09 · Личное сообщение · #7 Прости пожалуйсто Executioner за критику, но посоветовать учитить MFC все могут (кстати щас я его пытаюсь учить), а вот не мог бы ты дать ответ на конкретно поставленный вопрос - как выйти на код потока. (я даже знаю его адрес - 00401740). Но этот адрес нашел не я, и я хочу чтоб кто нибудь объяснил как найти эту "цифру" - 00401740. Если можеш помоги пожалуйсто. Буду чрезвычайно благодарен! ![]() |
|
Создано: 02 августа 2007 12:21 · Личное сообщение · #8 Крякми из книги К.Касперски. Там же и описывается его взлом. Но, действительно возникает вопрос как выйти на процедуру потока (адрес 401740). У того же Касперски написано, что "найти рабочий код приложения в потоке будет нетрудно" :-/ Дело даже не в ломании крякми. Ломается он действительно парой байт, а в оригинале - записью в реестр. Но интересно как эти пару байт найти? ![]() |
|
Создано: 02 августа 2007 13:56 · Личное сообщение · #9 |
|
Создано: 02 августа 2007 14:23 · Личное сообщение · #10 |
|
Создано: 02 августа 2007 21:28 · Поправил: Executioner · Личное сообщение · #11 |
|
Создано: 03 августа 2007 07:38 · Личное сообщение · #12 Хм. Может я чего-то не так делаю? Ставлю бряк на CreateThread. В конечном итоге останавиваюсь здесь. 0040143B . E8 64050000 CALL <JMP.&MFC42.#2256>
В ЕСХ лежит 00365EE8 По адресу [00365EE8] лежит 402648. Пошел даже дальше. Посмотрел, что лежит по адресу [402648]. 401690. А настоящий адрес 401740 нигде не светится даже близко. Executioner пишет: Кури доки по MFC. Не угостите парочкой? ![]() |
|
Создано: 03 августа 2007 14:08 · Поправил: smex · Личное сообщение · #13 У меня все абсолтно так же как и у Sturgeon. Всю ночь разбирался с написанным, выяснял что такое C++ this. Прости пожалуйсто - но так ничего не понял. то ли я ламер полный, то ли ты не досказал немного. Если тебя не затрудник скажи пожалуйсто подробнее как найти это злополучное число. Я ставил бряк на Createthread в SoftIce однако в ecx была какая то ерунда, команда d ecx тоже не помогла. Если это тебя не затруднит объясни пожалуйсто подробнее как тебе удалось найти число. ![]() |
|
Создано: 03 августа 2007 16:27 · Личное сообщение · #14 |
|
Создано: 04 августа 2007 22:18 · Личное сообщение · #15 |
|
Создано: 04 августа 2007 23:53 · Личное сообщение · #16 Я немного не так делал, т.е. знание MFC хороше, но 004013DC - тут явно написано, что запусти файл который в аттаче и всё будет ОК ![]() ----- Само плывет в pуки только то, что не тонет. ![]() |
|
Создано: 05 августа 2007 09:00 · Личное сообщение · #17 DrFits Как его ломать вроде разобрались. И про рег файл я тут уже писал выше. Но вопрос то smex пишет: Как выйти на код второго потока в приложении?? Вот тут и сидим. Executioner рассказал как это сделать. Но вот хотелось бы поподробнее про это почитать. Про C++ this, про смещение [ecx]+05Ch, и т.д. Может ты подскажешь где про это почитать можно. ![]() |
|
Создано: 05 августа 2007 09:56 · Личное сообщение · #18 |
|
Создано: 05 августа 2007 23:32 · Поправил: smex · Личное сообщение · #19 Всем добрый вечер. За форумом следил не прерывно, но пока ниче не писал, что у меня не получается, чтоб не подумали что полный ламер, пытался читать статьи, доки и тд. Но так ничего не вышло. Обращаюсь опять в этот топик как к единственному месту где могут помочь моему горю - найти 401740, уже наизусть число выучил. Опишу свою ситуацию, чтоб добрым людям, нашедшим время мне помочь было легче: 1. Юзаю SoftIce 2. bpx CreateThread 3. прерываюсь тут: 001B: 7C81082E NOP CreateThread 001B: 7C81082F mov EDI,EDI 001B: 7C810831 mov EBP,ESP ... Состояние регистров при бряке: esp=12F7B8 ecx=325368 далее, как я писал выше, согласно здравому смыслу и передаваемым в стек параметрам функции CreateThread адрес кода потока должен находиться в esp+c, но там конечно же ничего нет. Если послушать Executioner и делать по его методу (d ecx+5C) то там 00000000h, может я что ни так делаю, кто может напишите любыми словами, хоть кратко как нада делать, я пару дней просижу но пойму... PS: командой stack обнаружил интересный адресок 401440, но его исследование тоже никчему не привело ![]() |
|
Создано: 06 августа 2007 00:30 · Личное сообщение · #20 Тут же ООП. MFC - надор классов. Вот тебе надо понять как это работает. Фактически, программа не напрямую обращается к API-функциям, а через библиотеку MFC. Тебе надо не на kernel32.CreateThread бряк ставить. Естественно, ты прирвешься внутри MFC. Надо ставить бряк на CWinThread::CreateThread, то есть на MFC42.#2256. Как я это узнал? Да в ИДУ загрузи и поищи вызов CWinThread::CreateThread. ----- Уважайте других и пишите грамотно. ![]() |
|
Создано: 06 августа 2007 08:06 · Личное сообщение · #21 Как я предполагаю, есх указывает на локальную переменную, содержащую указатель на блок данных класса. Среди них по указанному смещению (5Ch) хранится указатель на начало кода потока. Sturgeon пишет: Может ты подскажешь где про это почитать можно. Ну вообще, как ни странно, в книжках по ООП разбора реализации структур ООП я не встречал. ![]() |
|
Создано: 06 августа 2007 13:49 · Личное сообщение · #22 Ну вот, мною тоже был найден верный код потока. Спасибо всем кто принимал участие в дискуссии. Но дкмаю расставаться еще рано,тут же появляется сразу несколько дополнительных вопросов: 1. Executioner все таки не с неба же ты взял эти 5Ch, посоветуй в каком направлении мыслить чтоб понять откуда оно взялось, возможно ты знаеш какие либо доки на эту тему... 2. Насколько я знаю MFC это всего лишь оболочка над обычными WinApi функциями, то есть чтобы создать поток функция CWinThread::CreateThread вызывает функцию kernel32.CreateThread. Вот тут то и загвоздочка, так почему же нельзя по параметрам переданным в kernel32.CreateThread определить адрес потока, ведь поток создается именно функцией kernel32.CreateThread? ![]() |
|
Создано: 06 августа 2007 16:05 · Личное сообщение · #23 |
|
Создано: 06 августа 2007 16:46 · Личное сообщение · #24 |
|
Создано: 06 августа 2007 17:43 · Личное сообщение · #25 Человек, мы за тебя должны все делать? Трейси внутри MFC и в итоге выйдешь на код треда. Поставь хардварный бряк на выполнение на 401740 и запусти трассировку с заходом, стоя на CWinThread::CreateThread. P.S. Больше самостоятельности. Сначала надо самому мудохаться, и писать только тогда, когда уже ничего не помогло. ----- Уважайте других и пишите грамотно. ![]() |
|
Создано: 06 августа 2007 18:30 · Личное сообщение · #26 Вот немножко наковырял. В оле открываем окно [Thread].Запускаем приложение и видим как создается второй поток. Правой кнопкой кликаем на первом потоке Open in CPU. Попадаем в какое-то место в NTDLL. Ставим на него бряк и тут же останавливаемся на нем. Выходим по рет до кода приложения. И попадаем на 0040178F JMP SHORT CRACK0C.00401762 Это последняя инструкция в коде потока. Не Бог весть какое открытие, но чуть-чуть теплее. Пойду на crackmes.de, поищу еще что-нибудь с потоками. ![]() |
|
Создано: 06 августа 2007 19:13 · Личное сообщение · #27 Executioner пишет: А где-нибудь вообще всречал? Я - нет. Ну какое-то подобие в книге по СОМ-у, но на ознакомительном уровне =) Sturgeon пишет: Пойду на crackmes.de, поищу еще что-нибудь с потоками. Тогда уж имхо на програмерские сайты (искать "научную инфу" надо в теоретических книгах, а не в прикладных). ![]() |
|
Создано: 07 августа 2007 16:59 · Поправил: smex · Личное сообщение · #28 Так ну как опнимаю ответ по вопросу дан, остается изучать документы и внутренности ОС далее самостоятельно. Обидно конечно что так и не выяснилось откуда взялось ecx+5Ch, но с другой стороны нада и самому учиться читать доки и узнавать откуда это число. Всем спасибо за участие в дискуссиию. Думаю на этом можно тему закрывать. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Многопоточные приложения |