Перезапуск перед проверкой серийника-зачем?

Тема в разделе "WASM.RESEARCH", создана пользователем griniland, 13 мар 2005.

  1. griniland

    griniland New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2005
    Сообщения:
    3
    Итак, есть препарант- UltraEdit32 v11 (да знаю, знаю- сломана уже наверное, просто интересно). После ввода серийника без всяких там проверок (явных) и MessageBox'ов- просят перезапустить программу. Естественно, после перезапуска программы появляется наг с тем, что жить осталось 45 дней...

    Отсюда вопрос: как вообще прога "запоминает", что она зарегистрированна? (мои варианты: пишет себе в тело (реально?), пишет в свой DLL, пишет в реестр, вообще в какой-нить "левый" файл, типа не она это;). Вопрос относится вообще ко всему софту, в котором процедура регистрации проверяется один раз..

    Перед этим сломал фиговину, которая при каждом запуске читала из своего лицензионного файла- там всё ясно.

    Ещё вопрос: как перешибить гадость? Bpx ShowWindow даёт просто тучу срабатываний, и не поймешь, какое..
     
  2. Funbit

    Funbit Member

    Публикаций:
    0
    Регистрация:
    13 апр 2003
    Сообщения:
    92
    Адрес:
    Russia
    griniland

    Делают так обычно для того, чтобы вроде как спрятать проверку.

    Толку мало конечно, но вот, видимо, судя по топику, все же есть =)

    После ввода следи за серийником, куда-то он должен

    сохраниться, или в реестр, или в файл, не знаю.

    Поставь BPM на адрес с серийником.

    Ну а после перезапуска, соответственно, следи за его чтением.



    Можешь мониторы запустить, RegMon, FileMon, глядишь узреешь что-нибудь подозрительное



    А на ShowWindow bpx ставить бесполезное дело.
     
  3. griniland

    griniland New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2005
    Сообщения:
    3
    Спасибо, попробую.. Я вот ещё о чем подумал:

    а может она всё-таки делает проверку сразу, только не афиширует это. С введенным кодом тоже не всё так гладко: всякие GetWindowText и GetDlgText срабатывают постоянно, причем вообще даже тогда, когда на экране нет ни каких окошек с полями ввода=).

    Во, ещё вопрос: пытался поставить bmsg на кнопку..Как это сделать? Читал много чего- а толку..

    Делаю Hwnd <имя_приложения>

    получаю кучу hwnd, относящихся к нему.

    Нахожу там button

    И что дальше?

    при Bmsg hwnd=hwnd(button) он не дает дописать ни одного сообщения, зато постоянно вылетает по этому бряку.

    Прикол в том, что когда пытаюсь задать даже сработавшие сообщения- пишет- Invalid window handle
     
  4. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    getWindowText срабатывают потому что прога написана с применением MFC или VCL. А там такая практика в порядке вещей. Тебе вроде стоит узнать, откуда узнает что она не зарегена из файла или реестра.Дальше в дизассемблере смотреть ссылки на отнсящиеся функции. Хотя думаю, это не лучший вариант. Кстати, ламать проги в дизассемблере сравнительно легче (IMHO), чем в отладчике.
     
  5. Dart_Bobr

    Dart_Bobr New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    100
    Адрес:
    Ukraine
    griniland

    Еще может быть слайсовая защита. Типа, записываем в остаток сегмента, после конца файла всю необходимую инфу. :)
     
  6. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    насколько я знаю - там армадило был раньше. А перезапуск в 90% означает присутствие пакеров аспр или арма. ибо они при запуске чекают серийник и если ок то расшифровывают куски проги etc.
     
  7. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    ага... именно армой он и зашит...
     
  8. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia


    раньше. сейчас нет. UE и так не самый шустый, а с диллой так вообще тормозной стал, так вот пользователи и надавили на производиля проги ;)

    редкий лучай, когда автор программы пошёл на поводу у пользователей в том, что касается защиты программы ;) хотя тут дело касалось скорее производительности, а не защиты.

    короче, на данный момент (версия 11) UltraEdit ничем не запакован





    да ладно! ты хочешь сказать, что лишь 10% прог, не защищёных аспром или диллой требуют перезапуска для проверки серийника?

    ты почитай рекомендации западным шароварщикам:

    им твердят, что серийник лучше проверять

    - при запуске

    - перед важной функцией в программе

    при вводе серийника проверять лишь основные характеристики типа длины etc



    регистрационный метод UE не менялся с очень давних времён:

    вводишь серийник, прога генерит рег-файл (он же ключ, uedit32.reg), требует перезапуска и лишь при следующей загрузке чекает файл

    при чём при плохом раскладе (лажовый ключик) она удаляет рег-файл



    следовательно, отлавливать нужно не GetWindowText и иже с ним, а ReadFile, проверяя кол-во прочитанных байт (см. размер uedit32.reg), раньше было 256 байт, в последней версии 260.



    чтобы отловить удаление рег-файла ставишь бряк на DeleteFileA

    UE к тому же перед удалением ставит ему аттрибут Normal на тот случай, если ты такой хитрый и поставил ему Read Only, следовательно, можно смотреть SetFileAttributesA, а за ним должен следовать DeleteFileA



    дальше понятно: смотришь, что же вызывает этот кусок кода с DeleteFile и там можешь смотреть процедуру проверки ключика и либо патчить, либо кейгенить



    для версии UtraEdit-32 11.0:



    файл: uedit32.exe

    размер: 2.91 МБ (3 055 616 байт)



    ставим бряк на SetFileAttributesA


    Код (Text):
    1.  
    2. 00444396  |.  8D85 ECFDFFFF lea     eax, [local.133]
    3. 0044439C  |.  56            push    esi                                                    ; /BufSize = 104 (260.)
    4. 0044439D  |.  50            push    eax                                                    ; |PathBuffer = 0012F02C
    5. 0044439E  |.  6A 00         push    0                                                      ; |hModule = NULL
    6. 004443A0  |.  FF15 C8C45600 call    near dword ptr ds:[<&KERNEL32.GetModuleFileNameA>]     ; \GetModuleFileNameA
    7. 004443A6  |.  8D85 ECFDFFFF lea     eax, [local.133]
    8. 004443AC  |.  6A 5C         push    5C
    9. 004443AE  |.  50            push    eax                                                    ; /Arg1 = 0012F02C ASCII "C:\Program Files\UltraEdit\uedit32.reg"
    10. 004443AF  |.  E8 074A0D00   call    uedit32.00518DBB                                       ; \uedit32.00518DBB
    11. 004443B4  |.  59            pop     ecx                                                    ;  0012F02C
    12. 004443B5  |.  85C0          test    eax, eax
    13. 004443B7  |.  59            pop     ecx                                                    ;  0012F02C
    14. 004443B8  |.  0F84 02010000 je      uedit32.004444C0
    15. 004443BE  |.  8060 01 00    and     byte ptr ds:[eax+1], 0
    16. 004443C2  |.  FF35 40285700 push    dword ptr ds:[572840]                                  ;  uedit32.005AF9AC
    17. 004443C8  |.  8D85 ECFDFFFF lea     eax, [local.133]
    18. 004443CE  |.  50            push    eax
    19. 004443CF  |.  E8 CC4E0D00   call    uedit32.005192A0
    20. 004443D4  |.  59            pop     ecx                                                    ;  0012F02C
    21. 004443D5  |.  59            pop     ecx                                                    ;  0012F02C
    22. 004443D6  |>  8B3D ECC35600 mov     edi, dword ptr ds:[<&KERNEL32.SetFileAttributesA>]     ;  kernel32.SetFileAttributesA
    23. 004443DC  |.  8D85 ECFDFFFF lea     eax, [local.133]
    24. 004443E2  |.  68 80000000   push    80                                                     ; /FileAttributes = NORMAL
    25. 004443E7  |.  50            push    eax                                                    ; |FileName = "C:\Program Files\UltraEdit\uedit32.reg"
    26. 004443E8  |.  FFD7          call    near edi                                               ; \SetFileAttributesA
    27.  




    как видно, BufSize = 104 (260.), как раз размер нашего uedit32.reg



    далее по адресу 00444479 получаем адрес расшифрованного куска рег-файла


    Код (Text):
    1.  
    2. 00444479  |.  8D85 F4FEFFFF     lea     eax, [local.67]
    3. 0044447F  |.  6A 17             push    17
    4. 00444481  |.  50                push    eax
    5. 00444482  |.  56                push    esi
    6. 00444483  |.  E8 B2810D00       call    uedit32.0051C63A
    7. 00444488  |.  8066 17 00        and     byte ptr ds:[esi+17], 0          ; |
    8. 0044448C  |.  FF35 3C285700     push    dword ptr ds:[57283C]            ; |Arg2 = 005AF9B8 ASCII "h4x0r"
    9. 00444492  |.  8D85 F4FEFFFF     lea     eax, [local.67]                  ; |
    10. 00444498  |.  50                push    eax                              ; |Arg1 = 0012F134 ASCII "I1V40-X0R7I-S401B-E304J1337Jupiterh4x0rI1V40-X0R7I-S401B-E304JJupiter "
    11. 00444499  |.  E8 F0730D00       call    uedit32.0051B88E                 ; \uedit32.0051B88E
    12. 0044449E  |.  83C4 14           add     esp, 14
    13. 004444A1  |.  85C0              test    eax, eax
    14. 004444A3  |.  74 1B             je      short uedit32.004444C0
    15.  




    дальше нужно покопать процедуру проверки.