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

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

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

Создано: 29 января 2012 11:02 · Поправил: Yuri4850
· Личное сообщение · #1

Очень интересует, что тут происходит:

Code:
  1.   int a1, char a2
  2.   int v3; // edx@2
  3.   int v4; // ST14_4@2
  4.  
  5.   if ( *(_BYTE *)(a1 + 8) )
  6.   {
  7.     v3 = (int)L"1";
  8.     if ( !a2 )
  9.       v3 = (int)"0";
  10.   }
  11.   else
  12.   {
  13.     LOBYTE(v4) = a2;
  14.     v3 = v4;
  15.   }




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 29 января 2012 11:25
· Личное сообщение · #2

Это не псевдо, а обычный, си код судя по всему вздёрнутый hex-rays'ом, плохо не понимать си. Рискну объяснить "по-человечески":

Code:
  1. если int данных расположенных по адресу [a1 + 8], то выполняем следующее <b>условие</b>:
  2.     присвоить переменной v3 преобразованию в целочисленное значение из буквы "1" в юникодовой кодировке
  3.     если (буквенной) переменной a2 присвоено нулевое значение (код буквы 0x00) тогда выполним следующее <b>подусловие</b>:
  4.         значению переменной v3 присвоим значение "0" (или 0x30 в шестнадцатеричном представлении)
  5.     <b>закрываем</b> выполнение подусловия
  6.  
  7. иначе
  8.  
  9.     первому байту в представлении значения переменной v4(её размерность в данный момент равна 4 байтам, это стандартное значения для представления типа данных int) присвоим значение переменной a2
  10.     переменной v3 присвоим значение переменной v4
  11.  
  12. <b>окончим условие</b>


-----
все багрепорты - в личные сообщения




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

Создано: 29 января 2012 11:36 · Поправил: Yuri4850
· Личное сообщение · #3

Да, это хексрейс.

Так правильно будет (если не заниматься приведением типов и считать, что все это просто целые числа):

Code:
  1. если по адресу [a1+8] не 0,
  2.     то
  3.         v3 = 1;
  4.         если a2 == 0, то v3 = 0;
  5.     иначе
  6.         v3 = a2;


a2 может быть либо нулем, либо единицей.
Т.е. v3 по сути равно a2?



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 29 января 2012 11:44
· Личное сообщение · #4

Yuri4850 пишет:
Т.е. v3 по сути равно a2?

Конечно же нет. Представим переменную v4 побайтово, как я уже написал, она имеет размерность 4 байта:
Code:
  1. [0][1][2][3]

благодаря макросу LOBYTE происходит присвоение только нулевому байту значение переменной a2, которая имеет размерность как раз один байт

Yuri4850 пишет:
v3 = 1;

ну и Yuri4850 пишет:
v3 = 0;


ересь. Я же написал что там должно быть.

-----
все багрепорты - в личные сообщения




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

Создано: 29 января 2012 11:52
· Личное сообщение · #5

Я прочел твой ответ. И даже понял его смысл (хоть чайник чайником в асме и реверсинге).
Однако вот это полный текст функции:

Code:
  1. int __cdecl sub_51E470(int a1, char a2, int a3)
  2. {
  3.   int v3; // edx@2
  4.   int v4; // ST14_4@2
  5.   float v6; // ST18_4@5
  6.   float v7; // ST1C_4@5
  7.   float v8; // ST20_4@5
  8.  
  9.   if ( *(_BYTE *)(a1 + 8) )
  10.   {
  11.     v3 = (int)L"1";
  12.     if ( !a2 )
  13.       v3 = (int)"0";
  14.   }
  15.   else
  16.   {
  17.     LOBYTE(v4) = a2;
  18.     v3 = v4;
  19.   }
  20.   return sub_51CD00(a1, v3, v6, v7, v8, a3);
  21. }


v3 .. v8 - это ведь локальные переменные? И им не присваивается никакое значение, и там все по 0?
Тогда мой предыдущий пост будет правильным?

Если нет, где именно ошибка в моей логике?



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 29 января 2012 12:05
· Личное сообщение · #6

v6, v7, v8 - это не инициализированные локальные переменные, по теории там может находиться любое значение. Но скорее всего хекс-рейс считает их нулями. Значения переменных v6, v7, v8 никак не изменяются в ходе работы этой простой функции, они по концовке передаются в некую функцию sub_51CD00. Функция то не большая, лучше будет рипнуть асм код и сделать у себя в программн асм вставку.

-----
все багрепорты - в личные сообщения



 eXeL@B —› Вопросы новичков —› Переведите, пожалуйста, псевдокод
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати