subj т.е. по ходу работы скрипта имеем значение например eax=0x45454545, нужно извлечь al в переменную al, чтоб она считалась Идой как BYTE.
А я не знаю достаточно или нет, получится вообще-то DWORD 0x00000045, а если далее мне нужно сделать somebyte = somebyte ^ al
Asterix Или я чего-то не понял?... Зачем? Только если для собственного спокойствия. ;о) IDC вообще ничего не знает про 'byte', 'dword' и т.п. Там формально всего два типа - числовой ('long') и строковый. (Обрати внимание, что idc.idc все функции, работающие с байтами, все равно принимают и возвращают тип 'long'.) После '0x45454545 & 0xFF' получаешь числовое значение, укладывающееся в размер 'byte', но никак в этом смысле не выделенное. Присвой это значение новой переменной и работай с ней как с 'byte' без всяких '& 0xFF'.
> Или я чего-то не понял?... Зачем? Потому что буквально в каждой строчке из байта получается WORD, например что-то с ним сложили, тогда нужно опять взять байт, т.е. опять сделать & 0xFF, вот и получается практически в каждой строке Код (Text): while(1) { mybyte = Byte(eax); mybyte = (mybyte + 1) & 0xFF; // inc byte ptr [eax] cl = ecx & 0xFF; mybyte = (mybyte + cl) & 0xFF; // add [eax], cl mybyte = (mybyte >> 6)|(mybyte << (8 - 6)); // ror byte ptr [eax], 6 mybyte = (mybyte ^ cl) & 0xFF; // xor [eax], cl PatchByte(eax, mybyte); eax++; // inc eax ecx--; // dec ecx if(ecx==0) // test ecx, ecx { Message("%x\n", eax); break; // jnz loc_444AE7 } }
Понял. Хотя, в данном конкретном случае всеми выходящими за пределы байта разрядами можно спокойно пренебречь! Они ведь никак не влияют на результат последующих вычислений. Только в '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. Кстати, как правильно отступы в программах делать, а я кодов для этого не нашел в "Что это"?
Тут многое что "можно опустить" было сделано для наглядности и то что некоторые & 0xFF можно убрать я видел, но не было задачи вылизать скрипт. ЗЫ: нужно использовать тег CODE
Конечно, это далеко не всегда нужно. Я тоже лишь хотел показать, что 'byte' в IDC также не всегда нужно столь тщательно "облизывать"... ;о) За 'CODE' спасибо, а то я здесь его упоминания не видел. :beer:
Asterix писал: Мля, ну и гемор, при работе с байтом буквально в каждой строчке нужно лепить & 0xFF %) Воспльзоваться дефайнами