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

 eXeL@B —› Вопросы новичков —› Читаемость кода
Посл.ответ Сообщение

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

Создано: 07 июля 2011 02:46
· Личное сообщение · #1

Недавно делал кейген для проги, написанной на делфи.
Сам алгоритм думаю здешним юзерам покажется несложным, но я пока допёр, где его искать, пока в него "въехал", убил три ночи, и ессесно по завершении был доволен как слон.

Но вот вопрос.
Так как я ассемблер знаю не очень, я многие команды, которые встречал, не пытался вникнуть, как и что они делают, а просто переносил их в код кейгена.
Кейген всё правильно генерит, но вот возник вопрос, правильно ли я всё делаю. Или можно сделать что-то, что позволит лучше понять логику разработчика.
Code:
  1. someint:=charcount(username);
  2.   someint:=someint+charcount(serial);
  3.   pos_username:=1;
  4. for ebx:=1 to 12 do
  5.   begin
  6.     eax:= someint+ebx;
  7.     eax:= eax mod 200;
  8.     edx:= ebx*2;
  9.     dl:= ord(serialwtf[edx]);
  10.     cl:= ord(serialwtf[ebx]);
  11.     dl:= dl xor cl;
  12.     cl:=ord(username[pos_username]);
  13.     dl:= dl xor cl;
  14.     dl:= dl and 255;
  15.     eax:= eax xor dl;
  16.     ready:= inttohex(eax,2);
  17.     eax:= ord(username[pos_username]);
  18.     eax:= eax xor ebx;
  19.     someint:= someint+eax;
  20.     eax:= ord(serial[ebx]);
  21.     eax:= eax xor ebx;
  22.     someint:= someint+eax;
  23.     ready_full:= ready_full+ready;
  24.     inc(pos_username);
  25.     if pos_username>length(username) then pos_username:=1;
  26.   end;


Просто мне ну нифига не понятны такие места как, например:
dl:= dl xor cl;
dl:= dl and 255;
eax:= eax xor dl;
В исходном коде проги они таким же макаром писались, через XOR и AND, или какой-то более понятной операцией?? И зачем это было использовать (постоянные XOR, and, - эти же операции, в десятичной системе непривычные, зачем их использовать)?
Собственно, в этом и состоит вопрос.



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

Создано: 07 июля 2011 02:53
· Личное сообщение · #2

И ещё спонтанно возник вопрос №2:

В проге есть место, в котором в один из регистров переносится адрес, указывающий на целый сгенерированный серийник. Адрес данного места в проге известен. Вопрос, можно ли изменить прогу так, чтобы она, допустим, показывала MessageBox с данным серийным номером (через push передать адрес строки и кол-во символов, а потом через call вызвать какую-то api-функцию), или это сделать трудно, или нельзя?




Ранг: 88.2 (постоянный), 111thx
Активность: 0.070.01
Статус: Участник

Создано: 07 июля 2011 03:13
· Личное сообщение · #3

maxi-hard пишет:
В проге есть место, в котором в один из регистров переносится адрес, указывающий на целый сгенерированный серийник. Адрес данного места в проге известен. Вопрос, можно ли изменить прогу так, чтобы она, допустим, показывала MessageBox с данным серийным номером (через push передать адрес строки и кол-во символов, а потом через call вызвать какую-то api-функцию), или это сделать трудно, или нельзя?


Code:
  1. PUSH 0
  2. PUSH 0
  3. PUSH SERIAL_ADDR
  4. PUSH 0
  5. CALL [MessageBoxA]


MessageBoxA = адресу этой функции в таблице импорта, либо в отладчике (для наглядности) можно так прописать (работать будет только на машинах с одинаковым user32.dll)



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

Создано: 07 июля 2011 05:31 · Поправил: 0xf0rd
· Личное сообщение · #4

maxi-hard пишет:
dl:= dl xor cl; dl:= dl and 255; eax:= eax xor dl;


dl- младшая часть регистра EDX, размер 8 бит.
Операция "dl:= dl and 255; " позволяет влиять на флаги процессора
Операция "xor" знаменита тем, что при повторном ее использовании можно восстановить исходный байт, например:
Code:
  1. mov al, 255 ;al=255
  2. al xor 10     ;al=245
  3. al xor 10     ;al=255




Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 07 июля 2011 08:29 · Поправил: Veliant
· Личное сообщение · #5

Никакого практического смысла в этом месте and 255 (0xFF) не несет. Если бы было EDX and 255, то значило бы, что очистить все, кроме младшего байта - dl

Если ничего не напутал то выглядеть должно так
Code:
  1. someint := charcount(username);
  2. fullLen := someint + charcount(serial);
  3. pos_username := 1;
  4.  
  5. for i := 1 to 12 do
  6. begin
  7.          first := (someint + i mod 200) xor (serialwtf(i*2) xor serialwtf(i) xor username(i)) and $FF;
  8.          someint:= someint+(username[pos_username] xor i) + (serial[i] xor i);
  9.          ready_full := ready_full + inttohex(first, 2);
  10.          inc(pos_username);
  11.          if pos_username>length(username) then pos_username:=1;
  12. end;

Собственно тут видно откуда взялся and 255 - число все так int, а нужно только младшие 8 бит, и оптимизатор немного перестарался.


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


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