eXTracted INternals

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

Поделиться | 
 

 Используем Symbian 9 RTTI

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

avatar

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

СообщениеТема: Используем Symbian 9 RTTI   Вс 18 Ноя - 17:08

Думаю ни для кого уже не секрет, что в Symbian 9 появилась RTTI. И благодаря этому, у нас появилась чудесная возможность узнавать имена классов.

Код:

.code:0000B988                DCD CSerial::RTTI
.code:0000B98C CSerial::Vtbl  DCD sub_9AA0+1          ; DATA XREF: .code:off_9B70o
.code:0000B990                DCD sub_9ABC+1
.code:0000B994                DCD CObject::Extension_(unsigned int, void*&, void*)
.code:0000B998                DCD CObject::Open()
.code:0000B99C                DCD CObject::Close()
.code:0000B9A0                DCD CObject::Name() const
.code:0000B9A4                DCD CObject::FullName() const
.code:0000B9A8                DCD sub_9ACC+1

Т.е. сразу над VTBL у каждого класса идет указатель на RTTI:
Код:

.code:0000B6FC CSerial::RTTI  DCD _infoE              ; DATA XREF: .code:0000B988o
.code:0000B6FC                                        ; .code:0000BFECo
.code:0000B700                DCD a7cserial          ; "7CSerial"
.code:0000B704                DCD typeinfo for CObject
В котором есть указатель на имя класса. И этим надо пользоваться.

Но когда таких дескрипторов RTTI много, запаришься каждый руками именовать. Поэтому был написан скрипт Smile

Вот он:
Код:

#include <idc.idc>

static GetString(ea)
{
   auto the_str, one_char;
   while (Byte(ea))
   {
      one_char=form("%c",Byte(ea));
      the_str=form("%s%s",the_str,one_char);
      ea++;
   }
   return the_str;
}

static RemoveNumbers(name)
{
   auto the_str;
   the_str=name;
   while ((ord(the_str)>=0x30) && (ord(the_str)<=0x39))
   {
      the_str=substr(the_str,1,BADADDR);
   }
   return the_str;
}

static MakeRTTI(func_name)
{
   auto ea,i,class_name,name_ea;
   LocByName(func_name);

   ea=LocByName(func_name);
   if(ea==BADADDR)
     return;

   i=DfirstB(ea);
   while(i!=BADADDR)
    {
      MakeDword(i+4);
       OpOff(i+4,1,BADADDR);
      
      name_ea=Dword(i+4);
      MakeStr(name_ea,BADADDR);

      class_name=GetString(name_ea);
      class_name=RemoveNumbers(class_name);
      
      class_name=form("%s::RTTI",class_name);
      MakeNameEx(i,class_name,SN_NOCHECK);

        i=DnextB(ea,i);
    }
}

static main()
{
   MakeRTTI("_infoE");
   MakeRTTI("drtaeabi_127");
   MakeRTTI("drtaeabi_128");
}

Скрипт ищет xref на 3 функции: _infoE, drtaeabi_127 и drtaeabi_128 (Они все импортируются из drtaeabi.dll), и проставляет имена RTTI дескрипторов классов.

p.s. Зацените GetString(), как тока не приходится выкручиваться чтобы получить Ascii строку jocolor
Вернуться к началу Перейти вниз
Посмотреть профиль
wl



Количество сообщений : 127
Дата регистрации : 2007-02-15

СообщениеТема: Re: Используем Symbian 9 RTTI   Пн 17 Дек - 15:58

у меня почему-то не работает, ну это не важно.

у меня есть пара вопросов:
1) Что за куча непонятных цифр обычно идёт после каждого описания класса, для чего они? среди прочего там кажется хранится uid3 приложения, причем для каждого класса, что сильно мешает попытке его поменять.

2) куда делись RTTI у распакованной Profimail UIQ3? их также нет и у остальных кошачьих программ. Также не видно названий классов, кроме умолчального "15XLeaveException". Дико мешает анализу.
Вернуться к началу Перейти вниз
Посмотреть профиль
 
Используем Symbian 9 RTTI
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

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