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

 eXeL@B —› Основной форум —› Взлом прог под Симбиан
<< 1 ... 18 . 19 . 20 . 21 . >>
Посл.ответ Сообщение

Ранг: 153.9 (ветеран)
Активность: 0.120
Статус: Участник
reborn

Создано: 10 августа 2006 22:20 · Поправил: newborn
· Личное сообщение · #1

Народ, ктонить ломал под Симбиан проги ? Искал в инете, инфы вообще неоказалось, так мелочи которые не помогут при взломе. Интересует вот что:
1) Чем ломать.
2) Какая нибудь инфа.

Всем откликнувшимся спасибо.

-----
~ the Power Of Reversing team ~





Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 27 февраля 2010 23:14
· Личное сообщение · #2

попробуй переименовать фейковый вариант плпвариант, и также поменяй импорт в апп-файле.
хотя если целостность проверяется, тогда это не поможет



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

Создано: 28 февраля 2010 01:28 · Поправил: TolyaN3z
· Личное сообщение · #3

[wl]
Не могу, вот именно из-за проверки целостности ничего вообще изменить не могу. Если изменяю хотя бы бит - прога запускается, получает нужный IMEI и даже работает некоторое время, но потом сваливается по какой-то неопределённой закономерности.
Причём, я не понимаю, зачем давать проге запуститься, если узнать о модификации можно при запуске? Хотя, тогда было бы проще найти место проверки.
Западло ещё и в том, что для лицензирования используется криптография - просто так не откейгенишь.




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 28 февраля 2010 16:47
· Личное сообщение · #4

просмтри все вызовы RFile::Open, найдешь, где апп открывается, и подставь туда имя оригинального файла, скопировав заранее оригинал рядом и поменяв имя. ну чтобы запускалась ломанная прога, а проверяла она оригинальную



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

Создано: 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 он размещён "по ошибке". Деньги так и не вернули. Свинство вообще.



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 марта 2010 21:56 · Поправил: shustrik
· Личное сообщение · #6

спецы, подскажите, на какие hex-значения мне поменять, чтобы вот эти условные переходы выполнялись при неправильном значении сравниваемых данных:
BGE loc_1000CD9C (hex-0D0000AA)

BEQ loc_1000CE44 (hex-1B00000A)

BEQ loc_1000CEC8 (hex-1E00000A)




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 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


надеюсь объяснил не слишком путано?




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 01 марта 2010 21:57 · Поправил: [wl]
· Личное сообщение · #8

shustrik пишет:
на какие значения мне поменять вот эти условные переходы


первый - не знаю, можно попробовать B
два последних - B



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 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|




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 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



Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 01 марта 2010 22:24
· Личное сообщение · #11

[wl] пишет:
обратную для BGE не знаю

А не BLE случайно?
intelliwiki.kylesblog.com/index.php/BLE



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

Создано: 01 марта 2010 22:28 · Поправил: TolyaN3z
· Личное сообщение · #12

[wl]
Спасибо за подсказку, сейчас буду пробовать. Как закончу - отпишусь.
shustrik
Обратная для BGE (Branch if Great or Equal), наверное, BLT (Branch if Less Than):
Code:
  1. BLT           xxxxxxBA


Вот вся таблица условий из даташита от Атмела:
Code:
  1. Code     Suffix       Flags                               Meaning
  2. ----------------------------------------------------------------------    -
  3. 0000     EQ          Z set                            equal
  4. 0001     NE          Z clear                         not equal
  5. 0010     CS          C set                            unsigned higher or same
  6. 0011     CC          C clear                         unsigned lower
  7. 0100     MI          N set                            negative
  8. 0101     PL          N clear                         positive or zero
  9. 0110     VS          V set                            overflow
  10. 0111     VC          V clear                         no overflow
  11. 1000     HI          C set and Z clear                unsigned higher
  12. 1001     LS          C clear or Z set                  unsigned lower or same
  13. 1010     GE          N equals V                     greater or equal
  14. 1011     LT          N != V                          less than
  15. 1100     GT          Z clear AND (= V)            greater than
  16. 1101     LE          Z set OR (!= V)                less than or equal
  17. 1110     AL          (ignored)                       always




Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 01 марта 2010 22:37
· Личное сообщение · #13

to shustrik
Если ломаешь сделай безусловный нах тебе с условием. И заюзай msdn там по опкодам всё есть.
TolyaN3z пишет:
Обратная для BGE (Branch if Great or Equal), наверное, BLT (Branch if Less Than):

это вообще нето.
TolyaN3z пишет:
Вот вся таблица условий из даташита от Атмела:

А это тут нах?



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

Создано: 01 марта 2010 22:45
· Личное сообщение · #14

matrix пишет:
это вообще нето.

Да ладно, почему?
matrix пишет:
А это тут нах?

Чтобы наглядно посмотреть, что и чему соответствует, или это был риторический вопрос?



Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 01 марта 2010 22:54
· Личное сообщение · #15

TolyaN3z пишет:
Да ладно, почему?

Потому что вот ответ: s0l пишет:
А не BLE случайно?


TolyaN3z пишет:
Чтобы наглядно посмотреть, что и чему соответствует, или это был риторический вопрос?
:
а ну если наглядно тогда ладно.




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 01 марта 2010 23:40 · Поправил: [wl]
· Личное сообщение · #16

вообще-то BLE это не противоположное BGE

если в математических знаках записать

BGE: >=
BLE: <=
а должно быть строго меньше (<) то есть BLT.

(x>=y) <=> !(x<y)



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

Создано: 01 марта 2010 23:44 · Поправил: TolyaN3z
· Личное сообщение · #17

matrix пишет:
Потому что вот ответ: s0l пишет:
А не BLE случайно?

Если под обратностью имеется ввиду, что выполнится только одно из условий, то этот ответ неправильный, т.к. обе команды (BGE и BLE) будут выполнены, если операнды равны.



Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 02 марта 2010 00:21 · Поправил: matrix
· Личное сообщение · #18

[wl] пишет:
вообще-то BLE это не противоположное BGE

Где это вы увидели что я такое написал?

BGE error
"Спасибо за регистрацию"
error
"Неверный код"

BLE error
"Спасибо за регистрацию"
error
"Неверный код"

Ну и какой из них получит регистрацию?




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 02 марта 2010 01:06 · Поправил: [wl]
· Личное сообщение · #19

если сравниваемые значения одинаковы, то на error перейдет в обоих случаях. Как это не может быть понятно? это же первый класс церковно-приходской школы.

Подобная небрежность обычно ведет к тому, что у половины пользователей кряк не работает



Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 02 марта 2010 01:17 · Поправил: matrix
· Личное сообщение · #20

[wl] пишет:
а должно быть строго меньше (<) то есть BLT.

А подумайте что же произойдёт если в этом случае x<y значения будут равны . Куда будет прыжок? Получается что и BLT не подходит. Пока мы не узнаем поподробней думаю можно прикратить дискуссию. Чуть ниже я написал почему.

BLT error
"НЕВЕРНЫЙ КОД"
error
"СПАСИБО ЗА РЕГИСТРАЦИЮ"

[wl] пишет:
если сравниваемые значения одинаковы

Это и так ясно.
Ну дык а я же откуда знаю какие там значения у него я ж не медиум, думаю что и вы тоже .

shustrik пишет:
чтобы вот эти условные переходы выполнялись при неправильном значении сравниваемых данных:

Повторюсь если ломаешь то ставь безусловный. Если нет давай инфы побольше.



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

Создано: 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, разве это непонятно?
Ещё наглым образом спрашиваете, зачем таблицу условий вывесил, оказывается, Вам бы её изучить не помешало.



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

Создано: 02 марта 2010 19:21 · Поправил: TolyaN3z
· Личное сообщение · #22

[wl]
В общем, твоя идея сработала. Огромное спасибо!
Пришлось создавать на основе выделенного сегмента стэка переменную типа TBuf<128>, чтоб моя функция могла с ней нормально работать. Подозреваю, что можно было принудительно привести её к нужному типу, проверять не стал. В итоге получился код:
Code:
  1. MOV     R1, #0x80
  2. ADD     R0, SP, #0x224+var_21C
  3. BL      TBufBase16::TBufBase16(int)
  4. MOV     R1, #0xEE
  5. MOV     R4, R0
  6. BL      PlpVariant::GetMachineIdL(TBuf<128> &)

Для "магического числа" взял небольшое значение 0xEE, т.к. в "реальном" вызове там всегда 0x80.
Реализация функции "стандартная":
Code:
  1. EXPORT_C void MyGetMachineIdL(TPlpVariantMachineId &aId, TUint uiReturnAppName)
  2.          {
  3.          _LIT(KIMEI, "123456-78-901234-5");
  4.          _LIT(KAppName, "c:\\path\\to\\original.app");
  5.          
  6.          if (uiReturnAppName == 0xEE)
  7.                  {
  8.                  aId.Copy(KAppName);
  9.                  }
  10.          else
  11.                  {
  12.                  aId.Copy(KIMEI);
  13.                  }
  14.          }

Единственное, что хотел узнать, это каким образом правильно определить метод который вызывается у объекта?
[wl] пишет:
Code:
  1. .text:10003F38 BL CEikAppUi::Application(void)
  2. .text:10003F3C MOV R1, R0
  3. .text:10003F40 LDR R3, [R1]
  4. ...
  5. .text:10003F4C LDR R12, [R3,#0x20] ; <<<<<<------------ AppFullName()

Я так понял, что:
R3 - адрес объекта класса.
#0x20 - это смещение до метода в структуре класса (dword_1002237C)
В принципе, можно ещё компилить свой код и смотреть, но структурировать весь процесс в голове было бы куда проще. Есть какае-то чтиво на эту тему?



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 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. Как проверю, отпишусь



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

Создано: 02 марта 2010 20:38
· Личное сообщение · #24

shustrik
Чтобы понять, на что тебе нужно заменить данные условные переходы, нужно проанализировать код, который выполняется перед и после них (при выполнении и невыполнении условия). Можно, конечно, что называется "ткнуть пальцем в небо" и угадать, но попробуй сначала проанализировать сам, почитай туториалы, которые скидывали в эту тему - вопрос выбора правильного условного или безусловного перехода отпадёт сам собой - это не такая сложная задача. Основной же задачей является поиск уязвимого места, которое приведёт к правильной регистрации.

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



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 02 марта 2010 20:48 · Поправил: shustrik
· Личное сообщение · #25

Спасиб TolyaN3z, действительно не хватает именно такой шапки! (я даже из Arteam статьи покачал по s60v1-2 и переводил сократом . Ничего, прорвемся!




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 02 марта 2010 21:09 · Поправил: [wl]
· Личное сообщение · #26

TolyaN3z, считается по виртуальным функциям класса.
Code:
  1. .text:1002237C dword_1002237C  
  2. 00 04            DCD 0, 0                                                      
  3. 08                DCD CQikApplication::~CQikApplication(void)
  4. 0с                DCD CQikApplication::PreDocConstructL(void)
  5. 10                DCD CQikApplication::CreateDocumentL(CApaProcess *)
  6. 14                DCD sub_10000668
  7. 18                DCD sub_10000678
  8. 1с                DCD CQikApplication::OpenAppInfoFileLC(void)
  9. 20  < !!!        DCD CQikApplication::AppFullName(void)
  10. 24                DCD CQikApplication::Capability(TDes8 &)




Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 02 марта 2010 21:26
· Личное сообщение · #27

Вот поэтапная проверка.
При первой проверке мы должны попасть именно на вторую, из второго в третью, и тогда все ОК:
Code:
  1. LDR     R3, [SP,#0x120+var_120]
  2. BIC     R3, R3, #0xF0000000
  3. CMP     R4, R3
  4. BGE     loc_1000CD9C
  5.  
  6.  
  7. loc_1000CD9C
  8. LDR     R3, =0x82DC
  9. LDR     R2, [R6,R3]
  10. BIC     R2, R2, #0xFF000000
  11. BIC     R2, R2, #0xF00000
  12. ADD     R2, R2, #1
  13. STR     R2, [R6,R3]
  14. LDR     R0, =0x82D4
  15. LDR     R1, [R6,R0]
  16. BIC     R3, R1, #0xFF000000
  17. BIC     R3, R3, #0xF00000
  18. SUB     R3, R3, R1,ASR#20
  19. ADD     R3, R3, #1
  20. CMP     R2, R3
  21. BEQ     loc_1000CE44
  22.  
  23.  
  24. loc_1000CE44
  25. CMP     R8, #0
  26. BEQ     loc_1000CEC8


Я все пробовал менять на разные значения в Hiew, потом открывал файл в Ida и смотрел в графическом отображении, получилось, что все нужно поменять на B.

Спасибо, что направили мысли в нужное русло!!!




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 02 марта 2010 21:45
· Личное сообщение · #28

похоже, что первая проверка проверяет длину некой строки с каким-то значением



Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 03 марта 2010 01:33
· Личное сообщение · #29

to shustrik
Ну с этим вроде разобрались.

TolyaN3z пишет:
Чтобы понять, на что тебе нужно заменить данные условные переходы, нужно проанализировать код, который выполняется перед и после них (при выполнении и невыполнении условия). Можно, конечно, что называется "ткнуть пальцем в небо" и угадать

Ну дык я так и сказал в последнем своём посте, а то получается что мы угадывали и угадали. Я же имел ввиду именно данную ситуацию и попытался в ней разобраться. К тому же я уже говорил что если ломаешь ставь безусловный, ведь в любом случае будут сравниваться неверные данные.
P.S: Ивиняюсь если кого-то обидел. Я этого не делал специально.




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 03 марта 2010 02:44 · Поправил: [wl]
· Личное сообщение · #30

matrix
ну ведешь себя довольно вызывающе, есть причины? выложи список своих кряков (конкретно под симбиан, конечно же)
Поясню дополнительно, это не для измерения длины пиписек, просто оценить уровень



Ранг: 11.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 17 марта 2010 21:29
· Личное сообщение · #31

Ребята, поскажите, как в ида найти нужное hex-значение? Есть 2 файла (один взломан, другой оригинал), через total commander сравнил оба файла, а теперь хочу посмотреть на сами функции, которые были изменены..... или подскажите, чем можно глянуть


<< 1 ... 18 . 19 . 20 . 21 . >>
 eXeL@B —› Основной форум —› Взлом прог под Симбиан
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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