Сейчас на форуме: _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых) |
eXeL@B —› Основной форум —› ror и rol в IDA. |
Посл.ответ | Сообщение |
|
Создано: 13 сентября 2005 09:02 · Личное сообщение · #1 |
|
Создано: 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. |
|
Создано: 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; } |
|
Создано: 13 сентября 2005 17:50 · Личное сообщение · #4 |
|
Создано: 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; } |
|
Создано: 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 |
|
Создано: 14 сентября 2005 20:50 · Поправил: Devil · Личное сообщение · #7 |
|
Создано: 15 сентября 2005 01:26 · Личное сообщение · #8 |
|
Создано: 15 сентября 2005 10:24 · Личное сообщение · #9 |
eXeL@B —› Основной форум —› ror и rol в IDA. |