Сейчас на форуме: _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых)

 eXeL@B —› Основной форум —› ror и rol в IDA.
Посл.ответ Сообщение

Ранг: 33.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2005 09:02
· Личное сообщение · #1

Здраствуйте. Подскажите как можно заменить операции ror и rol в скрипте IDA?



Ранг: 33.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2005 16:53
· Личное сообщение · #2

Спасибо за ответы
Вот алгоритм(paskal), может кому пригодится; переделать под IDA проще простого, пока не могу, т.к. на лекции, и ИДЫ нет под рукой

Сдвиг на один бит двойного слова вправо:

var
a, b: longint;
begin
a:= $38; //типа само число
b:= a and 1; //получаем последний бит
a:= a div 2; //сдвигаем на один бит вправо.
if b = 1 then
a:= a or $80000000;
end.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 сентября 2005 17:45
· Личное сообщение · #3

Скрипт под IDA

//type=0x20 - DD сдвиг в дв. слове
//type=0x10 - DW в слове
//type=0x8 - DB в байте

static ROR(num, count, type)
//num - число
//count - на сколько
{
auto a,numcur,ror_hi,ror_low,ror, cnt;

cnt=(count % type);
a=type-count;
numcur=num;
if (numcur<0) {
numcur=numcur&0x7FFFFFFF;
ror_low=numcur>>count;
ror_low=ror_low | (1<<(a-1));
}
else
ror_low=numcur>>count;

numcur=num;
ror_hi=numcur<<a;
ror=ror_hi | ror_low;
if (type == 8) ror = ror & 0x000000FF;
if (type == 0x10) ror = ror & 0x0000FFFF;

return ror;
}



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 13 сентября 2005 17:50
· Личное сообщение · #4

Мда, как все запущено

somebyte = (somebyte >> 6)|(somebyte << (8 - 6));   // ror     byte ptr [eax], 6




Ранг: 33.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 14 сентября 2005 07:38 · Поправил: Devil
· Личное сообщение · #5

Asterix

А если мне нужно сдвинуть на 44h бит, например? Ведь придётся брать в руки калькулятор и вычитать по 8 много-много раз Для таких случаев вот процедура(мой вариант; окончательная версия):

//addr - адрес числа
//count - на сколько бит сдвигать
//sz - размер операнда (sz = 1: байт, sz = 2: слово, sz = 4: двойное слово)
//where - сдвиг влево/вправо (where = 0: вправо, else влево)

static rox(addr, count, sz, where)
{
auto a, b, c;
if (sz == 1) { b = Byte(addr); } //получить байт
if (sz == 2) { b = Word(addr); } //получить слово
if (sz == 4) { b = Dword(addr);} //получить двойное слово
Message("b = %x\n", b);
for(a = 0; a < count; a = a + 1)
{
if (where == 0) //если сдвигаем вправо
{
c = b & 1; //получим последний бит
b = b >> 1; //сдвиним на один бит вправо
}
else //если сдвигаем влево
{
if (sz == 1) { c = b & 0x80; c = c >> 0x7; } //получаем первый бит.
if (sz == 2) { c = b & 0x8000; c = c >> 0xF; }
if (sz == 4) { c = b & 0x80000000; c = c >> 0x1F; }
b = b << 1; //влево на один бит
if (sz == 1) { b = b & 0xFF; }
if (sz == 2) { b = b & 0xFFFF;}
//if (sz == 4) { b = b & 0xFF; }
}
if (c == 1) //если первый или последний бит не 0, то...
{
if (where == 0) //если сдвигаем вправо
{
if (sz == 1) { b = b | 0x80; }
if (sz == 2) { b = b | 0x8000; }
if (sz == 4) { b = b | 0x80000000; }
}
else { b = b | 1; } //если сдвигаем влево
}
}
return b;
}



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 14 сентября 2005 14:39 · Поправил: Asterix
· Личное сообщение · #6

Devil пишет:
А если мне нужно сдвинуть на 44h бит, например?


А смысл?


Для DWORD'а вместо 8 должно быть 32
в данном случае сдвигать можно от 0 до 32 включительно

somedword = (somedword >> 6)|(somedword << (32 - 6)); // ror dword ptr [eax], 6
somedword = (somedword << 6)|(somedword >> (32 - 6)); // rol dword ptr [eax], 6



Ранг: 33.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 14 сентября 2005 20:50 · Поправил: Devil
· Личное сообщение · #7

Я сейчас сижу над Obsidium'ом, там есть такие команды дешифрования: "ror word ptr [edi], 44h".

Asterix
А что делает процедура "rotate_byte" в <idc.idc>?



Ранг: 62.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 15 сентября 2005 01:26
· Личное сообщение · #8

Devil
44h % sz



Ранг: 33.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 15 сентября 2005 10:24
· Личное сообщение · #9

ASMax
Asterix
Благодарен


 eXeL@B —› Основной форум —› ror и rol в IDA.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати