Имеем такой код на fasm:
Метка "код для декрипта строк", имеет команду:
Насколько мне известно, также существует аналог:
Собственно разницу видно на скриншотах. Почему так?
В сети нашел следующее:
В общем охота услышать мнение знатоков (=
Код:
format PE GUI on 'nul'
entry start_program
section '.TEST' code import writeable readable executable
include 'win32ax.inc'
; макрос XOR'а строк
macro crypt start, length, key
{
local x, y, key_size, key_pos
virtual at 0
db key
key_size = $
end virtual
key_pos = 0
repeat length
load x from start + % - 1
virtual at 0
db key
load y from key_pos
end virtual
x = x xor y
store x at start + % - 1
key_pos = key_pos + 1
if key_pos >= key_size
key_pos = 0
end if
end repeat
}
; импорт
library kernel_lib, 'kernel32.dll',\
user_lib, 'user32.dll'
import kernel_lib,\
exit_func, 'ExitProcess'
import user_lib,\
mess_func, 'MessageBoxA'
; точка входа в программу
start_program:
; декрипт строк
call decrypt_code
; выполнение кода
call start_code
; код для декрипта строк
decrypt_code:
mov edi, xoring_start
mov ecx, xoring_end - xoring_start
@@:
xor byte[edi],8
inc edi
dec ecx
test ecx,ecx
jnz @b; @b - прерывание цикла
ret
; строки которые мы ксорим
xoring_start:
text db 'Текст', NULL
zagol db 'Заголовок', NULL
ret
xoring_end:
start_code:
; показываем сообщение
invoke mess_func, NULL, text, zagol, MB_OK + MB_ICONEXCLAMATION
; выходим
invoke exit_func, NULL
; выполняем макрос с ключом XOR'а 8
crypt xoring_start, xoring_end - xoring_start, 8
Метка "код для декрипта строк", имеет команду:
Код:
test ecx,ecx
Насколько мне известно, также существует аналог:
Код:
cmp ecx,ecx
Собственно разницу видно на скриншотах. Почему так?
В сети нашел следующее:
Наверное из-за того что короче, да..?Команды вида test reg,reg используется для сравнения значения регистра с нулем, т.е. после этой операции либо устанавливается либо сбрасывается флаг нуля (а также флаг знака и флаг четности). Почему не cmp reg,0? Потому что в скомпилированном виде test reg,reg на целый байт короче, ну и по скорости наверное разница есть
test эквивалентен битовому and, за исключением того, что не модифицируются операнды, а только флаги. Обычно это нужно, чтобы узнать, установлены ли определенные биты в регистре.
P.S. а cmp эквивалентен обыкновенному вычитанию, но аналогично не модифицирует операнды, а модифицирует флаги.
В общем охота услышать мнение знатоков (=