Авторские статьи Ломаем игры ReflexiveArcade в 6 шагов!!!!

Discussion in 'Статьи' started by aleks28, 5 Oct 2006.

  1. aleks28

    aleks28 New Member

    Joined:
    16 Sep 2006
    Messages:
    8
    Likes Received:
    1
    Reputations:
    -1
    Ломаем игры ReflexiveArcade в 6 шагов!!!!

    Те кто забрел сюда за поиском кряков - вам здесь делать нечего - для игр Reflexive куча кряков так что не ленитесь и поищите....
    А здесь будет рассмотрен способ для их ломания чисто из спортивного интереса.... (кстати я еще не встретил не одной игры этой фирмы к которой этот способ не подошел бы...)
    Просто решил поделиться.... Нашел этот способ сам...
    (если этот способ известен всем извеняйте - интернет у меня недавно ...)

    Короче вот сам способ открываем любую игру от ReflexiveArcade (я беру их на ДПК DVD их там немеряно!!! И за все плати бабки а где нам бабки эти самим то брать???), в отладчике (я пользуюсь IDA), производим поиск строки MINUTES находим строку:

    Code:
    [FONT=Courier New].data:0042D7D0                 db  59h ; Y
    .data:0042D7D1                 db  6Fh ; o
    .data:0042D7D2                 db  75h ; u
    .data:0042D7D3                 db  20h
    .data:0042D7D4                 db  68h ; h
    .data:0042D7D5                 db  61h ; a
    .data:0042D7D6                 db  76h ; v
    .data:0042D7D7                 db  65h ; e
    .data:0042D7D8                 db  20h
    .data:0042D7D9                 db  5Bh ; [
    .data:0042D7DA                 db  4Dh ; M
    .data:0042D7DB                 db  49h ; I
    .data:0042D7DC                 db  4Eh ; N
    .data:0042D7DD                 db  55h ; U
    .data:0042D7DE                 db  54h ; T
    .data:0042D7DF                 db  45h ; E
    .data:0042D7E0                 db  53h ; S
    .data:0042D7E1                 db  5Fh ; _
    .data:0042D7E2                 db  4Ch ; L
    .data:0042D7E3                 db  45h ; E
    .data:0042D7E4                 db  46h ; F
    .data:0042D7E5                 db  54h ; T
    .data:0042D7E6                 db  5Dh ; ]
    .data:0042D7E7                 db  20h
    .data:0042D7E8                 db  6Dh ; m
    .data:0042D7E9                 db  69h ; i
    .data:0042D7EA                 db  6Eh ; n
    .data:0042D7EB                 db  75h ; u
    .data:0042D7EC                 db  74h ; t
    .data:0042D7ED                 db  65h ; e
    .data:0042D7EE                 db  73h ; s
    .data:0042D7EF                 db  20h
    .data:0042D7F0                 db  6Fh ; o
    .data:0042D7F1                 db  66h ; f
    .data:0042D7F2                 db  20h
    .data:0042D7F3                 db  67h ; g
    .data:0042D7F4                 db  61h ; a
    .data:0042D7F5                 db  6Dh ; m
    .data:0042D7F6                 db  65h ; e
    .data:0042D7F7                 db  70h ; p
    .data:0042D7F8                 db  6Ch ; l
    .data:0042D7F9                 db  61h ; a
    .data:0042D7FA                 db  79h ; y
    .data:0042D7FB                 db  20h
    .data:0042D7FC                 db  72h ; r
    .data:0042D7FD                 db  65h ; e
    .data:0042D7FE                 db  6Dh ; m
    .data:0042D7FF                 db  61h ; a
    .data:0042D800                 db  69h ; i
    .data:0042D801                 db  6Eh ; n
    .data:0042D802                 db  69h ; i
    .data:0042D803                 db  6Eh ; n
    .data:0042D804                 db  67h ; g
    .data:0042D805                 db  2Eh ; .[/FONT]
    адреса могут быть разными в зависимости от игры... После завершения анализа эта строка преврашаеться в
    aYouHaveMinutes db 'You have [MINUTES_LEFT] minutes of gameplay remaining. ',0Ah
    Далее двойной клик на DATA XREF который нах. возле нашой строки (после ; тоесть переходим на то место откуда эта строка вызываеться...) и мы оказываемся на самом коде
    push offset aYouHaveMinutes ;

    Поднимаемся вверх до первого DATA XREF, кликаем дважды на него, переходим на код вызвавший нашу процедуру с выводом оставшихся минут:

    Code:
    [FONT=Courier New]loc_404CB5:                             ; CODE XREF: sub_404C3A+6Bj
    .text:00404CB5                 fld     dword ptr [esi+18h]
    .text:00404CB8                 fcomp   ds:flt_4292D0
    .text:00404CBE                 fnstsw  ax
    .text:00404CC0                 test    ah, 41h
    .text:00404CC3                 jnz     short loc_404CCC
    .text:00404CC5                 push    offset loc_42D7D0[COLOR=Red] << вызов вывода minutes (оставшихся минут игры)[/COLOR]
    .text:00404CCA                 jmp     short loc_404CD1[/FONT]

    Еще раз поднимемся вверх до первого XREF, и делаем двойной клик по нему тоесть переходим на процедуру проверки на зарегестрированность и соответсвенно потребности в выводе оставшихся минут - sub_404C3A+6B:

    Code:
    [FONT=Courier New].text:00404C9E loc_404C9E:                             ; CODE XREF: sub_404C3A+5Cj
    .text:00404C9E                 call    sub_407770[COLOR=Red] << процедура проверки на зарегестрированность[/COLOR]
    .text:00404CA3                 test    al, al
    .text:00404CA5                 jz      short loc_404CB5 [COLOR=Red]<< вот этот переход нужно занопить.. (9090)[/COLOR]
    .text:00404CA7                 mov     ecx, esi
    .text:00404CA9                 call    sub_403492
    .text:00404CAE                 push    offset loc_4045A5
    .text:00404CB3                 jmp     short loc_404CD1[/FONT]
    Нопим переход и....
    Вот и все игра запускаеться и говорит спасибо что играете в меня :).
    Конечно можно было сделать еще поумнее - изменить результат возвращаемый функцией проверки кода (которая перед test al,al) - вместо xor al,al внести mov al,1 :) Но так как мы сделали ведь легче!!! Хотя второй вариант более правильный (так как эта процедура могла быть вызвана и из другого места и там также пришлось бы нопить переход... Но в нашем случае этого делать не нужно, как и всех играх от этой компании, а их у меня не мало - 34 штуки)

    Итак еще раз - что нужно сделать:

    1 - Ищем minutes;
    2 - переход вверх (на xref);
    3 - переход вверх;
    4 - все мы на переходе который нужно занопить...
    5 - открываем winhex переходим на нужный адрес (в нашем случае это 4CA5 .text:00404CA5-ImageBase)
    6 - нопим переход 9090 (Занопить переход означает заменить команду jXX на nop, так как команды переходов имеют разную длину то в зависимости от этой длины нужно заменять ее на несколько команд nop... Например в нашем случае команда jz short loc_404CB5 имеет опкод 74 OE и занимает 2 байта, а вот команда nop имеет опкод 90 и занимает один байт поэтому нужно команду jz заменять на 9090 тоесть 2 команды nop... Фуххх рассказал... :) )

    Всем спасибо - не судите строго...


    Ну и как обычно:

    ВСЯ ПРЕДСТАВЛЕННАЯ ЗДЕСЬ ИНФОРМАЦИЯ ИСПОЛЬЗУЕТЬСЯ ВАМИ НА ВАШ СТРАХ И РИСК... Я НЕ ЗАСТАВЛЯЮ ЕЮ КОГО ТО ПОЛЬЗОВАТЬСЯ А ЛИШЬ ХОЧУ УКАЗАТЬ РАЗРАБОТЧИКАМ НА НЕСОВЕРШЕНСТВО ЗАЩИТЫ ИХ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
     
    #1 aleks28, 5 Oct 2006
    Last edited: 7 Oct 2006
    1 person likes this.