我正在阅读 Kris Kaspersky 写的一本书[rus](对不起,我目前找不到英文版),解释了软件安全的哲学和技术。
书中有一个例子。它指出代码:
if ( ! IsValidUser() )
{
Message("Invalid user! Abroting...");
Abort;
}
完全不安全,因为它被翻译成这样:
CALL IsValidUser
OR AX,AX
JZ continue
^^^^^^^^^^^^^
PUSH offset str_invalid_user
CALL Message
CALL Abort
continue: ; normal program execution
...........
因此,可以通过在反汇编程序中仅更改一个字节来破解程序。如果我们更改JZ continue
为JMP continue
检查将无法正确执行。
然后克里斯写道:
C中程序的更正版本是:
IsValidUser();
if (!true)
{
Message("Invalid user! Aborting...");
Abort;
}
在此版本中,该{...}
部分将永远无法控制。
我真的不明白更正后的版本应该如何工作。为什么他使用if-statement
永远不会执行的,甚至可以被编译器删除?
这是一种错字还是错误?还是我没有得到什么?