![]() |
eXeL@B —› Основной форум —› Взлом прог под Симбиан |
<< 1 ... 18 . 19 . 20 . 21 . >> |
Посл.ответ | Сообщение |
|
Создано: 10 августа 2006 22:20 · Поправил: newborn · Личное сообщение · #1 |
|
Создано: 27 февраля 2010 23:14 · Личное сообщение · #2 |
|
Создано: 28 февраля 2010 01:28 · Поправил: TolyaN3z · Личное сообщение · #3 [wl] Не могу, вот именно из-за проверки целостности ничего вообще изменить не могу. Если изменяю хотя бы бит - прога запускается, получает нужный IMEI и даже работает некоторое время, но потом сваливается по какой-то неопределённой закономерности. Причём, я не понимаю, зачем давать проге запуститься, если узнать о модификации можно при запуске? Хотя, тогда было бы проще найти место проверки. Западло ещё и в том, что для лицензирования используется криптография - просто так не откейгенишь. ![]() |
|
Создано: 28 февраля 2010 16:47 · Личное сообщение · #4 |
|
Создано: 01 марта 2010 14:21 · Поправил: TolyaN3z · Личное сообщение · #5 Честно говоря, я даже как-то эту возможность исключил - пробовал сразу же после запуска менять ломанный и оригинал местами. В итоге получил такую картину: Запускаю оригинал - работает, подменяю .app - работает, но через некоторое время вылетает Запускаю правленый - работает, но вылетает, подменяю .app - всё-равно через некоторое время вылетает Перебрал RFile::Open, всего 5 штук. Если смотреть по окружаещему коду, то следов проверки не видно. В самой проге явно не упоминается об .app файле, поэтому начал перебирать, откуда она может узнать о себе. Нашёл у неё импорт CQikApplication::AppFullName(), он является методом одного из классов, объект которого инициализируется один раз - при запуске программы, после чего запихивается в регистр. Дальше проследить за вызовом этого метода не знаю как, слишком много попутного кода. Такое ощущение, что я уже просто запутался - никогда не мог бы подумать, что в этой проге есть такой коварный механизм. В общем, без файла на руках сложно наверное что-то сказать. Выкладываю сабж, если кто поможет хоть чем-нибудь, буду очень признателен h__p://rapidsha re.com/files/357408598/confuse.rar Пример лицензии, под которую всё делается, могу отправить в личку. Пробовал брать её с Handango - деньги ушли, а в замен ничего не пришло. В тех. поддержке отписались, что уже не поддерживают этот продукт, а на Handango он размещён "по ошибке". Деньги так и не вернули. Свинство вообще. ![]() |
|
Создано: 01 марта 2010 21:56 · Поправил: shustrik · Личное сообщение · #6 |
|
Создано: 01 марта 2010 21:57 · Поправил: [wl] · Личное сообщение · #7 ну так, если не ошибаюсь, то первый же вызов RFile::Open как раз и вызывается CQikApplication::AppFullName() .text:10003F38 BL CEikAppUi::Application(void) .text:10003F3C MOV R1, R0 .text:10003F40 LDR R3, [R1] .text:10003F44 ADD R4, SP, #0x224+var_21C .text:10003F48 MOV R0, R4 .text:10003F4C LDR R12, [R3,#0x20] ; <<<<<<------------ AppFullName() .text:10003F50 MOV LR, PC .text:10003F54 BX R12 Итого, перед вызовом BX R12, у нас в R0 находится TFileName&, а в R1 - указатель на Application. Лучше всего подменить имя файла в длл PLPVARIANT, то есть заменить BX R12 на BL PlpVariant::GetMachineIdL(TBuf<128> &) но нужно как-то различить, где эту функцию вызывает программа, а где мы. Лучший способ - записать в R1 какой-то магического значение, например 0xDEADC0DE, а из длл уже смотреть, если R1 не равен этому значению, значит вызывает функцию сама программа, и подставлять фальшивый IMEI, а иначе скопировать имя оригинального файла что-то типа: EXPORT_C TInt fakeGetMAchineIdL(TBuf<128> & imei, TInt magic) { if(magic == 0xDEADCODE) { imei.Copy(_L("c:\fake.app")); } else { imei.Copy(_L("12345446456456456456")); } } записать в R1 значение 0xDEADCODE можно, выкинув нафиг код по получению адреса функции App::AppFullName();. Если не получается, то можно что-то покороче, типа 0x1234 надеюсь объяснил не слишком путано? ![]() |
|
Создано: 01 марта 2010 21:57 · Поправил: [wl] · Личное сообщение · #8 |
|
Создано: 01 марта 2010 22:04 · Поправил: shustrik · Личное сообщение · #9 B - это хорошо, а как это в хексе выглядет? как его высчитывать? К примеру BGE loc_1000CD9C - это в хексе 0D0000AA (меняется последние две буквы...)... как высчитывается какие именно вбивать? Then briefly this is the situation.. original ASM: BEQ loc_10021410 original bytecode: 07 00 00 0A original binary: |0... ...32| |----signed 24 offset----|cond|-B-|L| |000001110000000000000000|0000|101|0| Also this time it's enough to change the cond value to 1100 new binary: |0... ...32| |----signed 24 offset----|cond|-B-|L| |000001110000000000000000|1110|101|0| new bytecode: 07 00 00 EA the patch number 2 becomes the following: ASM old: BEQ loc_10021410 new: B loc_10021410 bytecode: old: 07 00 00 0A new: 07 00 00 EA А как в моем случае? или подскажите как вычисляется (или находится) вот эта эти строки |0... ...32| |----signed 24 offset----|cond|-B-|L| |000001110000000000000000|1110|101|0| ![]() |
|
Создано: 01 марта 2010 22:12 · Поправил: [wl] · Личное сообщение · #10 нужно именно инвертировать или просто всегда переходить? если инвертировать, тогда BEQ -> BNE .text:100074F4 01 00 00 1A BNE loc_10007500 B: text:100074FC 00 00 00 EA B loc_10007504 обратную для BGE не знаю --- меняешь последние две цифры, первые 6 не трогаешь. [0..32] - это битовое педставление числа, то есть, к примеру в Hex выглядит как 01 00 00 1A а в битовом представлении: 0000.0001.0000.0000.0000.0000.0001.1010 ![]() |
|
Создано: 01 марта 2010 22:24 · Личное сообщение · #11 |
|
Создано: 01 марта 2010 22:28 · Поправил: TolyaN3z · Личное сообщение · #12 [wl] Спасибо за подсказку, сейчас буду пробовать. Как закончу - отпишусь. shustrik Обратная для BGE (Branch if Great or Equal), наверное, BLT (Branch if Less Than): Code:
Вот вся таблица условий из даташита от Атмела: Code:
![]() |
|
Создано: 01 марта 2010 22:37 · Личное сообщение · #13 |
|
Создано: 01 марта 2010 22:45 · Личное сообщение · #14 |
|
Создано: 01 марта 2010 22:54 · Личное сообщение · #15 |
|
Создано: 01 марта 2010 23:40 · Поправил: [wl] · Личное сообщение · #16 |
|
Создано: 01 марта 2010 23:44 · Поправил: TolyaN3z · Личное сообщение · #17 |
|
Создано: 02 марта 2010 00:21 · Поправил: matrix · Личное сообщение · #18 |
|
Создано: 02 марта 2010 01:06 · Поправил: [wl] · Личное сообщение · #19 |
|
Создано: 02 марта 2010 01:17 · Поправил: matrix · Личное сообщение · #20 [wl] пишет: а должно быть строго меньше (<) то есть BLT. А подумайте что же произойдёт если в этом случае x<y значения будут равны . Куда будет прыжок? Получается что и BLT не подходит. Пока мы не узнаем поподробней думаю можно прикратить дискуссию. Чуть ниже я написал почему. BLT error "НЕВЕРНЫЙ КОД" error "СПАСИБО ЗА РЕГИСТРАЦИЮ" [wl] пишет: если сравниваемые значения одинаковы Это и так ясно. Ну дык а я же откуда знаю какие там значения у него я ж не медиум, думаю что и вы тоже ![]() shustrik пишет: чтобы вот эти условные переходы выполнялись при неправильном значении сравниваемых данных: Повторюсь если ломаешь то ставь безусловный. Если нет давай инфы побольше. ![]() |
|
Создано: 02 марта 2010 11:14 · Поправил: TolyaN3z · Личное сообщение · #21 Да я вижу Вы, умник, не уймётесь: matrix пишет: [wl] пишет: вообще-то BLE это не противоположное BGE Где это вы увидели что я такое написал? вот здесь: matrix пишет: TolyaN3z пишет: Обратная для BGE (Branch if Great or Equal), наверное, BLT (Branch if Less Than): это вообще нето. matrix пишет: TolyaN3z пишет: Да ладно, почему? Потому что вот ответ: s0l пишет: А не BLE случайно? Мы говорим о взаимоисключающих условиях, и в данном случае моё утверждение правильно, т.к. BGE и BLT перекрывают все возможные варианты и одновременно исключают друг друга, что позволяет выполнить только один "прыжок" при любом результате сравнения, а не оба. А вот Вы утверждаете, что это "вообще не то", будьте добры отвечать за свои слова. 5-ый класс математики, стыдно должно быть за чушь, которую несёте. matrix пишет: А подумайте что же произойдёт если в этом случае x<y значения будут равны . Куда будет прыжок? Так для этого и есть BGE, разве это непонятно? Ещё наглым образом спрашиваете, зачем таблицу условий вывесил, оказывается, Вам бы её изучить не помешало. ![]() |
|
Создано: 02 марта 2010 19:21 · Поправил: TolyaN3z · Личное сообщение · #22 [wl] В общем, твоя идея сработала. Огромное спасибо! Пришлось создавать на основе выделенного сегмента стэка переменную типа TBuf<128>, чтоб моя функция могла с ней нормально работать. Подозреваю, что можно было принудительно привести её к нужному типу, проверять не стал. В итоге получился код: Code:
Для "магического числа" взял небольшое значение 0xEE, т.к. в "реальном" вызове там всегда 0x80. Реализация функции "стандартная": Code:
Единственное, что хотел узнать, это каким образом правильно определить метод который вызывается у объекта? [wl] пишет: Code:
Я так понял, что: R3 - адрес объекта класса. #0x20 - это смещение до метода в структуре класса (dword_1002237C) В принципе, можно ещё компилить свой код и смотреть, но структурировать весь процесс в голове было бы куда проще. Есть какае-то чтиво на эту тему? ![]() |
|
Создано: 02 марта 2010 19:49 · Личное сообщение · #23 Друзья, как хорошо, что вы отозвались!!! Переходы в оригинале такие: CMP R4, R3 BGE loc_1000CD9 CMP R2, R3 BEQ loc_1000CE44 CMP R8, #0 BEQ loc_1000CEC8 Я первый поменял на BNE, второй и третий на B, вроде бы сработало! Посмотрю на днях не будет ли глюков. [wl] пишет: нужно именно инвертировать или просто всегда переходить? Я ломал прогу, нужно было гнать прогу при проверке зарегистрированности, связанной с IMEY. Как проверю, отпишусь ![]() ![]() |
|
Создано: 02 марта 2010 20:38 · Личное сообщение · #24 shustrik Чтобы понять, на что тебе нужно заменить данные условные переходы, нужно проанализировать код, который выполняется перед и после них (при выполнении и невыполнении условия). Можно, конечно, что называется "ткнуть пальцем в небо" и угадать, но попробуй сначала проанализировать сам, почитай туториалы, которые скидывали в эту тему - вопрос выбора правильного условного или безусловного перехода отпадёт сам собой - это не такая сложная задача. Основной же задачей является поиск уязвимого места, которое приведёт к правильной регистрации. Вообще, хотелось бы оформить хоть какую-нибудь шапку для темы, собрать все тулзы, туториалы и крякми, чтобы можно было быстро и удобно получить нужный ответ не плодя дубли. Такое возможно и что для этого нужно? ![]() |
|
Создано: 02 марта 2010 20:48 · Поправил: shustrik · Личное сообщение · #25 |
|
Создано: 02 марта 2010 21:09 · Поправил: [wl] · Личное сообщение · #26 TolyaN3z, считается по виртуальным функциям класса. Code:
![]() |
|
Создано: 02 марта 2010 21:26 · Личное сообщение · #27 Вот поэтапная проверка. При первой проверке мы должны попасть именно на вторую, из второго в третью, и тогда все ОК: Code:
Я все пробовал менять на разные значения в Hiew, потом открывал файл в Ida и смотрел в графическом отображении, получилось, что все нужно поменять на B. Спасибо, что направили мысли в нужное русло!!! ![]() ![]() ![]() ![]() |
|
Создано: 02 марта 2010 21:45 · Личное сообщение · #28 |
|
Создано: 03 марта 2010 01:33 · Личное сообщение · #29 to shustrik Ну с этим вроде разобрались. TolyaN3z пишет: Чтобы понять, на что тебе нужно заменить данные условные переходы, нужно проанализировать код, который выполняется перед и после них (при выполнении и невыполнении условия). Можно, конечно, что называется "ткнуть пальцем в небо" и угадать Ну дык я так и сказал в последнем своём посте, а то получается что мы угадывали и угадали. Я же имел ввиду именно данную ситуацию и попытался в ней разобраться. К тому же я уже говорил что если ломаешь ставь безусловный, ведь в любом случае будут сравниваться неверные данные. P.S: Ивиняюсь если кого-то обидел. Я этого не делал специально. ![]() |
|
Создано: 03 марта 2010 02:44 · Поправил: [wl] · Личное сообщение · #30 |
|
Создано: 17 марта 2010 21:29 · Личное сообщение · #31 |
<< 1 ... 18 . 19 . 20 . 21 . >> |
![]() |
eXeL@B —› Основной форум —› Взлом прог под Симбиан |