Вопрос по взлому проги с триалом в реестре.

Тема в разделе "WASM.RESEARCH", создана пользователем SergeySergeev, 14 окт 2004.

  1. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Добрый день.



    Есть у меня одна програмка, она работает только 20 дней а потом

    требует купить ее. После покупки присылается ключ в реестр и программа

    его видя работает нормально. (при каждой переустановке ключ нужен

    другой, так как прога генерит новый контрольный номер)



    Я нашел ключ в реестре который используется для определения времени

    использования программы. Один раз в 20-ть дней приходится его стирать,

    чтобы программа снова его туда записала и я мог работать еще 20 дней.

    Если честно надоело и я решил заглянуть ей внутрь. Но так как опыта

    нет, то прошу помощи в следующих вопросах.



    Я посмотрел, там используются функции RegQueryValue, RegDeleteKey,

    RegCloseKey и другие для работы с реестром.



    Посоветуйте как говорится с какого конца подойти. Я в SoftIce ставил

    точку на RegQueryValue но там дальше столько всего что жуть. Может

    дадите какие то советы, как по другому можно решить проблему или где

    почитать об этом деле.



    Как вообще решаются подобные вопросы?



    Надеюсь на помощь.



    С уважением, Сергей.
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Ой-ее...

    Сразу так не ответишь...

    Вопросы к тебе: ассемблер знаешь? На каком языке написана программа определить можешь?

    Если ответы на эти вопросы положительны - тогда методика в твоем случае пусть выглядит так.

    1) Найди строковое значение ключа (сам путь к нему) в теле программы

    2) Пошастай по коду поблизости этого места

    3) Отломай там все, что движется и дышит :)
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    Ну дык самое простое решение (но не самое дзенное): напиши прогу (даже скрипт) которая будет это делать за тебя, и поставь в autorun / планировщик :)
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > Как вообще решаются подобные вопросы?



    Можно, например, loader написать, что-то типа такого:
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6.  
    7. section '.data' data readable writeable
    8.  
    9. szRegSubKey    db  "SOFTWARE\ASProtect\SpecData",0
    10. szFileName     db  "Bla.exe",0
    11. align 4
    12. StartupInfo    STARTUPINFO
    13. align 4
    14. ProcessInfo    PROCESSINFO
    15.  
    16.  
    17. section '.code' code readable executable
    18.  
    19. align 4
    20. start:
    21.     invoke RegDeleteKey, HKEY_CURRENT_USER, szRegSubKey
    22.     mov [StartupInfo.cb], sizeof.STARTUPINFO
    23.     invoke CreateProcess, szFileName, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,\
    24.                           NULL, NULL, StartupInfo, ProcessInfo
    25.     test eax, eax
    26.     jz @exit
    27.     invoke CloseHandle, [ProcessInfo.hThread]
    28.     invoke CloseHandle, [ProcessInfo.hProcess]
    29. @exit:
    30.     invoke ExitProcess, 0
    31.  
    32.  
    33. section '.idata' import data readable
    34.  
    35. library kernel32,'KERNEL32.DLL',\
    36.         advapi32,'ADVAPI32.DLL'
    37.  
    38. include '%fasminc%\APIA\KERNEL32.INC'
    39. include '%fasminc%\APIA\ADVAPI32.INC'
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    У меня тоже такой алгоритм был: если ключа нет, dll создаёт новый и считает, что это первый запуск, отсчёт начинается заново. Патчил следующее: Место, где прога открывает ключ RegOpenKey (или что там у тебя). После вызова API проверялось, что находится в еах. Если не ноль - то это хэндл ключа, ключ существует, если ноль - ключа нет. И от этой проверки прога ветвится, соответственно либо на считывание ключа, либо на создание. Код сразу после Call RegOpenKey

    test eax,eax

    jz <адрес процедуры создания ключа>



    изменил на

    test eax,eax

    jmp <адрес процедуры создания ключа>



    И теперь dll при каждой загрузке сама по новой создаёт ключ(уже существующий), независимо от того есть он в реестре или нет, и считает, что только что инсталлирована. И о 15 днях я забыл :)
     
  6. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Спасибо мужики, я покопаюсь и напишу чего получилось.



    To cresta>> я именно так и хочу чтобы она по любому ключ создавала. Тогда мне пофигу будет где он и что он этот триал.



    Остальные способы тоже попробую. Я вообще начинающий, но надеюсь терпение и труд - все перетрут!



    Еще раз спасибо.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Немного поправлюсь: RegOpenKey в eax возвращает 0, если ключ был открыт и ненулевое значение (код ошибки), если была ошибка(в т.ч. ключа нет)



    Если в твоем коде для чтения используется RegCreateKeyEx, то возможно будет проверка на значение последнего её параметра lpdwDisposition. Этот параметр может быть заполнен функцией как REG_CREATED_NEW_KEY или REG_OPENED_EXISTING_KEY. И проверка может быть по значению, которое в lpdwDisposition.
     
  8. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    SergeySergeev

    Ты занешь, основная масса плохо защищенных программ сводится к одному условному переходу ;) (н-р Тhe Бат старый) Только надо его найти. У меня была прога, работала 30 дней, потом при запуске работала 5 мин. и закрыалась. Лопатил я её долго, хитрая зараза была :) Потом нашел процедуру, которую она постоянно вызывала из разных мест и пропатчил. Написал просто
    Код (Text):
    1.  
    2.    mov eax, TRUE
    3.    jmp Return
    4.  


    Вопрос о триальности выпал сам собой :)))

    Удачи в этом деле (он тебе пригодиться)
     
  9. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Ну что ж господа! Мне даже понравилось. Однако пока без результата.



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

    Она проверяет свой триальный ключ в реестре /он в CLSID/ и проверяет есть ли купленый ключ, который расположен в HKEY_CURRENT_USER\SOFTWARE.



    Теперь о поиске в самой програме.



    Я устанавливал бряки на RegQueryValue - их всего 14 штук, однако перенаправление условного перехода ничего не дало.



    Далее RegOpenKey их вообще больше 200 штук. То же самое. После каждого вызова этой функции идет:



    OR DX,AX

    JZ ....



    либо



    OR DX,AX

    JNZ ....



    при этом в EAX и EDX как правило или 0 (в основном) или что то мутное, но ни разу после вызова этой функции eax не равен 1.

    Как же все таки разобрать что искать, как сузить блин круг подозреваемых, так сказать.



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



    Будем искать так сказать, если есть какие то мысли буду рад выслушать, может чего не так понял.



    Сергей
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Прежде всего посмотри, не ASProtect ли это. Возможно, за тебя уже обо всем партия подумала :)
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    SergeySergeev



    Вот это, кстати:

    http://cracklab.ru/f/index.php?action=vthread&forum=1&topic=638



    признак плохого тона. Нельзя постить один и тот же пост на двух форумах одновременно. Наказывается вплоть до бана. Я понятно объясняю?
     
  12. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Извините, но первый раз встречаюсь с такими правилами, постараюсь не нарушать если так принято.



    Другие посты постараюсь закрыть как можно быстрее.



    С уважением, Сергей.
     
  13. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Я нашел ключ при помощи RTKF он выдал:



    ; Описание ключа: ASProtect < 1.23



    В этом случае есть какой то алгоритм поиска?

    (кстати у меня есть два реальных ключа этой проги (достались от владельца для рассмотрения), то есть есть индивидуальный номер который генерит программа и сам ключ который вставляется в реестр - если защита ASP это как то помогает?



    Сергей.
     
  14. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Так таки аспротект? Для него есть специальный удалитель ключиков - лежит в инструментах на сайте + программа Киберманьяка - лежит на его сайте.
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ты не разбрасывайся, не надо метаться из стороны в сторону :) Если имеешь такие условия: Удаляем ключ - прога работает, то ищи где открывается именно этот ключ. Если знаешь имя ключа - на бряках смотри, какой ключ открывается каждым конкретным вызовом (см. параметры передаваемые в ф-цию). Попробуй определить, откуда вызывается RegCreateKey. После удаления ключа прога обязана вызвать эту ф-цию. Можно попробовать отмотать обратно от неё.



    Вряд ли это AsProtect. Если удалить его ключи, они не появляются вновь (если память не изменяет), иначе, какой же это удалитель ключиков?
     
  16. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Вот еще вопросик появился.



    Открыл файл в W32Dasm и нашел код



    test eax, eax (как мне кажется то что нужно - их там всего два с переходом - этот в самом конце файла)



    ну и дальше как положен переход



    jbe <адрес>



    Я поменял эту команду на



    jmp <адрес>



    Но файл не запускается пишет: Неправильная контрольная сумма файла.

    Если можно в двух словах объясните что есть это и может стоит заменить jmp другой командой, хотя по моему во всех статьях что я читал меняют на jmp спокойно и никаких проблем.



    Надеюсь на ответ.



    С ув. Сергей
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    SergeySergeev







    Это если нет проверки на целостность файла (например, CRC). Судя по сообщению о неправильной контрольной сумме, в файле есть процедура, подсчитывающая контрольную сумму (CRC) файла, либо каких-то кусков кода. Изменил jbe на jmp - контрольная сумма уже не та, надо либо править контрольную сумму, либо искать процедуру подсчёта CRC и отключать её. Чтобы сумма совпадала без переделок, заменить jmp можно только на jbe :)
     
  18. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Как говорится я так и думал :-(



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



    Извините, если вопросы чайниковские, но уже закипаю потихоньку :)



    Сергей
     
  19. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Расчет CRC16, но это используется в накопителях FDD
    Код (Text):
    1.  
    2. // Функция вычисляет и возвращает циклический код для
    3. // последовательности из len байтов, указанной *msg.
    4. // Используется порождающий полином:
    5. // (X в степени 16)+(X в степени 12)+(X в степени 5)+1.
    6. // Полиному соответствует битовая маска 0x1021.
    7. //
    8. int CRCode (char *msg, int len)
    9. {
    10. int crc,j;
    11. crc = 0;
    12. while ( len-- > 0 )
    13. {
    14. crc = crc ^ (int) *msg++ << 8;
    15. for ( j=0; j < 8; j++ )
    16. {
    17. if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;
    18. else crc <<= 1;
    19. }
    20. }
    21. return crc;
    22. }
    23.  


    Как видишь просто так CRC не подобрать, надо искать место где идет его расчет и отключать ;)))))) В этом случае проще в SoftICE поставить бряк на MessageBoxA

    P.S. Я тебе не зря пожелал удачи в этом деле...
     
  20. SergeySergeev

    SergeySergeev New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    11
    Адрес:
    Russia
    Да уж, удача это важная вещь в этом деле.

    Буду искать...



    Спасибо.