![]() |
eXeL@B —› Вопросы новичков —› Читаемость кода |
Посл.ответ | Сообщение |
|
Создано: 07 июля 2011 02:46 · Личное сообщение · #1 Недавно делал кейген для проги, написанной на делфи. Сам алгоритм думаю здешним юзерам покажется несложным, но я пока допёр, где его искать, пока в него "въехал", убил три ночи, и ессесно по завершении был доволен как слон. Но вот вопрос. Так как я ассемблер знаю не очень, я многие команды, которые встречал, не пытался вникнуть, как и что они делают, а просто переносил их в код кейгена. Кейген всё правильно генерит, но вот возник вопрос, правильно ли я всё делаю. Или можно сделать что-то, что позволит лучше понять логику разработчика. Code:
Просто мне ну нифига не понятны такие места как, например: dl:= dl xor cl; dl:= dl and 255; eax:= eax xor dl; В исходном коде проги они таким же макаром писались, через XOR и AND, или какой-то более понятной операцией?? И зачем это было использовать (постоянные XOR, and, - эти же операции, в десятичной системе непривычные, зачем их использовать)? Собственно, в этом и состоит вопрос. ![]() |
|
Создано: 07 июля 2011 02:53 · Личное сообщение · #2 И ещё спонтанно возник вопрос №2: В проге есть место, в котором в один из регистров переносится адрес, указывающий на целый сгенерированный серийник. Адрес данного места в проге известен. Вопрос, можно ли изменить прогу так, чтобы она, допустим, показывала MessageBox с данным серийным номером (через push передать адрес строки и кол-во символов, а потом через call вызвать какую-то api-функцию), или это сделать трудно, или нельзя? ![]() |
|
Создано: 07 июля 2011 03:13 · Личное сообщение · #3 maxi-hard пишет: В проге есть место, в котором в один из регистров переносится адрес, указывающий на целый сгенерированный серийник. Адрес данного места в проге известен. Вопрос, можно ли изменить прогу так, чтобы она, допустим, показывала MessageBox с данным серийным номером (через push передать адрес строки и кол-во символов, а потом через call вызвать какую-то api-функцию), или это сделать трудно, или нельзя? Code:
MessageBoxA = адресу этой функции в таблице импорта, либо в отладчике (для наглядности) можно так прописать (работать будет только на машинах с одинаковым user32.dll) ![]() |
|
Создано: 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:
![]() |
|
Создано: 07 июля 2011 08:29 · Поправил: Veliant · Личное сообщение · #5 Никакого практического смысла в этом месте and 255 (0xFF) не несет. Если бы было EDX and 255, то значило бы, что очистить все, кроме младшего байта - dl Если ничего не напутал то выглядеть должно так Code:
Собственно тут видно откуда взялся and 255 - число все так int, а нужно только младшие 8 бит, и оптимизатор немного перестарался. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Читаемость кода |