Сейчас на форуме: vsv1, _MBK_ (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Многопоточные приложения
Посл.ответ Сообщение

Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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, ставлю бряк по адресу, на который указывает указатель и брякаюсь где то в системной библиотеке. Как брякнуться именно на коде приложения?
Уже облазил весь интернет и ничего не нашел, заранее спасибо всем за любую оказанную помощь!

1bc9_31.07.2007_CRACKLAB.rU.tgz - CRACK0C.EXE




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 03:40
· Личное сообщение · #2

Толи я не так считаю, толи ты....
Стоим на вызове. ESP=0012F7BCh. В стеке

0012F7BC 00000000 |pSecurity = NULL
0012F7C0 00000000 |StackSize = 0
0012F7C4 77C2A341 |ThreadFunction = msvcrt.77C2A341

ESP+8 вроде как)
Да и для ломки этого крякмиса это тебе совершенно не требуется

-----
Уважайте других и пишите грамотно.





Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 03:49
· Личное сообщение · #3

Кстати, надо пропатчить два байта

-----
Уважайте других и пишите грамотно.




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 01 августа 2007 13:27 · Поправил: smex
· Личное сообщение · #4

Большое спасибо что Executioner откликнулся, но ты возможно непонял немного моего вопроса. Собственно досюда 0012F7C4 77C2A341 |ThreadFunction = msvcrt.77C2A341 я добрался. Далее ставлю бряк на 77C2A341 и оказываюсь само собой в библиотеке msvcrt.
А необходимо найти именно код самого потока приложения. Люди подсказали вот этот код:
. text: 00401740 push есх
так оно и есть, это начало кода потока. Но как они нашли эти 401740? Подскажите кто знает о возможности!

PS: А насчет правки двух байт оно конечно можно, но главное не сломать защиту, а понять как она работает...




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 21:32
· Личное сообщение · #5

Там нет ничего непонятного. Самый элементарный крякмис на си.... Там нечего понимать.

-----
Уважайте других и пишите грамотно.





Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 21:39
· Личное сообщение · #6

Кури доки по MFC. В частности по функции CWinThread::CreateThread

-----
Уважайте других и пишите грамотно.




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 02 августа 2007 02:09
· Личное сообщение · #7

Прости пожалуйсто Executioner за критику, но посоветовать учитить MFC все могут (кстати щас я его пытаюсь учить), а вот не мог бы ты дать ответ на конкретно поставленный вопрос - как выйти на код потока. (я даже знаю его адрес - 00401740). Но этот адрес нашел не я, и я хочу чтоб кто нибудь объяснил как найти эту "цифру" - 00401740. Если можеш помоги пожалуйсто. Буду чрезвычайно благодарен!



Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 02 августа 2007 12:21
· Личное сообщение · #8

Крякми из книги К.Касперски.
Там же и описывается его взлом.
Но, действительно возникает вопрос как выйти на процедуру потока (адрес 401740). У того же Касперски написано, что "найти рабочий код приложения в потоке будет нетрудно" :-/
Дело даже не в ломании крякми. Ломается он действительно парой байт, а в оригинале - записью в реестр.
Но интересно как эти пару байт найти?




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 02 августа 2007 13:56
· Личное сообщение · #9

Найти байты для патчинга просто. Достаточно поискать вызовы функции AfxMessageBox (MFC42.#1200).
Можно обойтись патчем одного байта. Так же посмотри референсы на строки. Быстро найдешь код потока.

-----
Уважайте других и пишите грамотно.




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 02 августа 2007 14:23
· Личное сообщение · #10

Ну а предположим что в программе строки зашифрованы, т.е. ссылки настроки ничего не дают. В таком случае есть ли какой нибудь способ найти эту 401740. Возможно существует какой либо метод найти код потока в приложении?




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 02 августа 2007 21:28 · Поправил: Executioner
· Личное сообщение · #11

Стоим на вызове CWinThread::CreateThread. Смотрим в ECX. Там указатель на C++ this. Переходим по адресу, на который указывает этот указатель - там адрес первой инструкции треда. То есть, фактичеси нам надо dword ptr [dword ptr [ecx]]

-----
Уважайте других и пишите грамотно.




Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 03 августа 2007 07:38
· Личное сообщение · #12

Хм. Может я чего-то не так делаю?
Ставлю бряк на CreateThread. В конечном итоге останавиваюсь здесь.
0040143B . E8 64050000 CALL <JMP.&MFC42.#2256>

В ЕСХ лежит 00365EE8
По адресу [00365EE8] лежит 402648.
Пошел даже дальше. Посмотрел, что лежит по адресу [402648]. 401690.
А настоящий адрес 401740 нигде не светится даже близко.

Executioner пишет:
Кури доки по MFC.

Не угостите парочкой?



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 03 августа 2007 14:08 · Поправил: smex
· Личное сообщение · #13

У меня все абсолтно так же как и у Sturgeon.
Всю ночь разбирался с написанным, выяснял что такое C++ this. Прости пожалуйсто - но так ничего не понял. то ли я ламер полный, то ли ты не досказал немного. Если тебя не затрудник скажи пожалуйсто подробнее как найти это злополучное число. Я ставил бряк на Createthread в SoftIce однако в ecx была какая то ерунда, команда d ecx тоже не помогла. Если это тебя не затруднит объясни пожалуйсто подробнее как тебе удалось найти число.




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 03 августа 2007 16:27
· Личное сообщение · #14

Забыл о смещении в 0C5h. Извините за неточность.
[ecx]+05Ch
Тут будет лежать адрес первой инструкции потока.

-----
Уважайте других и пишите грамотно.




Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 04 августа 2007 22:18
· Личное сообщение · #15

Executioner пишет:
[ecx]+05Ch

Теперь получилось.
А откуда можно взять такую информацию? В смысле, где покурить доков по MFC. В частности по Createthread.



Ранг: 200.3 (наставник)
Активность: 0.090
Статус: Участник

Создано: 04 августа 2007 23:53
· Личное сообщение · #16

Я немного не так делал, т.е. знание MFC хороше, но 004013DC - тут явно написано, что запусти файл который в аттаче и всё будет ОК

919f_04.08.2007_CRACKLAB.rU.tgz - CRACK0C_reg.reg

-----
Само плывет в pуки только то, что не тонет.




Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 05 августа 2007 09:00
· Личное сообщение · #17

DrFits
Как его ломать вроде разобрались. И про рег файл я тут уже писал выше.
Но вопрос то smex пишет:
Как выйти на код второго потока в приложении??

Вот тут и сидим. Executioner рассказал как это сделать. Но вот хотелось бы поподробнее про это почитать. Про C++ this, про смещение [ecx]+05Ch, и т.д.
Может ты подскажешь где про это почитать можно.




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 05 августа 2007 09:56
· Личное сообщение · #18

Sturgeon пишет:
Может ты подскажешь где про это почитать можно.

Тут больше надо знать об ООП, чем о MFC. Надо четко представлять что такие объект, класс, члены и знать, как они располагаются в памяти, что на что указывает.

-----
Уважайте других и пишите грамотно.




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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, но его исследование тоже никчему не привело




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 06 августа 2007 00:30
· Личное сообщение · #20

Тут же ООП. MFC - надор классов. Вот тебе надо понять как это работает. Фактически, программа не напрямую обращается к API-функциям, а через библиотеку MFC. Тебе надо не на kernel32.CreateThread бряк ставить. Естественно, ты прирвешься внутри MFC. Надо ставить бряк на CWinThread::CreateThread, то есть на MFC42.#2256. Как я это узнал? Да в ИДУ загрузи и поищи вызов CWinThread::CreateThread.

-----
Уважайте других и пишите грамотно.





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

Создано: 06 августа 2007 08:06
· Личное сообщение · #21

Как я предполагаю, есх указывает на локальную переменную, содержащую указатель на блок данных класса. Среди них по указанному смещению (5Ch) хранится указатель на начало кода потока.

Sturgeon пишет:
Может ты подскажешь где про это почитать можно.

Ну вообще, как ни странно, в книжках по ООП разбора реализации структур ООП я не встречал.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 06 августа 2007 13:49
· Личное сообщение · #22

Ну вот, мною тоже был найден верный код потока. Спасибо всем кто принимал участие в дискуссии. Но дкмаю расставаться еще рано,тут же появляется сразу несколько дополнительных вопросов:
1. Executioner все таки не с неба же ты взял эти 5Ch, посоветуй в каком направлении мыслить чтоб понять откуда оно взялось, возможно ты знаеш какие либо доки на эту тему...
2. Насколько я знаю MFC это всего лишь оболочка над обычными WinApi функциями, то есть чтобы создать поток функция CWinThread::CreateThread вызывает функцию kernel32.CreateThread. Вот тут то и загвоздочка, так почему же нельзя по параметрам переданным в kernel32.CreateThread определить адрес потока, ведь поток создается именно функцией kernel32.CreateThread?




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 06 августа 2007 16:05
· Личное сообщение · #23

Ты сам ответил на свой вопрос. MFC - оболочка. И тред создается внутри оболочки, а потом оттуда вызывается сама функция программы.
HoBleen
А где-нибудь вообще всречал? Я - нет.

-----
Уважайте других и пишите грамотно.




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 06 августа 2007 16:46
· Личное сообщение · #24

Блин, но раз MFC это оболочка, то следовательно если поставить бряк на функцию которая и создает этот поток - kernel32.CreateThread можно попасть на эти же 401740 или я не в ту сторону мыслю?




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 06 августа 2007 17:43
· Личное сообщение · #25

Человек, мы за тебя должны все делать? Трейси внутри MFC и в итоге выйдешь на код треда. Поставь хардварный бряк на выполнение на 401740 и запусти трассировку с заходом, стоя на CWinThread::CreateThread.
P.S. Больше самостоятельности. Сначала надо самому мудохаться, и писать только тогда, когда уже ничего не помогло.

-----
Уважайте других и пишите грамотно.




Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 06 августа 2007 18:30
· Личное сообщение · #26

Вот немножко наковырял.
В оле открываем окно [Thread].Запускаем приложение и видим как создается второй поток. Правой кнопкой кликаем на первом потоке Open in CPU. Попадаем в какое-то место в NTDLL. Ставим на него бряк и тут же останавливаемся на нем. Выходим по рет до кода приложения. И попадаем на
0040178F JMP SHORT CRACK0C.00401762
Это последняя инструкция в коде потока.
Не Бог весть какое открытие, но чуть-чуть теплее.
Пойду на crackmes.de, поищу еще что-нибудь с потоками.




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

Создано: 06 августа 2007 19:13
· Личное сообщение · #27

Executioner пишет:
А где-нибудь вообще всречал? Я - нет.

Ну какое-то подобие в книге по СОМ-у, но на ознакомительном уровне =)

Sturgeon пишет:
Пойду на crackmes.de, поищу еще что-нибудь с потоками.

Тогда уж имхо на програмерские сайты (искать "научную инфу" надо в теоретических книгах, а не в прикладных).



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 07 августа 2007 16:59 · Поправил: smex
· Личное сообщение · #28

Так ну как опнимаю ответ по вопросу дан, остается изучать документы и внутренности ОС далее самостоятельно. Обидно конечно что так и не выяснилось откуда взялось ecx+5Ch, но с другой стороны нада и самому учиться читать доки и узнавать откуда это число. Всем спасибо за участие в дискуссиию. Думаю на этом можно тему закрывать.


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


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