Во врайтапе есть код, в котором во время выполнения инструкций JNZ и JZ Program Counter перемещается по указанному адресу с прибавлением 4, а в JMP 4 не прибавляется.
Вы что-то путаете - должно быть наоборот (если речь идёт об CPU-x86).
В х86-32 архитектуре, переходы бывают абсолютные, и относительные.
При абсолютных, к указателю (Programm Counter) EIP
прибавляется 32-битное смещение, в результате чего можно совершать прыжки вплоть до 4 ГБайт от текущего адреса. Безусловные переходы JMP
и вызов функций CALL
используют именно абсолютную адресацию, т.е. EIP+4
байта.
Условные-же переходы JZ/JNZ
всегда используют относительную адресацию, с прыжками только в диапазоне +/-128 байт от текущего значения EIP
. Такие переходы кодируются всего 1 байтом со-знаком. Когда этот байт имеет положительное значение 00..7Fh
, значит переход осуществляется вперёд, если-же операнд отрицательный в диапазоне 80..FFh
, то соответственно EIP
сместится назад.