Сейчас на форуме: (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Пользовательский алгоритм hash суммы, нужны подсказки по псевдокоду IDA
Посл.ответ Сообщение

Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 31 июля 2010 00:06 · Поправил: ohos
· Личное сообщение · #1

Приветствую, из одной программы мне необходимо получить алгоритм формирования hash суммы по группе чисел, исходный код работы функции достал с помощью IDA pro, но он написан псевдокодом и некоторые небольшие его части не совсем понятны, для наглядности псевдокод:

Code:
  1. ...
  2. //все v№ являются переменными, ItemID, boundType, SerialID?, hash_sum - тоже переменные, просто с заданным именем
  3.  
  4. //тут строка разбирается на переменные
  5. v3 = sscanf(
  6.          Src,
  7.          "|Hitem:%x %x %x %x %x %x %x %x %x %x %x %x",
  8.          &ItemID,
  9.          &boundType,
  10.          &SerialID?,
  11.          &v27,
  12.          (char *)&v27 + 4,
  13.          &v28,
  14.          &v29,
  15.          (char *)&v29 + 4,
  16.          &v30,
  17.          &v31,
  18.          &v32,
  19.          &hash_sum);
  20.   if ( v3 == 1 )
  21.   {
  22.     ...
  23. //не важно что в этой части, она мне и так ясна и не нужна
  24.   }
  25.   else
  26.   {
  27.     if ( v3 == 12 )
  28.     {
  29. //нужный мне код тут
  30.       v9 = 0;
  31.       v7 = ItemID + boundType + SerialID? + v27 + HIDWORD(v27) + *(_DWORD *)&v28 + v29 + HIDWORD(v29) + v30 + v31 + v32;
  32.  
  33. //1 непонятка: что такое HIDWORD и *(_DWORD *)& ?
  34.       v8 = 0;
  35.       do
  36.       {
  37.         v10 = *(&ItemID + v9);
  38.         v11 = (unsigned int)*(&ItemID + v9) >> v8;
  39. //2 непонятка: что означают символы >> ?
  40.         v12 = v7 + v9 * *(&ItemID + v9);
  41.         v8 += 16;
  42.         ++v9;
  43. //3 непонятка: выражение ++v9 равносильно v9 = v9 + 1?
  44.         v7 = v10 ^ (v12 + v11);
  45.       }
  46.       while ( v8 < 176 );
  47.       v13 = 0;
  48.       do
  49.       {
  50.         v14 = *(&ItemID + v13);
  51.         v15 = v7 * (v14 + 1) + ((unsigned int)(v7 * (v14 + 1) * *(&ItemID + v13++)) >> 16);
  52. //4 непонятка: в каком порядке выполняются действия в выражении "ItemID + v13++"?
  53.         v7 = v14 ^ v15;
  54.       }
  55.       while ( v13 < 11 );
  56.       if ( (unsigned __int16)v7 == hash_sum )
  57.       {
  58. ...
  59.  
  60. //дальше код уже не важен, так как полученное число в v7 должно равняться hash_sum, а его получение по предыдущему коду и будет алгоритмом hash суммы <img src="http://exelab.ruimg/smilies/s3.gif" border="0" align="" alt="">
  61.  


отдельный список вопросов по этому псевдокоду:

//1 непонятка: что такое HIDWORD и *(_DWORD *)& ? (изменяют ли они значение переменной или просто указывают на тип?)

//2 непонятка: что означают символы >> ?

//3 непонятка: выражение ++v9 равносильно v9 = v9 + 1?

//4 непонятка: в каком порядке выполняются действия в выражении "ItemID + v13++"? (сперва считается сумма ItemID + v13 и только потом v13 увеличивается на 1?)

p.s. в качестве проверочного числа можно использовать 3185b 1 4c1dea3f 0 0 0 0 0 0 0 0 697a (символ пробела тут разделитель чисел), из-за непоняток я не могу сам проверить, по крайней мере нужно мне разъяснить возникшие непонятки, а дальше я уже сам




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 31 июля 2010 00:47 · Поправил: neomant
· Личное сообщение · #2

Неплохо бы было для начала определиться с типами параметров.
1 Предполагаю, что v27 типа signed __int64, тогда HIDWORD должен возвращать старшее двойное слово.
*(_DWORD *)& - это приведение типов. Дословно можно сказать так: адрес переменной v28 приводится к указателю на DWORD и берется его значение, а прощё, если я правильно догадываюсь и v28 имеет тип как и v27, то это LODWORD или младшее двойное слово.
2 >> стандартная операция шифта(сдвига) на >> n разрядов вправо.
3 Да. Это префексный инкремент.
4 Постфиксный инкремент и ваше предположение верно.

-----
Следуй за белым кроликом





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 31 июля 2010 11:00
· Личное сообщение · #3

Хексрейс выдает настолько жутко читаемый/понимаемый код,
что лучше сделать рип асм кода, проще будет.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 31 июля 2010 13:09
· Личное сообщение · #4

neomant, а как эта операция сдвига выполняется, можно наглядный пример? (просто уверен, что разработчики писали исходный код не на асме и поэтому такая операция должна иметь где-то простой вид)

Coderess, что значит "сделать рип асм кода"? т.е. просто взять сырой асм код и разбирать его? просто не смотря на читаемость хексрейного кода, этот исходник достаточно мал, за исключением обозначенных непоняток




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 31 июля 2010 14:32
· Личное сообщение · #5

В хексрейсах тоже как бы было понятно. Вся непонятка там в типах и в приведениях типов.
А операция шифт очени проста, например:
1111001100101111 >> 4 == 0000111100110010

-----
Следуй за белым кроликом





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 31 июля 2010 15:19
· Личное сообщение · #6

Для меня куда проще сделать рип чем разбираться с приведением типов в сишнике, зачем разбирать рипнуть так что бы передавать свои аргументы

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 31 июля 2010 17:20 · Поправил: ohos
· Личное сообщение · #7

а символ ^ тут означает операцию деления или возведения в степень?

а если например применять операцию сдвига к 1101 >> 5, то каков будет результат? 0000 ?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 31 июля 2010 18:31
· Личное сообщение · #8

^-xor это, почитай уже про язык си и завязывай с этими вопросами. Или читай асм-листинг, утомил уже, есть же гугл.




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 31 июля 2010 19:16
· Личное сообщение · #9

Ну да. Обычные сишные операции.

-----
Следуй за белым кроликом



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


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