【转】C\C++条件(三目)运算符巧妙原理解析
最近一直研究一个对个人而言很有价值的一个LIB库的逆向。在今天下班后突然灵感闪现,这个断断续续逆了接近一周的核心管理类。终于在今天给逆完了。在最后一个函数里,碰到了之前基本没有用过的一条指令。(呵呵,高手见笑了!)当然光看单句的汇编指令,是没有办法看出具体的作用的,而且还很可能会认为原作者本来就是用汇编来实现的!呵呵,先不废话,先贴出反汇编代码一睹为快:
mov dword ptr [b],64h // int b
xor eax,eax
cmp dword ptr [b],0
setg al
sub eax,1
and eax,64h
add eax,0C8h
mov dword ptr [a],eax // int a
今天的LIB里面的那段迷惑的代码就跟这段代码一致,唯独a、b变量不一样。当然这个不影响结果。一开始可能会对setg这条指令的用途不了解。二是看下面蓝色的三条指令,什么又是减,又是and,又是add一些莫名奇妙的立即数。还真让人迷惑这段代码翻译成C++将怎么写。难道就一句一句的翻译?这样的话恐怕一条汇编就是一句C++。而且到了setg这条指令时还真不知道怎么单独的将其翻译成C++的什么语句。呵呵!这可能也就是逆向所带来的乐趣之一吧(个人观点)!
好了。不废话,先分析下。首先b是一个变量,首先被赋值成0x64(100)。然后将b与0进行比较,如果有心的朋友会觉得奇怪,这个cmp的下面一条语句怎么不是跳转语句,一般都是比较后,然后根据比较结果进行跳转。否则cmp有什么意义呢?到这里的话误导我们的就是setg这条指令了。要了解它,首先得知道cmp会影响到标志寄存器的标志位。cmp是执行的减法操作,将前面的操作数减去后面的操作数。与sub的区别就是它不将减后的值放到目的操作数中。所以cmp有可能减溢出等,从而影响到了标志位。由此一来我们就算猜测都能知道setg应该与标志位有关系。然后通过资料或者奔腾X86指令集查找表(我使用的平台是INTEL X
相关文档:
陆其明 译
原文:
http://www.codeproject.com/cpp/complex_declarations.asp
作者:Vikram A Punathambekar
介绍
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的 ......
C及传统C++
#include <assert.h> //设定插入点
#include <ctype.h> //字符处理
#include <errno.h> //定义错误码
#include <float.h> //浮点数处理
#include <fstream.h> //文件输入/输出
#include <iomanip.h> //参数化输入/输出 ......
前面一篇我们介绍了结构体,这篇终于能够介绍函数了。为什么这么说呢?因为函数非常重要。就这么简单。嘿嘿!之所以在这时才讲函数,是因为本篇将联系到前面的每一篇,这样函数才能体现的透彻。那我们就迫不及待的切入正题。
从第一篇Helloworld开始到现在,就没有脱离函数。那就是我们的main函数。main函数也是一个普通的 ......
前面两篇基本把指针给介绍完了,相信大家对指针已经不是那么陌生了。也不会因为指针和数组之间的关系而导致混淆了。大家可能也迫不及待想了解下后来的知识。今天我们就介绍下结构体。
对于结构体,既然叫结构体,形象上我们可以理解其就是一堆数据集合在一起形成一个结构。就比如一个学生的信息包括:学号、姓名、班级、年 ......
再上一篇,我们介绍了基本调试。之前也说了,之所以把调试放在前面讲是因为后面的文章基本都会用到调试。观察我们的程序到底发生了什么。让我们能够直接明了的看清楚问题的本质。本篇将深入一点介绍指针这个让无数初学者畏惧的东西。希望大家再看完本篇之后能对指针有新的认识,之后不再惧怕它。觉得它就那么回事。那下面我 ......