eXTracted INternals

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

Поделиться | 
 

 Плагин для поиска уникодовых строк в коде Symbian

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



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пн 19 Ноя - 16:04

Hex, я взял за основу этот плагин и решил сделать поисквик unicode-строк

Всё тоже, кроме функции run
Вот её код:
Код:

   segment_t * scan_seg = getseg(get_screen_ea());
   
   ea_t scan_end = 0;
   ea_t scan_start=0;
   ea_t func_addr = get_screen_ea();

   switch (askbuttons_c("Òåêóùèé ñåãìåíò", "Âåñü ôàéë", "Îòìåíà", 3, "Âûáåðèòå äèïàçîí ïîèñêà"))
   {
   case 1:
      scan_start = scan_seg->startEA;   
      scan_end = scan_seg->endEA;
      break;   
   case 0:
      scan_start=getnseg(0)->startEA;
      scan_end=getnseg(get_segm_qty()-1)->endEA;
      break;
   default:
      return;
   }

   ea_t scan_addr = scan_start;
   

   char buf[QMAXFILE];
   buf[0]=0;
   if (get_idp_name(buf,QMAXFILE))
   {
      if (!lstrcmp(buf,"arm")) //ARM processor
      {   
         msg("Searching unicode strings...\n");
         do
         {
            bool found;
            ea_t ends=0;
            uchar l1=0,l2=0,l3=0,l4=0,b1=0,b2=0,z1=1,z2=1;
            found=FALSE;
            if (!isCode(getFlags(scan_addr)))
            {
               l1 = get_byte(scan_addr);
               l2 = get_byte(scan_addr+1);
               l3 = get_byte(scan_addr+2);
               l4 = get_byte(scan_addr+3);
               if(l1>1 && l2==l3==l4==0)
               {
                     ulong count=0;   
                      z1=get_byte(scan_addr+4+l1*2);
                     z2=get_byte(scan_addr+5+l1*2);
                     if(z1==0 && z2==0)
                     {
                        count++;
                        for(uchar i=0;i<l1;i++)
                        {
                           b1=get_byte(scan_addr+4+2*i);
                           b2=get_byte(scan_addr+5+2*i);
                           if(b2==0 && (b1>='A' && b1<='z')) count++;
                        }
                        if(count==l1) found=TRUE;
                     }
               }                  
            }
            if(found==TRUE)
            {
               
               
               msg("%X: l1=%X l2=%X l3=%X l4=%X b1=%X b2=%X z1=%X z2=%X\n",scan_addr+4,l1,l2,l3,l4,b1,b2,z1,z2);
               scan_addr=scan_addr+l1*2+4+2;               
            }
            else if(found==FALSE) scan_addr=scan_addr+1;
            
         }while(scan_addr<scan_end);
      }      
   }
   msg("Done!\n");

Но к сожалению он не совсем работает, бывают ложные срабатывания. Буду благодарен если укажеш на ошибки или доведёш до ума.
Вернуться к началу Перейти вниз
Посмотреть профиль
twit



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пн 19 Ноя - 16:07

Этот код, как мне кажется, самый упрошённый, был сложнее, но ида вела себя не так. как я хотел. Например get_long() возврашало байт а не лонг. И scan_end почему-то указывает не в конец сегмента/файла, а на немного ранний кусок.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пн 19 Ноя - 17:15

Судя по коду это ты для симбиановских литералов (_LIT) делаешь.
get_long() в иде работает правильно. Байты 10 00 00 00 - это 0x10 Long. С чего ты решил что это байт, не знаю.

Юзай GetStringTypeEx() для проверки символов уникодовой строки вместо сравнения с 'A'-'Z'.
Пример юзанья можешь лицезреть тут:
http://reng.ru/board/viewtopic.php?p=17313#17313
В строках не только буквы, но и всякие там подчеркивания, проценты, цифры и т.д. проскакивают.

scan_addr можно смело инкрементить на 4. Потому что в ARM'e выравнивание по 4 байта.

И еще ты можешь на всякий случай проверять на 0 значение двух байтов после строки. Строки-то Zero-terminated. Это снизит количество ложных срабатываний.
Вернуться к началу Перейти вниз
Посмотреть профиль
twit



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пн 19 Ноя - 23:59

Я понимаю, что 0x10 может быть лонг, но у меня например 47 23 F5 D2,
а get_long() возвращает 0x47, всёравно уже буду get_byte() использовать.
Про видимые символы я и правда не подумал Smile
За пример спаибо.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Вт 20 Ноя - 1:54

twit пишет:
Я понимаю, что 0x10 может быть лонг, но у меня например 47 23 F5 D2,
а get_long() возвращает 0x47, всёравно уже буду get_byte() использовать.
Не может этого быть. Лоадеры симбиана юзают get_long() и все замечательно. Что-то тут не то... scratch
Вернуться к началу Перейти вниз
Посмотреть профиль
twit



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Ср 21 Ноя - 14:51

Гррррр. Не работает.
Пробовал несколько вариантов, остановился пока на таком
Код:

msg("Searching unicode strings...\n");
         do
         {
            ea_t ends=0;
            uchar l=0,l1=0,l2=0,l3=0,l4=0,z1=1,z2=1;
            unsigned short* buf;
            if (!isCode(getFlags(scan_addr)))
            {
               l1 = get_byte(scan_addr);
               l2 = get_byte(scan_addr+1);
               l3 = get_byte(scan_addr+2);
               l4 = get_byte(scan_addr+3);
               l  = l1^(l2<<8)^(l3<<16)^(l4<<24);
               
            //   l=get_long(scan_addr);
               msg("Processing - %X  ScanAddr= %X\n",l,scan_addr);
               
               z1=get_byte(scan_addr+l*2+4);
               z2=get_byte(scan_addr+l*2+5);
               msg("z1=%X z2=%X\n",z1,z2);
               if(z1==0 && z2==0)
               {
                  msg("Try to creating buf");
                  buf=new wchar_t[l];
                  msg("Buf created");
                  get_many_bytes(scan_addr+4,buf,l*2);
                  msg("Bytes copyed");
                  if(IsValid(scan_addr+4,l*2))
                  {
                     msg("%X: Unicode detected\n",scan_addr);
                     scan_addr+=l;
                  }
                  else scan_addr+=4;
                  delete buf;
               }
               else scan_addr+=4;
            }
            
         }while(scan_addr<scan_end);

Код:

bool IsValid(ea_t addr,size_t size)
{
   for(int i=0;i<=size;i+=2)
      if(!isgraph(get_byte(addr+i))) return FALSE;
   return TRUE;
}


пробовал так:

Код:

bool IsValidStr(wchar_t * str, int iStringLen)
{

  WORD * CharInfo=new WORD[iStringLen];

  GetStringTypeExW(LOCALE_SYSTEM_DEFAULT,CT_CTYPE1,str,iStringLen,CharInfo);
 
  long res=0 ;
  for (int i=0;i<iStringLen;i++)
  {
     bool has_upper=false;
     bool has_lower=false;
     bool has_numer=false;
      bool has_punct=false;
      if (CharInfo[i] & C1_UPPER)
      {
        has_upper=true;
      }

      if (CharInfo[i] & C1_LOWER)
      {
        has_lower=true;
      }

      if (CharInfo[i] & C1_DIGIT)
      {
        has_numer=true;
      }

      if (CharInfo[i] & C1_PUNCT)
      {
        has_punct=true;
      }
     int n=has_upper+has_lower+has_numer+has_punct;
     if(n>2)  res++;
  }
  delete CharInfo;


  if (res==iStringLen)
      return true;

  return false;
}

Но исход один и тот же.
Это вроде как отладочная версия с выводом сообщение в лог,
так вот несколько раз она проходит, а потом зависает на вычислении z1 и z2. При этом l=0x70 scan_addr=0x802C
Что делать не знаю Sad
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Чт 22 Ноя - 3:43

twit пишет:
Что делать не знаю Sad
Развивать навыки программирования и изучать SDK иды чщательнее Smile

Код:

bool IsValidStr(wchar_t * str, int iStringLen)
{

   WORD * CharInfo=new WORD[iStringLen];

   GetStringTypeExW(LOCALE_SYSTEM_DEFAULT,CT_CTYPE1,str,iStringLen,CharInfo);

   long res=0 ;
   for (int i=0;i<iStringLen;i++)
   {
      bool has_upper=false;
      bool has_lower=false;
      bool has_numer=false;
      bool has_punct=false;
      if (CharInfo[i] & C1_UPPER)
      {
         has_upper=true;
      }

      if (CharInfo[i] & C1_LOWER)
      {
         has_lower=true;
      }

      if (CharInfo[i] & C1_DIGIT)
      {
         has_numer=true;
      }

      if (CharInfo[i] & C1_PUNCT)
      {
         has_punct=true;
      }
      res+=(has_upper | has_lower | has_numer | has_punct);
   }
   delete CharInfo;


   if (res==iStringLen)
      return true;

   return false;
}

void DoReallyUnknown(ea_t Start, unsigned long Len)
{
   for (ea_t i=Start;i<(Start+Len);i++)
   {
      do_unknown(i,true);
   }
   
}

#define BUFFER_SIZE 0x100
void FindInSegment(segment_t * pSeg)
{
   
   wchar_t Buffer[BUFFER_SIZE];
   ea_t Addr=pSeg->startEA;
   while(Addr<pSeg->endEA)
   {
      unsigned long StrLength=get_long(Addr);
      unsigned long UnicodeLen=StrLength*2;
      if ( (StrLength>2) && (StrLength<BUFFER_SIZE) && (UnicodeLen < (pSeg->endEA-(Addr+4))) )
      {
         if (get_word(Addr+4+UnicodeLen)==0)
         {
            get_many_bytes(Addr+4,Buffer,UnicodeLen);
            if (IsValidStr(Buffer,StrLength))
            {
               msg("%08X\n",Addr);
               DoReallyUnknown(Addr,StrLength+4);
               make_ascii_string(Addr,0,ASCSTR_ULEN4);

               Addr+=UnicodeLen;
               Addr&=0xFFFFFFFC;
               continue;
            }
         }
         
      }

      Addr+=4;
   }
}

void idaapi run(int arg)
{
   int SegCount=get_segm_qty();
   for (int i=0;i<SegCount;i++)
   {
      FindInSegment(getnseg(i));
   }
}
Вернуться к началу Перейти вниз
Посмотреть профиль
twit



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пт 23 Ноя - 2:44

Спасибо, все работает Smile
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пт 23 Ноя - 4:48

Я наверно эту фичу добавлю в лоадеры symbian...
Вернуться к началу Перейти вниз
Посмотреть профиль
twit



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пт 23 Ноя - 5:12

Это будет еще лучше
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пт 30 Ноя - 7:07

Не блин, иде пофиг. Она нагло уничтожает созданые лоадером строки. Надо разбираться как убирать их из автоанализа, возможно тогда будет что-то нормальное. А если не придумаю - придется все оставить в виде плагина.
Вернуться к началу Перейти вниз
Посмотреть профиль
undersun



Количество сообщений : 7
Дата регистрации : 2008-05-14

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Ср 14 Май - 6:05

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



Количество сообщений : 57
Дата регистрации : 2007-07-24

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Чт 15 Май - 11:56

undersun пишет:
Если не сложно, выложите бинарник этого плагин.
Под какую версию IDA ?

А впрочем вот:
для 5.0: not avalible
для 5.2: not avalible


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



Количество сообщений : 7
Дата регистрации : 2008-05-14

СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   Пт 16 Май - 6:24

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




СообщениеТема: Re: Плагин для поиска уникодовых строк в коде Symbian   

Вернуться к началу Перейти вниз
 
Плагин для поиска уникодовых строк в коде Symbian
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1
 Похожие темы
-
» Зависимость глубины поиска от диаметра поисковой катушки.
» Конструктор из строк с похожими окончаниями
» 24 апреля 2014 г, "Надежды маленький оркестрик под управлением любви" к 90-летию Б.Ш.Окуджавы, ММДМ, Камерный зал, Москва
» Лес вокруг стадиона
» Вне строк, времени и пространства

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