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

 eXeL@B —› Крэки, обсуждения —› Анализ кода ARM - расчет смещения (адреса)
Посл.ответ Сообщение

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

Создано: 24 января 2017 17:52 · Поправил: Enclave
· Личное сообщение · #1

Всем привет.

Не очень хорошо понимаю, как рассчитывается смещение (адрес) для данных.

Например по адресу 000FB404 имеем:

Code:
  1. :000FB404 84 00 9F E5       LDR     R0, =aError     ; "ERROR"


Code:
  1. .rodata:0039BDC8 45 52 52 4F+aError    DCB "ERROR",0     ; DATA XREF: sub_622AC+4Co
  2. .rodata:0039BDC8 52 00      ; sub_622AC+5Co
  3. .rodata:0039BDCE 00 00      ALIGN 0x10


Тогда как по адресу 000FB3A4 IDA выдает нам следующее:

Code:
  1. .text:000FB3A4 D4 00 9F E5       LDR     R0, =dword_96AA8C



Почему так происходит и как можно вычислить адрес соответствующей строки?
Подобное было, когда IDA автоматически не создавала функцию, но ведь тут она имеется.





Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 24 января 2017 18:14
· Личное сообщение · #2

Жесть.
Даблклик на свой dword в команде (чтобы перейти на него) и нажми "a".
И будет тебе строка.
Если там строка конечно.



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

Создано: 24 января 2017 20:23 · Поправил: Enclave
· Личное сообщение · #3

Ну хорошо. Может пример не совсем удачный. Вот другой. Тут хоть обликайся, никуда не перейдешь.

В частности, адреса :00249818 и :00249820
Тут не совсем строки, но там аналогично. Специально искал код покороче, а то все функции довольно длинные.

Code:
  1. :002497FC 00 00 50 E3        CMP    R0, #0
  2. :00249800 38 20 9F E5        LDR    R2, =0x2B6938
  3. :00249804 0D C0 A0 E1        MOV    R12, SP
  4. :00249808 02 20 8F E0        ADD    R2, PC, R2
  5. :0024980C 00 D8 2D E9        STMFD  SP!, {R11,R12,LR,PC}
  6. :00249810 04 B0 4C E2        SUB    R11, R12, #4
  7. :00249814 00 A8 9D 08        LDMEQFD         SP, {R11,SP,PC}
  8. :00249818 24 C0 9F E5        LDR    R12, =0x1D58
  9. :0024981C 00 30 A0 E3        MOV    R3, #0
  10. :00249820 20 10 9F E5        LDR    R1, =0x13D8
  11. :00249824 01 10 92 E7        LDR    R1, [R2,R1]
  12. :00249828 0C 20 92 E7        LDR    R2, [R2,R12]
  13. :0024982C 4E C7 FB EB        BL     __dynamic_cast
  14. :00249830 00 00 50 E3        CMP    R0, #0
  15. :00249834 00 A8 9D 08        LDMEQFD         SP, {R11,SP,PC}
  16. :00249838 00 68 9D E8        LDMFD  SP, {R11,SP,LR}
  17. :0024983C EA BC FC EA        B      sub_178BEC
  18. :0024983C    ; --------------------------------------
  19. :00249840 38 69 2B 00 dword_249840    DCD 0x2B6938   ; DATA XREF: :00249800
  20. :00249844 58 1D 00 00 dword_249844    DCD 0x1D58     ; DATA XREF: :00249818
  21. :00249848 D8 13 00 00 dword_249848    DCD 0x13D8     ; DATA XREF: :00249820


И после создания функции:

Code:
  1. text:002497FC    sub_2497FC
  2. :002497FC 00 00 50 E3        CMP    R0, #0
  3. :00249800 38 20 9F E5        LDR    R2, =(_GLOBAL_OFFSET_TABLE_ - 0x249810)
  4. :00249804 0D C0 A0 E1        MOV    R12, SP
  5. :00249808 02 20 8F E0        ADD    R2, PC, R2 ; _GLOBAL_OFFSET_TABLE_
  6. :0024980C 00 D8 2D E9        STMFD  SP!, {R11,R12,LR,PC}
  7. :00249810 04 B0 4C E2        SUB    R11, R12, #4
  8. :00249814 00 A8 9D 08        LDMEQFD         SP, {R11,SP,PC}
  9. :00249818 24 C0 9F E5        LDR    R12, =(_ZTIN3tsd9bluetooth4core6status3stm13StatusStmDataE_ptr - 0x500148)
  10. :0024981C 00 30 A0 E3        MOV    R3, #0
  11. :00249820 20 10 9F E5        LDR    R1, =(_ZTIN3tsd6common3stm9IDataPoolE_ptr - 0x500148)
  12. :00249824 01 10 92 E7        LDR    R1, [R2,R1] ; _ZTIN3tsd6common3stm9IDataPoolE_ptr
  13. :00249828 0C 20 92 E7        LDR    R2, [R2,R12] ; _ZTIN3tsd9bluetooth4core6status3stm13StatusStmDataE_ptr
  14. :0024982C 4E C7 FB EB        BL     __dynamic_cast
  15. :00249830 00 00 50 E3        CMP    R0, #0
  16. :00249834 00 A8 9D 08        LDMEQFD         SP, {R11,SP,PC}
  17. :00249838 00 68 9D E8        LDMFD  SP, {R11,SP,LR}
  18. :0024983C EA BC FC EA        B      sub_178BEC
  19. :0024983C    ; End of function sub_2497FC
  20. :0024983C
  21. :0024983C    ; -------------------------------
  22. :00249840 38 69 2B 00 off_249840      DCD _GLOBAL_OFFSET_TABLE_ - 0x249810
  23. :00249840 
  24. :00249844 58 1D 00 00 off_249844      DCD _ZTIN3tsd9bluetooth4core6status3stm13StatusStmDataE_ptr - 0x500148
  25. :00249844 
  26. :00249848 D8 13 00 00 off_249848      DCD _ZTIN3tsd6common3stm9IDataPoolE_ptr - 0x500148
  27. :00249848 
  28. .





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 января 2017 20:50 · Поправил: reversecode
· Личное сообщение · #4

эт что ли ?

--> Link <--



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

Создано: 24 января 2017 21:45 · Поправил: Enclave
· Личное сообщение · #5

Наверное, но все равно непонятно, как считать.

Сегмент, где лежат данные:

Code:
  1. .got 00500148 00502214 R W . . L dword 0C public DATA 32 00 0D



Code:
  1. .got:00501520 24 7C 4E 00 _ZTIN3tsd6common3stm9IDataPoolE_ptr DCD _ZTIN3tsd6common3stm9IDataPoolE



Или вот тоже самое, но с обычной строкой.
DATA XREF сразу здесь сразу указывает на код, который адресует строку, но так не везде.

Code:
  1. .text:0024C6E0 C0 11 9F E5        LDR    R1, =(aEvt_start_inqu - 0x500148)
  2. .text:0024C6E4 04 00 85 E0                 ADD   R0, R5, R4 ; unk_50344C
  3. .text:0024C6E8 48 00 80 E2                 ADD   R0, R0, #0x48
  4. .text:0024C6EC 58 20 4B E2                 SUB   R2, R11, #0x58
  5. .text:0024C6F0 01 10 85 E0                 ADD   R1, R5, R1 ; "EVT_START_INQUIRY"


Code:
  1. .text:0024C8A8 BC E3 F2 FF off_24C8A8   DCD    aEvt_start_inqu - 0x500148
  2. .text:0024C8A8              ; DATA XREF: .text:0024C6E0
  3. .text:0024C8A8              ; "EVT_START_INQUIRY"


Code:
  1. .rodata:0042E504 45 56 54 5F+aEvt_start_inqu DCB    "EVT_START_INQUIRY",0
  2. .rodata:0042E504 53 54 41 52+             ; DATA XREF: .text:0024C6F0
  3. .rodata:0042E504 54 5F 49 4E+             ; .text:off_24C8A8


Code:
  1. .rodata  004045E8    004674B8





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 января 2017 22:25 · Поправил: reversecode
· Личное сообщение · #6

у ида свое представление как что выводить

допустим берем с ида
Code:
  1. :00249818 24 C0 9F E5        LDR    R12, =0x1D58

берем онлайн дизассемблер и получаем
Code:
  1. ldr r12,[pc,#36] ; 0x00249844

https://www.onlinedisassembler.com/odaweb/w2DBYDCZ/0

Добавлено спустя 20 минут
что такое 0x1d58 даже я не знаю )))
по опкодам 9F E5 это ldr r12,[pc]
дальше идут 11 бит смещения т.е. 0x24(36) туда попадает, 0xC0 уже идет в доп биты

Добавлено спустя 22 минуты
возможно 0x1d58 это смешение от начала всего файла

Добавлено спустя 24 минуты
поищите в опциях IDA, возможно есть какая то опция для показа инструкций с PC relative offset и оно будет показывать так как вы хотите [pc,#36]



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

Создано: 25 января 2017 11:15 · Поправил: Enclave
· Личное сообщение · #7

reversecode

Кажется, я понял.

Указатель _ZTIN3tsd9bluetooth4core6status3stm13StatusStmDataE_ptr расположен по адресу .got:00501ea0

Code:
  1. .got:00501ea0    _ZTIN3tsd9bluetooth4core6status3stm13StatusStmDataE_ptr


Этот адрес получается так:

берем базовый адрес сегмента .got 00500148, добавляем к нему 0x1d58 (это смещение от его начала), получили 00501ea0.

Только в случае со строкой чуть иначе, она расположена в другом сегменте.

Здесь его адрес такой - .rodata 004045E8

Сама строка находится здесь .rodata:0042E504 45 56 54 5F+aEvt_start_inqu DCB "EVT_START_INQUIRY",0

Тут немного непонятно, как считать.

Code:
  1. .text:0024C8A8 BC E3 F2 FF off_24C8A8   DCD    aEvt_start_inqu - 0x500148



 eXeL@B —› Крэки, обсуждения —› Анализ кода ARM - расчет смещения (адреса)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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