eXTracted INternals

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

Поделиться | 
 

 Реверсинг в Симбиан

Предыдущая тема Следующая тема Перейти вниз 
На страницу : 1, 2, 3  Следующий
АвторСообщение
Hex

avatar

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

СообщениеТема: Реверсинг в Симбиан   Ср 12 Июл - 13:31

Настоящий "глубоководный" реверсинг симбиан, а не просто залом какой-нить симбиановской игры/приложения подразумевает ковыряние в недрах системы, т.е. в ее прошивке. Хочу описать структуру прошивок мобил на Symbian, а также проблемы возникающие при их анализе.

Первая проблема, которая возникает прям сразу. Где взять прошивку для анализа? Можно конечно поприставать к сервисникам на всяких форумах типа mobile-files, но, во-первых, не все прошивки окажутся доступны, а во-вторых, не все прошивки идут в чистом виде (т.е. просто так в иду не запихнешь).

Чистые прошивки есть на Samsung и Motorola. Но в большинстве своем конечно же симбиановские мобилы - это нокии, потому что они этот самый симбиан и родили (на основе EPOC). Так вот нокии как раз и создают самый большой геморой прошивку найти не так уж и сложно, но прошивки идут в формате Phoenix (сервисная тулза для прошивания нокий), формат этот подразумевает что прошивка состоит из chunkов различной длины, каждый chunk имеет загловок. За счет этих заголовков загрузить эту прошивку в иду, не очистив просто невозможно. А фулфлэшей ни на одну симбианоскую мобилу вы просто ненайдете. Поэтому надо что решать Smile

Самый простой и логичный выход - написать дампер. Благо SDK для симбиан доступно, и с помощью сдк можно писать нативные приложения, то есть приложения являются ARM кодом. Поэтому я недолго думая написал следующий код:

Код:

#include "CommonFramework.h"
#include <e32std.h>
#include <f32file.h>
#include <s32file.h>

_LIT(RomDumpPath, "d:\\romdump.dmp");

// do the example
LOCAL_C void GetIntL(TUint * PInt, TUint & TheInt)
{
   TheInt= *PInt;
}



LOCAL_C TUint GetAddress()
{

   TUint Address=0;
   TUint8 DigitCounter=0;

   TInt xpos = console->WhereX();
   TInt ypos = console->WhereY();

   _LIT(KBreakLn,"\n");

   while ( 1 )
   {
      _LIT(OneChar,"%c");
      TUint8 Digit=0;
      TUint8 ValidDigit=0;

      TKeyCode code=console->Getch();

      xpos = console->WhereX();
      switch (code)
      {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
         {
            if (DigitCounter<8)
            {   
               console->Printf(OneChar,code);
               Digit=code-'0';
               ValidDigit=1;
            }
            break;
         }

      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
         {
            if (DigitCounter<7)
            {   
               console->Printf(OneChar,code);
               Digit=code-'a'+0xa;
               ValidDigit=1;
            }
            break;
         }
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
         {
            if (DigitCounter<7)
            {   
               console->Printf(OneChar,code);
               Digit=code-'A'+0xa;
               ValidDigit=1;
            }
            break;
         }
      case EKeyBackspace:
         {
            if (DigitCounter)
            {
               Address >>= 4;
               DigitCounter--;
               xpos--;
               console->SetPos(xpos,ypos);
            }
            break;
         }
      case EKeyEnter:
         {
            console->Printf(KBreakLn);
            return Address;
         }
      default:
         break;

      }

      if (ValidDigit)
      {
         Address<<=4;
         Address|=Digit;
         DigitCounter++;
      }
   }

   console->Printf(KBreakLn);
   return Address;
}

LOCAL_C void doExampleL()
{
   _LIT(KStartAddr,"Enter the start address:\n");
   console->Printf(KStartAddr);

   TUint StartAddr=GetAddress();

   _LIT(KEndAddr,"Enter the end address:\n");
   console->Printf(KEndAddr);

   TUint EndAddr=GetAddress();

   RFs Fs;
   Fs.Connect();
   
   TVolumeInfo volumeInfo;
   Fs.Volume(volumeInfo,EDriveD);
   TInt64 SpaceRequired=(TInt64)EndAddr-(TInt64)StartAddr;

   if (volumeInfo.iFree > SpaceRequired)
   {
      _LIT(KDumpingText,"Dumping started!\n");
      console->Printf(KDumpingText);

      RFile DumpFile;
      DumpFile.Replace(Fs, RomDumpPath, EFileShareExclusive | EFileWrite);

      RFileWriteStream out(DumpFile);
      TInt xpos = console->WhereX();
      TInt ypos = console->WhereY();


      TInt OldPercent=0;

      for (TUint i=StartAddr;i<EndAddr;i+=4)
      {
         TInt NewPercent=((i-StartAddr)*100)/(EndAddr-StartAddr);
         if (OldPercent!=NewPercent)
         {
            _LIT(KDumpingPos,"%3i Percent Done, we at %08X\n");
            console->SetPos(xpos,ypos);
            console->Printf(KDumpingPos,NewPercent,i);

         }

         TAny * AnyAddr=(TAny *)i;
         TUint * PInt=(TUint *)AnyAddr;
         TUint TheInt=0;

         //TUint TheInt=*PInt;

         TInt r=0;
         TRAP(r,GetIntL(PInt,TheInt));
         if (r)
         {
            _LIT(KFailed,"Failed: leave code=%d Address: %08X\n");
            console->Printf(KFailed, r,i);
            break;
         }

         out.WriteInt32L(TheInt);
         
         if ((i % 0x1000)==0)
         {
            out.CommitL();
         }

         OldPercent=NewPercent;

      }
      out.CommitL();
      out.Close();
      DumpFile.Close();

      _LIT(KDumpingTextReady,"Dumping complete!\n");
      console->Printf(KDumpingTextReady);
   }
   else
   {
      
      _LIT(KNotEnoughSpace,"There is not enough space on the card!\n");
      console->Printf(KNotEnoughSpace);

      _LIT(KFreeSpace,"Free space on volume D: %d bytes\n");
      console->Printf(KFreeSpace,volumeInfo.iFree);

      _LIT(KRequiredSpace,"Space required for dump %d bytes\n");
      console->Printf(KRequiredSpace,SpaceRequired);
   }
   
   Fs.Close();

}

Эта примитивная программа дампит указаные адреса на карточку. Функция GetAddress() - это просто для обеспечения текстового интерфейса, чтобы можно было адрес дампа вводить. Извращение типа: TRAP(r,GetIntL(PInt,TheInt)); на самом деле было попыткой отлавливать эксепшены при обращении к несуществующим адресам. Но в итоге приложение исправно валится Sad Если кто-нить знает как можно настроить обработку исключений в симбиан - добро пожаловать.

Что делать если есть прошивка, а нет мобилы? Выход тоже есть, благодаря таким людям как nok5rev и g3gg0 стал известен формат прошивок Phoenix. Найти его можно на http://www.g3gg0.de
Я позволил себе нескромность и взял кусочек кода из DCT4Crypter by nok5rev & g3gg0. С помощью этого кода можно получить прошивку в виде чистого бинарника, т.е. без этих chunk'ов.
Сорцы лежат тут: http://extint.narod.ru/Files/FlashCleaner.rar

И вот у нас есть дамп. Что же дальше? Дальше надо изучать структуру прошивки. Прошивки всех симбиановских мобил имеют одинаковый формат, и он не зависит от брэнда. Кстати, и железо у симбиановских смартфонов практически одинаковое. Есть только два производителя которые делают для них процессоры: Texas Instruments - чипы OMAP, и Philips Semiconductors - чипы Nexperia. Таким образом Nexperia стоит в UIQ моделях Sony Ericsson и Samsung. А все остальные - OMAP. Nokia давно сотрудничает с TI, поэтому TI выпускает для них специально модифицированые процессоры OMAP: TIKUEDGE, RAP3G, WD2 - по ним в интернете вообще никакой информации. Вернемся к прошивке...

Все прошивки грузятся на адрес 0x50000000. И стартуют они оттуда же. Вначале прошивки лежит структура TRomHeader, то есть адрес 0x50000000 - это ее начало, несмотря на то, что 0x50000000 это точка входа. Эта структура немного отличается для UIQ, Series 60 и Series 80. Ее можно найти в e32rom.h в соответствующем SDK. К примеру вот так она выглядит в 9200 Series SDK:

Код:

class TRomHeader
   {
public:
   TUint8 iJump[128];
   TVersion iVersion;
   TTime iTime;
   TLinAddr iRomBase;
   TUint32 iRomSize;
   TLinAddr iRomRootDirectoryList;
   TLinAddr iKernDataAddress;
   TLinAddr iKernStackAddress;
   TLinAddr iPrimaryFile;
   TLinAddr iSecondaryFile;
   TUint iCheckSum;
   TInt64 iLanguage;
   TUint32 iHardware;
   TSize iScreenSize;
   TInt iScreenBitsPerPixel;
   TLinAddr iRomSectionHeader;
   TInt iTotalSvDataSize;
   TLinAddr iVariantFile;
   TLinAddr iExtensionFile;
   TLinAddr iRelocInfo;
   TUint32  iTraceMask;  // The kernel tracemask
   TLinAddr iUserDataAddress;   // non-MMU stuff
   TInt iTotalUserDataSize;   // non-MMU stuff
   TUint32 iPad[32-25]; // sizeof(TRomHeader)=256
   };


TUint8 iJump[128]; - это 0x80 байт которые зарезервированы по таблицу векторов прерываний, поэтому лучше все-таки это поле обрубить и сделать в IDA структуру без этого поля, т.е. чтобы первым полем стало iVersion. Тогда структуру надо применять с адреса 0x50000080, и появляется возможность превратить векторы прерываний в код. Да и в самой прошивке код сслылается на поле iVersion. К примеру в Ngage:
Код:

ROM:50000080    ROMHeader      DCB 0                  ; iVersion.iMajor
ROM:50000080                    DCB 0                  ; iVersion.iMinor
ROM:50000080                    DCW 0                  ; iVersion.iBuild
ROM:50000080                    DCB 0x80, 0xDF, 0xF7, 0x4B, 0xB9, 0xA3, 0xE0, 0; iTime
ROM:50000080                    DCD loc_50000000        ; iRomBase
ROM:50000080                    DCD 0x11B0000          ; iRomSize
ROM:50000080                    DCD unk_50316000        ; iRomRootDirectoryList
ROM:50000080                    DCD unk_80000000        ; iKernDataAddress
ROM:50000080                    DCD unk_80400000        ; iKernStackAddress
ROM:50000080                    DCD unk_50316208        ; iPrimaryFile
ROM:50000080                    DCD unk_50316424        ; iSecondaryFile
ROM:50000080                    DCD 0xBC3B0896          ; iCheckSum
............
А в коде указатель на TRomHeader ведет не на 50000000, а на 50000080:
Код:

ROM:50000314                    MOV    R0, R11
ROM:50000318                    ADR    R1, ROMHeader
ROM:5000031C                    MOV    R2, R10
ROM:50000320                    MOV    R3, #0
ROM:50000324                    B      Main
Поле iRomBase - базовый адрес загрузки всего образа.
Поля iPrimaryFile и iSecondaryFile указывают на структуры TRomEntry для файлов Ekern.exe и Efile.exe соответсвенно.

Поле iRomRootDirectoryList это указатель на структуру TRomRootDirectoryList. Это список файлов и каталогов которые находятся в ROMFS, то есть на диске Z:. А на самом деле они просто лежат в прошивке, а эта структура нужна для того чтобы эмулировать файловую систему. Сразу после структуры TRomRootDirectoryList лежит TRomDir:
Код:

ROM:50316000    RootDir        DCD 1                  ; iNumRootDirs
ROM:50316000                                            ; DATA XREF: ROM:ROMHeadero
ROM:50316000                    DCD 0x5040001          ; iRootDir.iHardwareVariant
ROM:50316000                    DCD stru_5031F7FC      ; iRootDir.TLinAddr
ROM:5031600C    RomDir1        DCD 0x60                ; iSize
ROM:5031600C                    DCD 0x374              ; iEntry.iSize
ROM:5031600C                    DCD stru_50606AB0      ; iEntry.iAddressLin
ROM:5031600C                    DCB 1                  ; iEntry.iAtt
ROM:5031600C                    DCB 0xB                ; iEntry.iNameLength
ROM:5031601A    aUikinit_dll    unicode 0, <UikInit.dll>
ROM:50316030                    DCD 0x358              ; iSize
ROM:50316030                    DCD stru_5069BAD0      ; iAddressLin
ROM:50316030                    DCB 1                  ; iAtt
ROM:50316030                    DCB 0xB                ; iNameLength
ROM:5031603A    aAkninit_dll    unicode 0, <akninit.dll>
А дальше идет массив TRomEntry, который описывает уже конкретные файлы. Поле iAddressLin в TRomEntry указывает на начало файла в прошивке. Каждый исполнимый файл начинается со структуры TRomImageHeader.

Когда мобила стартует, то сначала стартует flashstrap код, который производит базовую настройку железа. Потом берет из TRomHeader.iPrimaryFile и запускает ekern.exe. Дальше уже вся работа системы возлагается на ekern.exe. Он перенастраивает вектора прерываний, загружает драйвера и всю остальную систему.


Последний раз редактировалось: (Чт 27 Июл - 14:44), всего редактировалось 1 раз(а)
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Вт 18 Июл - 7:45

Для того чтобы облегчить анализ исполнимых файлов написал следующий скрипт:
Код:

#include <idc.idc>

static main()
{
   auto f,onestring,s,i,ea,sm;
   ea=ScreenEA();
   f=fopen("d:\\euser.txt","rt");
   while (1)
   {
      onestring=readstr(f);
      if (onestring==-1)
      {
         break;
      }

      s=strstr(onestring,"ds");
      if (s==0)
      {
         onestring=substr(onestring,2,7);
         
         sm=atol(onestring)-1;
         sm=sm*4;
         
         for (i=0;i<10;i++)
         {
            onestring=readstr(f);
         }
         onestring=readstr(f);
         onestring=substr(onestring,11,-1);
         MakeNameEx(Dword(ea+sm) & 0xFFFFFFFE,onestring,SN_NOCHECK);
      }
   }
   fclose(f);
   
}

Как юзать:
1) делаем дамп экспортов нужной либы. Берем из соотвествующего SDK \epoc32\release\thumb\urel либу. К примеру euser.lib

и делаем ей
ar x euser.lib
Получаем кучу .o файлов. Далее делаем:
nm --demangle *.o >euser.txt
получаем euser.txt

2) Меняем в скрипте путь
f=fopen("d:\\euser.txt","rt");
на свой.

3) Ставим курсор на начало таблицы экспорта. Ее адрес прописан в TRomImageHeader. И запускаем скрипт.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Реверсинг DLL?   Ср 19 Июл - 0:12

Уважаемый, HEX! А не подскажете, как можно реверснуть DLL из телефона, для которой нет lib?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Ср 19 Июл - 1:54

А она в Rom?
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Ср 19 Июл - 4:43

Путь к dll Z:\System\Libs\ тобишь в RomDrive.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Ср 19 Июл - 8:51

Реверсить надо всю прошивку целиком, отдельный файл - задолбаешься.
Находишь эту DLL в бинаре прошивки. Определяешь какие dll она импортирует. Дальше моим скриптом догружаешь экспорты этим импортируемым dll. И дальше реверсишь на основе того что есть.

По-любому будет тянуть что-то с euser.lib Так что 80% импорта у тебя будет полюбому.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Ср 19 Июл - 23:02

Hex пишет:

Находишь эту DLL в бинаре прошивки. Определяешь какие dll она импортирует.

Спасибо за ценную инфу! Тоько хотел бы уточнить. Бинарник прошивки каким образом лучше получить и как определить импортируемые dll (заранее извиняюсь за ламерские вопросы, нет пока большого опыта).
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 20 Июл - 1:58

Если хочешь просто отреверсить - то берешь любую подходящую прошивку. С помощью FlashCleaner'a получаешь бинарь прошивки и работаешь. А если тебе надо именно ту версию что у тебя на мобиле - тогда дампь. В статье вон пример кода. Переделывай под себя и делай дамп.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 20 Июл - 2:06

Про дамп памяти. Попробовал скомпилировать приведенный код в Carbide C++, безуспешно Sad Не совсем понял, что за нативное приложение, точнее как его создать с помощью SDK. Поэтому попытался сделать sis файл. А вообще такой дампер очень нужен! Как его до конечного результата довести?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 20 Июл - 7:14

Вообще-то это код консольного приложения т.е. EXE. Я его юзал на 9290 и билдил GCC который идет вместе с SDK.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Ср 26 Июл - 6:00

Очередная попытка сделать .ехе файл провалилась. Выдаются сообщения.
undefined reference to `RFs::Connect(int) `TVolumeInfo::TVolumeInfo(void)'
undefined reference to `RFs::Volume(TVolumeInfo &, int) const'
undefined reference to `RFile::Replace(RFs &, TDesC16 const &, unsigned int)' и т.п.
В чем я ошибаюсь?
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 27 Июл - 6:02

Не находит/не линкует либу efsrv.lib
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 27 Июл - 9:43

Спасибо, Нех! Указанную либ подключил часть ошибок исчезла, но осатальные остались. Скоро мозг лопнет разбираться откуда "ноги растут". Не подскажешь ещё?
Характерные ошибки:
Undefined symbol: 'void User::__DbgMarkStart(enum RHeap::TDbgHeapType) (?__DbgMarkStart@User@@SAXW4TDbgHeapType@RHeap@@@Z)'
>referenced from 'int E32Main(void) (?E32Main@@YAHXZ)' in commonframework.h:27
Undefined symbol: 'class CTrapCleanup * CTrapCleanup::New(void) (?New@CTrapCleanup@@SAPAV1@XZ)'
>referenced from 'int E32Main(void) (?E32Main@@YAHXZ)' in commonframework.h:28
Undefined symbol: 'void RHandleBase::Close(void) (?Close@RHandleBase@@QAEXXZ)'
>referenced from 'int startupThread(void) (?startupThread@@YAHXZ)' in up_exe.cpp:177 (eexe.lib)
Undefined symbol: 'void UserSvr::BlockThreads(enum TBlockType) (?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z)'
>referenced from 'int startupThread(void) (?startupThread@@YAHXZ)' in up_exe.cpp:155 (eexe.lib)
>referenced from 'int startupThread(void) (?startupThread@@YAHXZ)' in up_exe.cpp:163 (eexe.lib)
>referenced from 'int startupThread(void) (?startupThread@@YAHXZ)' in up_exe.cpp:205 (eexe.lib)
Заранее благодарен!
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 27 Июл - 9:47

И еще забыл спросить. CommonFramework.h требует какой-либо доработки или остается as is? Хедер взял из include (впрочем он одинаковый от Symbian 6 до 9 и разных платформ)
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 27 Июл - 13:02

Ничего в CommonFramework.h менять не надо. Важно, чтобы у тебя в сишнике куда ты инклудишь CommonFramework.h, была функция doExampleL(). Это типа "main". Сам можешь глянуть в CommonFramework.h чтобы понять зачем doExampleL().

И еще надо линковать euser.lib.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Чт 27 Июл - 14:46

Я так понимаю ты ща пытаешься сдампить какую-то нокию на symbian 9.x Может тебе быстрее было бы прошивку взять и flash cleaner'om по ней пройтись...
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Пт 28 Июл - 3:43

Посмотрел commonframework.h (уже в н-ый раз Smile ), там только LOCAL_C void doExampleL(); // code this function for the real example. Понять из этого, что же делает doExampleL, пока не представляю как. Насколько я себе представлял, в хедере мы ее просто описываем и выделяем память, а в приведенном вами коде уже расписываем сами действия?! На всякий приведу содержимое commonframework.h, может просто не стем файлом работаю?
А по поводу дампа, работаю с 9300. Хочу все-таки разобраться в вашей программе и посчитывать данные с ее помощью. Болшое спасибо за помощь!
#ifndef __EUSTD_H
#define __EUSTD_H

#include <e32base.h>
#include <e32cons.h>

_LIT(KTxtEPOC32EX,"EPOC32EX");
_LIT(KTxtExampleCode,"E32 SDK Example Code");
_LIT(KFormatFailed,"failed: leave code=%d");
_LIT(KTxtOK,"ok");
_LIT(KTxtPressAnyKey," [press any key]");

// public
LOCAL_D CConsoleBase* console; // write all your messages to this
LOCAL_C void doExampleL(); // code this function for the real example

// private
LOCAL_C void callExampleL(); // initialize with cleanup stack, then do example

GLDEF_C TInt E32Main() // main function called by E32
{
__UHEAP_MARK;
CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
TRAPD(error,callExampleL()); // more initialization, then do example
__ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error));
delete cleanup; // destroy clean-up stack
__UHEAP_MARKEND;
return 0; // and return
}

LOCAL_C void callExampleL() // initialize and call example code under cleanup stack
{
console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
CleanupStack::PushL(console);
TRAPD(error,doExampleL()); // perform example function
if (error)
console->Printf(KFormatFailed, error);
else
console->Printf(KTxtOK);
console->Printf(KTxtPressAnyKey);
console->Getch(); // get and ignore character
CleanupStack::PopAndDestroy(); // close console
}

#endif
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Пт 28 Июл - 3:53

После подключения euser.lib осталось 3 ошибки,как раз ссылающихся на doExampleL, а разобраться уж очень охото:
>Undefined symbol: 'RFileWriteStream::RFileWriteStream(class RFile &, int) (??0RFileWriteStream@@QAE@AAVRFile@@H@Z)'
>referenced from 'void doExampleL(void) (?doExampleL@@YAXXZ)' in dump.cpp:168

>Undefined symbol: 'void RWriteStream::WriteInt32L(long) (?WriteInt32L@RWriteStream@@QAEXJ@Z)'
>referenced from 'void doExampleL(void) (?doExampleL@@YAXXZ)' in dump.cpp:201

>Undefined symbol: 'void RWriteStream::CommitL(void) (?CommitL@RWriteStream@@QAEXXZ)'
>referenced from 'void doExampleL(void) (?doExampleL@@YAXXZ)' in dump.cpp:205
>referenced from 'void doExampleL(void) (?doExampleL@@YAXXZ)' in dump.cpp:211
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Пт 28 Июл - 6:43

это в либе estor.lib Smile

Ты просто в хелпе, в поиске вводи имена классов. Для RFileWriteStream оно тебе выведет:

Location: s32file.h
Link against: estor.lib

Ты близок к цели! cheers
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Пт 28 Июл - 8:05

sunny Все получилось! Большое спасибо за терпение, помощь и ценные советы!
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Пт 28 Июл - 8:48

Поздравляю! Дампом поделись Smile А то от 9300 тяжело найти.
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Вс 30 Июл - 23:54

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

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Пн 31 Июл - 4:47

Попробуй дампить вот так:
Код:

RFile DumpFile;
_LIT(DmpFile,"E:\\Dump.bin");
DumpFile.Replace(Fs,DmpFile,EFileShareExclusive | EFileWrite);

TPtrC8 DataToDump((TUint8*)0x50000000,DumpSize);

TRequestStatus Status;
DumpFile.Write(DataToDump,Status);
User::WaitForRequest(Status);

DumpFile.Flush();
DumpFile.Close();

Задай для начала DumpSize = 0x1000. Если получившийся дамп не будет забит нолями то увеличивай размер. Если нет - пиши что получилось. Будем думать дальше.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реверсинг в Симбиан   Пн 31 Июл - 4:56

Скомпиленый дампер для Series 60:
http://extint.narod.ru/Files/S60dumper.rar
Сорцы дампера для Series 60:
http://extint.narod.ru/Files/S60dumper_src.rar
Вернуться к началу Перейти вниз
Посмотреть профиль
Lehin



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

СообщениеТема: Re: Реверсинг в Симбиан   Вт 1 Авг - 2:14

Программу для S60 перенес на S80, все работает и дампит Smile Только ламерский вопрос Embarassed какой конечный адрес прошивки. Никак не могу найти (или плохо ищу.... )
Вернуться к началу Перейти вниз
Посмотреть профиль
Спонсируемый контент




СообщениеТема: Re: Реверсинг в Симбиан   

Вернуться к началу Перейти вниз
 
Реверсинг в Симбиан
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 3На страницу : 1, 2, 3  Следующий

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