IDA -> idc -> Как из значения типа DWORD сделать BYTE?

Тема в разделе "WASM.RESEARCH", создана пользователем Asterix, 12 мар 2005.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    subj



    т.е. по ходу работы скрипта имеем значение например eax=0x45454545,

    нужно извлечь al в переменную al, чтоб она считалась Идой как BYTE.
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    А разве в IDC не достаточно сделать &= 0xff чтобы получить младший байт?
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    А я не знаю достаточно или нет, получится вообще-то

    DWORD 0x00000045, а если далее мне нужно сделать

    somebyte = somebyte ^ al
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    это нормально. & 0xff и потом делай с ним что хошь.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Мля, ну и гемор, при работе с байтом буквально в каждой строчке нужно лепить & 0xFF %)
     
  6. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Asterix



    Или я чего-то не понял?... Зачем? Только если для собственного спокойствия. ;о)

    IDC вообще ничего не знает про 'byte', 'dword' и т.п. Там формально всего два типа - числовой ('long') и строковый. (Обрати внимание, что idc.idc все функции, работающие с байтами, все равно принимают и возвращают тип 'long'.)

    После '0x45454545 & 0xFF' получаешь числовое значение, укладывающееся в размер 'byte', но никак в этом смысле не выделенное. Присвой это значение новой переменной и работай с ней как с 'byte' без всяких '& 0xFF'.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > Или я чего-то не понял?... Зачем?



    Потому что буквально в каждой строчке из байта получается WORD, например что-то с ним сложили, тогда нужно опять взять байт, т.е. опять сделать & 0xFF, вот и получается практически в каждой строке


    Код (Text):
    1. while(1)
    2.     {
    3.         mybyte = Byte(eax);
    4.         mybyte = (mybyte + 1) & 0xFF;                 // inc     byte ptr [eax]
    5.         cl = ecx & 0xFF;
    6.         mybyte = (mybyte + cl) & 0xFF;                // add     [eax], cl
    7.         mybyte = (mybyte >> 6)|(mybyte << (8 - 6));   // ror     byte ptr [eax], 6
    8.         mybyte = (mybyte ^ cl) & 0xFF;                // xor     [eax], cl
    9.         PatchByte(eax, mybyte);
    10.         eax++;                                        // inc     eax
    11.         ecx--;                                        // dec     ecx
    12.         if(ecx==0)                                    // test    ecx, ecx
    13.         {
    14.             Message("%x\n", eax);
    15.             break;                                    // jnz     loc_444AE7
    16.         }
    17.     }
     
  8. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Понял.

    Хотя, в данном конкретном случае всеми выходящими за пределы байта разрядами можно спокойно пренебречь! Они ведь никак не влияют на результат последующих вычислений. Только в 'ror':



    mybyte = Byte(eax); // здесь все старший разряды отсекаются!

    mybyte = mybyte + 1; // если и будет перенос в следующий байт, он не важен!

    // cl = ecx & 0xFF; // можно и опустить

    mybyte = (mybyte + ecx) & 0xFF; // вот здесь - да! - иначе 'ror' будет вычислен неправильно

    mybyte = (mybyte >> 6)|(mybyte << (8 - 6)); //

    mybyte = (mybyte ^ cl) // & 0xFF; // и здесь значение "лишние биты" значения не имеют

    // PatchByte(eax, mybyte);

    PatchByte(eax, (mybyte & 0xFF)); // здесь вроде бы тоже по прототипу не нужно, но...





    PS. Кстати, как правильно отступы в программах делать, а я кодов для этого не нашел в "Что это"?
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Тут многое что "можно опустить" было сделано для наглядности и то что некоторые & 0xFF можно убрать я видел, но не было задачи вылизать скрипт.



    ЗЫ: нужно использовать тег CODE
     
  10. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138


    Конечно, это далеко не всегда нужно. Я тоже лишь хотел показать, что 'byte' в IDC также не всегда нужно столь тщательно "облизывать"... ;о)



    За 'CODE' спасибо, а то я здесь его упоминания не видел.

    :beer:
     
  11. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    тут действительно не нужно
     
  12. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Asterix писал:

    Мля, ну и гемор, при работе с байтом буквально в каждой строчке нужно лепить & 0xFF %)

    Воспльзоваться дефайнами :derisive: