eXTracted INternals

eXTracted INternals
 
ФорумФорум  ЧаВоЧаВо  ПоискПоиск  РегистрацияРегистрация  ПользователиПользователи  ГруппыГруппы  Вход  

Поделиться | 
 

 Восстановление классов в Symbian

Предыдущая тема Следующая тема Перейти вниз 
АвторСообщение
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Восстановление классов в Symbian   Пт 25 Авг - 4:42

Реверсинг классов под симбиан практически не отличается от реверсинга под x86. Просто тут GNU-шный компилер + ARM код. Указатель на this передается в методы через R0. Указатель на созданый класс тоже возвращается в R0.


Создание класса
Будем рассматривать на живом примере:
Код:

ROM:505CFB84  sub_505CFB84                            ; CODE XREF: JarDownloader_dll_1+7Ap
ROM:505CFB84                  PUSH    {R4-R7,LR}
ROM:505CFB86                  ADD    R5, R0, #0
ROM:505CFB88                  ADD    R6, R1, #0
ROM:505CFB8A                  ADD    R7, R2, #0
ROM:505CFB8C                  MOV    R0, #0x34
ROM:505CFB8E                  BL      newL__5CBaseUi_129 ; CBase::newL(uint)
ROM:505CFB92                  ADD    R4, R0, #0
ROM:505CFB94                  CMP    R4, #0
ROM:505CFB96                  BEQ    loc_505CFBA0
ROM:505CFB98                  ADD    R1, R5, #0
ROM:505CFB9A                  BL      sub_505CFBBC
ROM:505CFB9E                  ADD    R4, R0, #0
ROM:505CFBA0
ROM:505CFBA0  loc_505CFBA0                            ; CODE XREF: sub_505CFB84+12j
ROM:505CFBA0                  ADD    R0, R4, #0
ROM:505CFBA2                  BL      PushL__12CleanupStackP5CBase_130 ; CleanupStack::PushL(CBase *)
ROM:505CFBA6                  ADD    R0, R4, #0
ROM:505CFBA8                  ADD    R1, R6, #0
ROM:505CFBAA                  ADD    R2, R7, #0
ROM:505CFBAC                  BL      sub_505CFC00
ROM:505CFBB0                  BL      Pop__12CleanupStack_123 ; CleanupStack::Pop
ROM:505CFBB4                  ADD    R0, R4, #0
ROM:505CFBB6                  POP    {R4-R7}
ROM:505CFBB8                  POP    {R1}
ROM:505CFBBA                  BX      R1

Сама функция 505CFB84 это метод NewL какого-то неизвестного класса, т.е. Class::NewL(). Таким образом функция сначала выделяет память для структуры класса:
Код:

ROM:505CFB8C                  MOV    R0, #0x34
ROM:505CFB8E                  BL      newL__5CBaseUi_129 ; CBase::newL(uint)

Далее если все хорошо (память выделилась) вызывается собственно конструктор:
Код:

ROM:505CFB94                  CMP    R4, #0
ROM:505CFB96                  BEQ    loc_505CFBA0
ROM:505CFB98                  ADD    R1, R5, #0
ROM:505CFB9A                  BL      sub_505CFBBC
То есть sub_505CFBBC - это Class::Class();

Дальше запихивание объекта в стек и вызов метода Class:ConstructL():
Код:

ROM:505CFBA0                  ADD    R0, R4, #0
ROM:505CFBA2                  BL      PushL__12CleanupStackP5CBase_130 ; CleanupStack::PushL(CBase *)
ROM:505CFBA6                  ADD    R0, R4, #0
ROM:505CFBA8                  ADD    R1, R6, #0
ROM:505CFBAA                  ADD    R2, R7, #0
ROM:505CFBAC                  BL      sub_505CFC00
ROM:505CFBB0                  BL      Pop__12CleanupStack_123 ; CleanupStack::Pop
sub_505CFC00 = Class:ConstructL();

Итого получаем вот такое:
Код:

ROM:505CFB84  Class__NewL                            ; CODE XREF: JarDownloader_dll_1+7Ap
ROM:505CFB84                  PUSH    {R4-R7,LR}
ROM:505CFB86                  ADD    R5, R0, #0
ROM:505CFB88                  ADD    R6, R1, #0
ROM:505CFB8A                  ADD    R7, R2, #0
ROM:505CFB8C                  MOV    R0, #0x34
ROM:505CFB8E                  BL      newL__5CBaseUi_129 ; CBase::newL(uint)
ROM:505CFB92                  ADD    R4, R0, #0
ROM:505CFB94                  CMP    R4, #0
ROM:505CFB96                  BEQ    loc_505CFBA0
ROM:505CFB98                  ADD    R1, R5, #0
ROM:505CFB9A                  BL      Class__Class
ROM:505CFB9E                  ADD    R4, R0, #0
ROM:505CFBA0
ROM:505CFBA0  loc_505CFBA0                            ; CODE XREF: Class__NewL+12j
ROM:505CFBA0                  ADD    R0, R4, #0
ROM:505CFBA2                  BL      PushL__12CleanupStackP5CBase_130 ; CleanupStack::PushL(CBase *)
ROM:505CFBA6                  ADD    R0, R4, #0
ROM:505CFBA8                  ADD    R1, R6, #0
ROM:505CFBAA                  ADD    R2, R7, #0
ROM:505CFBAC                  BL      Class__ConstructL
ROM:505CFBB0                  BL      Pop__12CleanupStack_123 ; CleanupStack::Pop
ROM:505CFBB4                  ADD    R0, R4, #0
ROM:505CFBB6                  POP    {R4-R7}
ROM:505CFBB8                  POP    {R1}
ROM:505CFBBA                  BX      R1
ROM:505CFBBA  ; End of function Class__NewL

У всех классов есть обычный конструктор, типа Class::Class(). А вот NewL() и ConstructL() есть не у всех.

Когда объект создается в стеке - используют только вызов обычного конструктора:
Код:

ROM:5010EED0                ADD    R0, SP, #0xC
ROM:5010EED2                MOV    R1, #0x80
ROM:5010EED4                BL      TBufBase16::TBufBase16(int)

То есть в функцию TBufBase16::TBufBase16() передается указатель на стек (ну а в NewL - на уже выделеную память).
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Пт 25 Авг - 4:43

Восстановление структуры класса
Если у нас есть NewL() то размер структуры класса ясен - он передается в функцию выделения памяти. А если имеем дело со стеком то придется анализировать весь стек функции, которая создает класс у себя стеке.

Попробуем восстановить структуру класса, который мы рассматривали в начале.
Итак, размер структуры = 0x34 ибо:
Код:

ROM:505CFB8C                  MOV    R0, #0x34
ROM:505CFB8E                  BL      newL__5CBaseUi_129 ; CBase::newL(uint)

Идем в конструктор, то есть Class::Class() (sub_505CFBBC):
Код:

ROM:505CFBBC Class__Class                            ; CODE XREF: Class__NewL+16p
ROM:505CFBBC                PUSH    {R4,LR}
ROM:505CFBBE                ADD    R4, R0, #0
ROM:505CFBC0                BL      sub_505CF72C
ROM:505CFBC4                LDR    R0, =dword_505D08A8
ROM:505CFBC6                STR    R0, [R4,#Class.field_C]
ROM:505CFBC8                LDR    R0, =off_505D08B8
ROM:505CFBCA                STR    R0, [R4,#Class.field_10]
ROM:505CFBCC                LDR    R0, =dword_505D088C
ROM:505CFBCE                STR    R0, [R4,#Class.field_C]
ROM:505CFBD0                LDR    R0, =dword_505D089C
ROM:505CFBD2                STR    R0, [R4,#Class.field_10]
ROM:505CFBD4                LDR    R0, =dword_505D0878
ROM:505CFBD6                STR    R0, [R4,#Class]
ROM:505CFBD8                MOV    R0, #0
ROM:505CFBDA                STR    R0, [R4,#Class.field_20]
ROM:505CFBDC                STR    R0, [R4,#Class.field_24]
ROM:505CFBDE                STR    R0, [R4,#Class.field_28]
ROM:505CFBE0                STR    R0, [R4,#Class.field_2C]
ROM:505CFBE2                ADD    R0, R4, #0
ROM:505CFBE4                POP    {R4}
ROM:505CFBE6                POP    {R1}
ROM:505CFBE8                BX      R1
ROM:505CFBE8 ; End of function Class__Class

sub_505CF72C - это вызов конструктора базового класса. Дальше идет присвоение значений в Class.field_C и Class.field_10. Если посмотреть, что присваивают:
Код:

ROM:505D08A8 dword_505D08A8  DCD 0
ROM:505D08AC                DCD 0
ROM:505D08B0                DCD __pure_virtual_92+1
ROM:505D08B4                DCD __pure_virtual_92+1

Код:

ROM:505D08B8 off_505D08B8    DCD 0
ROM:505D08BC                DCD 0
ROM:505D08C0                DCD __pure_virtual_92+1

То есть это таблицы виртуальных функций. Почему же у них первые два указателя = 0? Это фишка GCC - он вот так формирует таблицы виртуальных функций. Первый dword - это смещение до начала структуры класса при множественном наследовании. Используется для того чтобы из инкапсулируемыего класса находить класс "контейнер". А для чего нужен второй я не знаю. Сколько раз смотрел - там всекда было ноль. Может знатоки GCC подскажут когда-нить...

Итак, получается что в поля Class.field_C и Class.field_10 загрузили указатели на таблицы виртуальных функций. Раз их загрузили не в Class.field_0 это означает, что Class.field_C и Class.field_10 - это начала классов которые инкапсулируются в наш Class. А то что их таблицы виртуальных функций содержат указатели на pure_virtual означает, что это таблицы виртуальных функций базовых для Class.field_C и Class.field_10 классов (ака интерфейсы). Поэтому, далее в Class.field_C и Class.field_10 загружают уже реальные таблицы виртуальных функций:
Код:

ROM:505D088C dword_505D088C  DCD -0xC
ROM:505D0890                DCD 0
ROM:505D0894                DCD unk_505D0645
ROM:505D0898                DCD unk_505D0639

Код:

ROM:505D089C dword_505D089C  DCD -0x10
ROM:505D08A0                DCD 0
ROM:505D08A4                DCD sub_505D0664+1
Вот теперь видны эти самые смещения к началу класса контейнера. Для Class.field_C оно = -0xC, а для Class.field_10 = -0x10.

И последняя таблица виртуальных функций - таблица самого класса Class:
Код:

ROM:505D0878 dword_505D0878  DCD 0
ROM:505D087C                DCD 0
ROM:505D0880                DCD sub_505CFCD0+1
ROM:505D0884                DCD sub_505CFD28+1
ROM:505D0888                DCD sub_505CFFB8+1
Ее записывают в Class.field_0

Перепишем все по-человечески:
Код:

ROM:505CFBBC Class__Class                            ; CODE XREF: Class__NewL+16p
ROM:505CFBBC                PUSH    {R4,LR}
ROM:505CFBBE                ADD    R4, R0, #0
ROM:505CFBC0                BL      ClassBase__ClassBase
ROM:505CFBC4                LDR    R0, =IncapsClass1Base__Vtbl
ROM:505CFBC6                STR    R0, [R4,#Class.IncapsClass1]
ROM:505CFBC8                LDR    R0, =IncapsClass2Base__Vtbl
ROM:505CFBCA                STR    R0, [R4,#Class.IncapsClass2]
ROM:505CFBCC                LDR    R0, =IncapsClass1Real_Vtbl
ROM:505CFBCE                STR    R0, [R4,#Class.IncapsClass1]
ROM:505CFBD0                LDR    R0, =IncapsClass2Real_Vtbl
ROM:505CFBD2                STR    R0, [R4,#Class.IncapsClass2]
ROM:505CFBD4                LDR    R0, =Class__Vtbl
ROM:505CFBD6                STR    R0, [R4,#Class.pVtbl]
ROM:505CFBD8                MOV    R0, #0
ROM:505CFBDA                STR    R0, [R4,#Class.field_20]
ROM:505CFBDC                STR    R0, [R4,#Class.field_24]
ROM:505CFBDE                STR    R0, [R4,#Class.field_28]
ROM:505CFBE0                STR    R0, [R4,#Class.field_2C]
ROM:505CFBE2                ADD    R0, R4, #0
ROM:505CFBE4                POP    {R4}
ROM:505CFBE6                POP    {R1}
ROM:505CFBE8                BX      R1
ROM:505CFBE8 ; End of function Class__Class

Ну и дальше идет обноление членов Class.field_20, Class.field_24, Class.field_28, Class.field_2C.

Зайдем теперь в конструктор базового класса:

Код:

ROM:505CFBBE                ADD    R4, R0, #0
ROM:505CFBC0                BL      ClassBase__ClassBase

Там вот такое:
Код:

ROM:505CF72C ClassBase__ClassBase                    ; CODE XREF: Class__Class+4p
ROM:505CF72C                PUSH    {R4,R5,LR}
ROM:505CF72E                ADD    R4, R0, #0
ROM:505CF730                ADD    R5, R1, #0
ROM:505CF732                BL      __5CBase_113    ; CBase::CBase(void)
ROM:505CF736                LDR    R0, =off_505D0828
ROM:505CF738                STR    R0, [R4,#Class.pVtbl]
ROM:505CF73A                STR    R5, [R4,#Class.field_4]
ROM:505CF73C                ADD    R0, R4, #0
ROM:505CF73E                POP    {R4,R5}
ROM:505CF740                POP    {R1}
ROM:505CF742                BX      R1
ROM:505CF742 ; End of function ClassBase__ClassBase
Ага, получается что наш класс отнаследован от класса CBase. И еще тут можно увидеть как задается таблица виртуальных для Class:
Код:

ROM:505D0828 off_505D0828    DCD 0
ROM:505D082C                DCD 0
ROM:505D0830                DCD sub_505CF748+1
ROM:505D0834                DCD __pure_virtual_92+1
ROM:505D0838                DCD __pure_virtual_92+1
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Пт 25 Авг - 4:43

Итого вот так:
Код:

ROM:505CF72C ClassBase__ClassBase                    ; CODE XREF: Class__Class+4p
ROM:505CF72C                PUSH    {R4,R5,LR}
ROM:505CF72E                ADD    R4, R0, #0
ROM:505CF730                ADD    R5, R1, #0
ROM:505CF732                BL      __5CBase_113    ; CBase::CBase(void)
ROM:505CF736                LDR    R0, =ClassBase__Vtbl
ROM:505CF738                STR    R0, [R4,#Class.pVtbl]
ROM:505CF73A                STR    R5, [R4,#Class.field_4]
ROM:505CF73C                ADD    R0, R4, #0
ROM:505CF73E                POP    {R4,R5}
ROM:505CF740                POP    {R1}
ROM:505CF742                BX      R1
ROM:505CF742 ; End of function ClassBase__ClassBase

Теперь забежим в sub_505CFC00 = Class:ConstructL():
Код:

ROM:505CFC00                PUSH    {R4-R7,LR}
ROM:505CFC02                SUB    SP, SP, #0xA4
ROM:505CFC04                ADD    R7, R0, #0
ROM:505CFC06                ADD    R5, R1, #0
ROM:505CFC08                ADD    R6, R2, #0
...
ROM:505CFC3E                ADD    R0, R4, #0
ROM:505CFC40                BL      CUri16::Uri(void)
ROM:505CFC44                BL      UriUtils::ConvertToInternetFormL(TUriC16 const &)
ROM:505CFC48                STR    R0, [R7,#Class.field_30]
ROM:505CFC4A                BL      PopAndDestroy__12CleanupStack_106
ROM:505CFC4E                ADD    R4, SP, #0x8C
ROM:505CFC50                LDR    R0, [R7,#Class.field_30]
ROM:505CFC52                BL      CUri8::Uri(void)
...
ROM:505CFCB8                STR    R0, [R2]
ROM:505CFCBA                STR    R1, [R2,#4]
ROM:505CFCBC                ADD    R0, R2, #0
ROM:505CFCBE                BL      TDesC16::AllocL(void)
ROM:505CFCC2                STR    R0, [R7,#Class.field_8]
...
Весь код я не превожу, потому что он довольно большой. Поэтому показываю только обращения к структуре класса Class. Из кода видим, что Class.field_30 содержит указатель на класс CUri8, а Class.field_8 это указатель на буфер.
Сейчас у нас уже есть вот такая структура класса:
Код:

00000000 Class          struc ; (sizeof=0x34)
00000000 pVtbl          DCD ?                  ; offset
00000004 field_4        DCD ?
00000008 iBuffer        DCD ?                  ; offset
0000000C IncapsClass1    DCD ?                  ; offset
00000010 IncapsClass2    DCD ?                  ; offset
00000014                DCB ? ; undefined
00000015                DCB ? ; undefined
00000016                DCB ? ; undefined
00000017                DCB ? ; undefined
00000018                DCB ? ; undefined
00000019                DCB ? ; undefined
0000001A                DCB ? ; undefined
0000001B                DCB ? ; undefined
0000001C                DCB ? ; undefined
0000001D                DCB ? ; undefined
0000001E                DCB ? ; undefined
0000001F                DCB ? ; undefined
00000020 field_20        DCD ?
00000024 field_24        DCD ?
00000028 field_28        DCD ?
0000002C field_2C        DCD ?
00000030 iCUri8          DCD ?                  ; offset
00000034 Class          ends

Но все еще есть пустые поля... Где их искать. Пойдем по таблице виртуальных функций нашего класса:
Код:

ROM:505D0878 Class__Vtbl    DCD 0
ROM:505D087C                DCD 0
ROM:505D0880                DCD Class__Method1+1
ROM:505D0884                DCD Class__Method2+1
ROM:505D0888                DCD Class__Method3+1
Кстати, о таблице виртуальных функций... Наш класс был отнаследован от CBase, соотвественно, в таблице виртуальных функций нашего класса сначала идут виртуальные методы класса CBase, а только потом его личные методы.

Код:

class CBase
   {
public:
   IMPORT_C virtual ~CBase();
   inline TAny* operator new(TUint aSize,TAny *aBase);
   IMPORT_C TAny* operator new(TUint aSize);
   inline TAny* operator new(TUint aSize, TLeave);
   IMPORT_C TAny* operator new(TUint aSize,TUint anExtraSize);
protected:
   IMPORT_C CBase();
private:
   CBase(const CBase&);
   CBase& operator=(const CBase&);
   IMPORT_C static TAny* newL(TUint aSize);
   };
У CBase только один виртуальный метод - деструктор. Соответвенно Class__Method1 - это деструктор. Т.е. можно назвать Class__Destroy.
Загляем в него:
Код:

ROM:505CFCD0 Class__Destroy                          ; DATA XREF: ROM:505D0880o
ROM:505CFCD0                PUSH    {R4,R5,LR}
ROM:505CFCD2                ADD    R4, R0, #0
ROM:505CFCD4                ADD    R5, R1, #0
ROM:505CFCD6                LDR    R0, =IncapsClass1Real_Vtbl
ROM:505CFCD8                STR    R0, [R4,#Class.IncapsClass1]
ROM:505CFCDA                LDR    R0, =IncapsClass2Real_Vtbl
ROM:505CFCDC                STR    R0, [R4,#Class.IncapsClass2]
ROM:505CFCDE                LDR    R0, =Class__Vtbl
ROM:505CFCE0                STR    R0, [R4,#Class]
ROM:505CFCE2                LDR    R1, [R4,#Class.iCUri8]
ROM:505CFCE4                CMP    R1, #0
ROM:505CFCE6                BEQ    loc_505CFCF4
ROM:505CFCE8                LDR    R0, [R1]
ROM:505CFCEA                LDR    R2, [R0,#8]
ROM:505CFCEC                ADD    R0, R1, #0
ROM:505CFCEE                MOV    R1, #3
ROM:505CFCF0                BL      sub_505D01A0
ROM:505CFCF4
ROM:505CFCF4 loc_505CFCF4                            ; CODE XREF: Class__Destroy+16j
ROM:505CFCF4                ADD    R0, R4, #0
ROM:505CFCF6                ADD    R0, #Class.field_20
ROM:505CFCF8                BL      RFsBase::Close(void)
ROM:505CFCFC                ADD    R0, R4, #0
ROM:505CFCFE                ADD    R0, #Class.field_28
ROM:505CFD00                BL      RHTTPSession::Close(void)
ROM:505CFD04                ADD    R0, R4, #0
ROM:505CFD06                ADD    R0, #Class.field_2C
ROM:505CFD08                BL      RHTTPTransaction::Close(void)
ROM:505CFD0C                ADD    R0, R4, #0
ROM:505CFD0E                ADD    R1, R5, #0
ROM:505CFD10                BL      sub_505CF748
ROM:505CFD14                POP    {R4,R5}
ROM:505CFD16                POP    {R0}
ROM:505CFD18                BX      R0
ROM:505CFD18 ; End of function Class__Destroy
Вооот. Уже интересно: Class.field_20 = RFsBase, Class.field_28 = RHTTPSession, Class.field_2C = RHTTPTransaction.

Теперь идем в Class__Method2:
Код:

ROM:505CFD28                PUSH    {R4-R6,LR}
ROM:505CFD2A                  SUB    SP, SP, #0x50
ROM:505CFD2C                  ADD    R4, R0, #0
ROM:505CFD2E                  ADD    R5, R1, #0
ROM:505CFD30                  ADD    R6, R2, #0
...
ROM:505CFD38                  STR    R2, [R4,#Class.field_14]
ROM:505CFD3A                  LDR    R1, =0x80000001
ROM:505CFD3C                  STR    R1, [R2]
ROM:505CFD3E                  STR    R0, [R4,#Class.field_18]
ROM:505CFD40                  STR    R3, [R4,#Class.field_1C]
...
ROM:505CFD66                  ADD    R0, R4, #0
ROM:505CFD68                  BL      Class__Method4
Нашлись недостающие поля стуктуры. И еще нашелся невиртуальный метод. Заглянем в него.

Код:

ROM:505CFF38                PUSH    {R4,R5,LR}
ROM:505CFF3A                SUB    SP, SP, #0x50
ROM:505CFF3C                ADD    R5, R0, #0
...
ROM:505CFF70                LDR    R1, [R5,#Class.field_18]
ROM:505CFF72                MOVL    R4, 0x20C
ROM:505CFF76                ADD    R1, R1, R4
ROM:505CFF78                ADD    R0, R5, #0
ROM:505CFF7A                BL      Class__Method5
...
ROM:505CFF90                LDR    R0, [R5,#Class.field_4]
ROM:505CFF92                LDR    R1, [R5,#Class.field_18]
ROM:505CFF94                MOVL    R4, 0x20C
ROM:505CFF98                ADD    R1, R1, R4
ROM:505CFF9A                BL      RFs::Delete(TDesC16 const &)
ROM:505CFF9E
ROM:505CFF9E loc_505CFF9E                            ; CODE XREF: Class__Method4+56j
ROM:505CFF9E                ADD    R0, R5, #0
ROM:505CFFA0                ADD    R0, #Class.field_14
ROM:505CFFA2                LDR    R1, [SP,#0x4C]
ROM:505CFFA4                BL      User::RequestComplete(TRequestStatus *&,int)
ROM:505CFFA8                MOV    R0, #0
ROM:505CFFAA                STR    R0, [R5,#Class.field_14]

Нашли еще один невиртуальный метод. И прояснилось назначение полей Class.field_4 - это RFs, и Class.field_14 - это TRequestStatus.

Итого мы уже имеем структуру:
Код:

00000000 Class          struc ; (sizeof=0x34)
00000000 pVtbl          DCD ?                  ; offset
00000004 iRfs            DCD ?
00000008 iBuffer        DCD ?                  ; offset
0000000C IncapsClass1    DCD ?                  ; offset
00000010 IncapsClass2    DCD ?                  ; offset
00000014 iRequestStatus  DCD ?
00000018 field_18        DCD ?
0000001C field_1C        DCD ?
00000020 iRFsBase        DCD ?
00000024 field_24        DCD ?
00000028 iRHTTPSession  DCD ?
0000002C iRHTTPTransaction DCD ?
00000030 iCUri8          DCD ?                  ; offset
00000034 Class          ends

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



Количество сообщений : 27
Дата регистрации : 2006-07-19

СообщениеТема: Re: Восстановление классов в Symbian   Пн 11 Сен - 4:48

Перечитал все статьи не по одному разу, прогрузился по полной, а первого шага сделать не могу. Вот, например, есть код
ROM:500F9C4C EXPORT IsaApi_dll_18
ROM:500F9C4C IsaApi_dll_18 ; DATA XREF: ROM:off_500FE6C0o
ROM:500F9C4C 000 30 40 2D E9 STMFD SP!, {R4,R5,LR} ; Store Block to Memory
ROM:500F9C50 00C 08 D0 4D E2 SUB SP, SP, #8 ; Rd = Op1 - Op2
ROM:500F9C54 014 00 40 A0 E1 MOV R4, R0 ; Rd = Op2
ROM:500F9C58 014 01 50 A0 E1 MOV R5, R1 ; Rd = Op2
ROM:500F9C5C 014 0D 00 A0 E1 MOV R0, SP ; Rd = Op2
ROM:500F9C60 014 2C 10 9F E5 LDR R1, =aRisaapiRisaa_1 ; Load from Memory
ROM:500F9C64 014 48 0A 00 EB BL sub_500FC58C ; Branch with Link
ROM:500F9C68 014 0D 00 A0 E1 MOV R0, SP ; Rd = Op2
ROM:500F9C6C 014 37 0A 00 EB BL sub_500FC550 ; Branch with Link
ROM:500F9C70 014 10 30 94 E5 LDR R3, [R4,#0x10] ; Load from Memory
ROM:500F9C74 014 00 00 53 E3 CMP R3, #0 ; Set cond. codes on Op1 - Op2
ROM:500F9C78 014 04 00 A0 11 MOVNE R0, R4 ; Rd = Op2
ROM:500F9C7C 014 B2 06 00 1B BLNE IsaApi_dll_19 ; Branch with Link
ROM:500F9C80 014 01 00 15 E3 TST R5, #1 ; Set cond. codes on Op1 & Op2
ROM:500F9C84 014 03 00 00 0A BEQ loc_500F9C98 ; Branch
ROM:500F9C88 014 04 00 A0 E1 MOV R0, R4 ; Rd = Op2
ROM:500F9C8C 014 42 0A 00 EB BL sub_500FC59C ; Branch with Link
ROM:500F9C90 014 00 00 00 EA B loc_500F9C98 ; Branch
ROM:500F9C90 014 ; ---------------------------------------------------------------------------
ROM:500F9C94 014 4C CA 0F 50 off_500F9C94 DCD aRisaapiRisaa_1 ; DATA XREF: IsaApi_dll_18+14r
ROM:500F9C94 014 ; "RIsaApi::~RIsaApi"
ROM:500F9C98 ; ---------------------------------------------------------------------------
ROM:500F9C98
ROM:500F9C98 loc_500F9C98 ; CODE XREF: IsaApi_dll_18+38j
ROM:500F9C98 ; IsaApi_dll_18+44j
ROM:500F9C98 014 08 D0 8D E2 ADD SP, SP, #8 ; Rd = Op1 + Op2
ROM:500F9C9C 00C 30 40 BD E8 LDMFD SP!, {R4,R5,LR} ; Load Block from Memory
ROM:500F9CA0 000 1E FF 2F E1 BX LR ; Branch to/from Thumb mode
ROM:500F9CA0 000 ; End of function IsaApi_dll_18
здесь я даже методы не могу определит, одни sub. С чего же начать...
Что сможешь посоветовать, кроме того, как еще раз все перечитать и попробовать разобраться.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Вт 12 Сен - 10:21

Для начала определи сколько аргументов у этой функции. Я уже это сделал. Smile

p.s. вырубай вывод подсказок к инструкциям и опкоды перед тем как цитировать. А то неудобочитаемо.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



Количество сообщений : 27
Дата регистрации : 2006-07-19

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 2:19

Честно говоря, не совсем понял как это сделать....Но вроде два, которые сохраняются в R4 и R5. И никак не могу найти описание команд MOVNE и BLNE. Понятно, что они делают примерно то же что и без NE, но что конкретно?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 2:28

Правильно 2.

Суфиксы NE означают что эта команда выполнится если флаг z = 0. Т.е. предидущая команда сделала сравнение или арифметическую операцию. А эта команда делает условное выполнение команды.

Т.е. код:
Код:

CMP R3, #0
MOVNE R0, R4
Эвивалентен:
Код:

CMP R3, #0
BEQ @@iz_zero
MOV R0, R4
@@iz_zero:
...
Экономия на размере кода.

Далее, тебя совсем не заинтересовала строка:
Код:

ROM:500F9C94 014 4C CA 0F 50 off_500F9C94 DCD aRisaapiRisaa_1 ; DATA XREF: IsaApi_dll_18+14r
ROM:500F9C94 014 ; "RIsaApi::~RIsaApi"
Которая передается в sub_500FC58C.
Тебе не кажется что это Trace информация с именем текущей функции?


Последний раз редактировалось: (Ср 13 Сен - 12:10), всего редактировалось 1 раз(а)
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



Количество сообщений : 27
Дата регистрации : 2006-07-19

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 3:45

Указанная строка заинтересовала, только пока не знаю, что именно делать с этой информацией, как ее правильно обработать. Переход на sub_500FC58C дает:
ROM:500FC58C sub_500FC58C ; CODE XREF: IsaApi_dll_1+54p
ROM:500FC58C ; IsaApi_dll_1+74p ...
ROM:500FC58C 000 LDR R12, =off_500E9F30 ; Load from Memory
ROM:500FC590 000 LDR R12, [R12] ; Load from Memory
ROM:500FC594 000 BX R12 ; Branch to/from Thumb mode
ROM:500FC594 ; End of function sub_500FC58C

где off_500E9F30 :

ROM:500E9F30 off_500E9F30 DCD __7TPtrC16PCUs ; DATA XREF: ROM:off_50034B90o
ROM:500E9F30 ; ROM:off_5003B8A4o ...

Какая связь между __7TPtrC16PCUs (что похоже на ординал функции) и "RIsaApi::~RIsaApi" из точки обращения ?
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



Количество сообщений : 27
Дата регистрации : 2006-07-19

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 3:46

З.Ы. Как сделать, чтобы код был в виде как у вас, т.е. КОД: и рамка с кодом?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 5:56

Lehin пишет:

Какая связь между __7TPtrC16PCUs (что похоже на ординал функции) и "RIsaApi::~RIsaApi" из точки обращения ?

__7TPtrC16PCUs это замангленое имя.
Если ты врубишь деманглинг ("options" - "demangled names") и выставишь компилер на GNU C++ ("options" - "compiler") то IDA тебе отобразит это имя как:
TPtrC16::TPtrC16(ushort const *)

Так понятнее какая связь?

Lehin пишет:
Указанная строка заинтересовала, только пока не знаю, что именно делать с этой информацией, как ее правильно обработать.
Ну не знаю как ты собираешься обрабатывать, а я бы функцию
ROM:500F9C4C EXPORT IsaApi_dll_18
Назвал RIsaApi::~RIsaApi. Т.к. это она и есть.

А теперь внимание, вопрос: что за первый (из тех двух) параметр у функции RIsaApi::~RIsaApi() ?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Ср 13 Сен - 6:00

Lehin пишет:
З.Ы. Как сделать, чтобы код был в виде как у вас, т.е. КОД: и рамка с кодом?

Когда пишешь ответ, слева от окна ввода текста есть смайлики, а сверху - панель форматирования на ней:
Bold, Ital, Underl, Strike, Hidden,
Quote, Code.

Вот "Code" надо как раз для этого.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



Количество сообщений : 27
Дата регистрации : 2006-07-19

СообщениеТема: Re: Восстановление классов в Symbian   Пн 18 Сен - 4:44

Цитата :
А теперь внимание, вопрос: что за первый (из тех двух) параметр у функции RIsaApi::~RIsaApi() ?
Моего ламерского понимания пока хватает только на то, чтобы предположить, что первый параметр должен содержаться в регистре R4. А вот что он из себя представляет....... Можешь еще подсказку дать?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Пн 18 Сен - 7:27

А говоришь читал статью... scratch Вот подсказка.
Цитата :

Указатель на this передается в методы через R0

Это второе предложение в статье про восстановление классов Symbian.

Лесь Подерв`янський пишет:

Не можешь так и скажи, але не наябуй
Читай все-таки внимательно.

Итого получаем void RIsaApi::~RIsaApi(bool SomeMode));

Почему bool SomeMode? А вот сам мне скажи Smile
Вернуться к началу Перейти вниз
Посмотреть профиль
Builder



Количество сообщений : 2
Дата регистрации : 2006-12-13

СообщениеТема: Re: Восстановление классов в Symbian   Ср 30 Сен - 13:57

2 Hex, привет, возник такой вопрос, хочу разобрать fieldtest, чтобы получить возможность использования классов, которые он использует, хочется иметь список всех видимых базовых станций, разобрал sis файл, засунул ftd.exe в ida, нашел подозрительный файл ресурсов, в котором лежат строки, которые показываются на экране, со смещениями по координатам, а что дальше делать? по идее можно попытаться найти где они выводятся на экран, там же должен быть вывод и значений, но что-то в этом направлении не сдвинуться, не мог бы посоветовать чот-нить, подсказать... Embarassed
Вернуться к началу Перейти вниз
Посмотреть профиль
Builder



Количество сообщений : 2
Дата регистрации : 2006-12-13

СообщениеТема: Re: Восстановление классов в Symbian   Чт 1 Окт - 7:38

и в продолжение темы - нашел проку, которая вызывает функцию запуска БТС теста, пытаюсь определить что туда передается, функция импортирована из движка, который обращается к серверу, который создается файлом ftdaserver.exe, очень странная картина по адресу 0x0000C4D0 что загружается в регистр R0, при выполнении команды LDR R0, [R4,#0x58] ? - не понятно
закинул idb-шку на http://depositfiles.com/files/nmwkg1z0n


может ида глючит, похоже это какой-то член класса диалога, R4 - this на диалог, и походу это объект класса работы с FtEngine

есть таюлица по адресу 00010D74 судя по всему это созданные классы, как бы найти места где создаются объекты этих классов?, там есть по 000113CC таблицы функций классов и чего-то еще, может членов? как поставить соответствие одного другому?

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

имеет смысл только для нормальных классов -
с началом на C...

получаем структуру объекта класса в памяти -
указатель на таблицу методов, переменные члены, сначала под
все это хозяйство выделяется память User::Alloc, далее заполняется
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Восстановление классов в Symbian   Пт 6 Ноя - 10:38

Builder пишет:

закинул idb-шку на http://depositfiles.com/files/nmwkg1z0n
Сори, меня долго не было файл убили, теперь глянуть не могу.

Builder пишет:
очень странная картина по адресу 0x0000C4D0 что загружается в регистр R0, при выполнении команды LDR R0, [R4,#0x58] ? - не понятно
может ида глючит, похоже это какой-то член класса диалога, R4 - this на диалог, и походу это объект класса работы с FtEngine
Все верно. Скорее всего наследовались.

Builder пишет:

есть таюлица по адресу 00010D74 судя по всему это созданные классы, как бы найти места где создаются объекты этих классов?, там есть по 000113CC таблицы функций классов и чего-то еще, может членов? как поставить соответствие одного другому?
Надо смотреть в конструкторе и в деструкторе.

Builder пишет:

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

имеет смысл только для нормальных классов -
с началом на C...

получаем структуру объекта класса в памяти -
указатель на таблицу методов, переменные члены, сначала под
все это хозяйство выделяется память User::Alloc, далее заполняется
Все верно, так в симбиане создается экземпляр класса. Это скорее всего код конструктора.
Вернуться к началу Перейти вниз
Посмотреть профиль
Спонсируемый контент




СообщениеТема: Re: Восстановление классов в Symbian   

Вернуться к началу Перейти вниз
 
Восстановление классов в Symbian
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
eXTracted INternals :: Cтатьи :: Mobile and Embedded-
Перейти: