if ese流程控制语句在汇编中的结构
一下是IDA的一个错误:
vc源代码
float c=argc*2.03,d=3.333;;
float e=a(d,c);
if (e>15)
{
int h=e;
printf("%d",h);
}else
{
int h=e-1;
printf("%d",h);
}
if(e<15)
{
int i=e;
printf("%d",i);
}else if(e==15)
{
int i=3+e;
printf("%d",i);
}else if(e<15)
{
int j=33+e-d;
printf("%d",j);
}
IDA F5之前
IDA F5之后
switch语句跳转表
switch(argc)
{
case 1:
printf("%d",argc);
break;
case 2:
printf("%d",argc+1);
break;
case 3:
printf("%d",argc+1);
break;
case 4:
printf("%d",argc+1);
break;
case 5:
printf("%d",argc+1);
break;
case 6:
printf("%d",argc+1);
break;
case 22:
printf("%d",argc+2);
break;
}
DEBUG 对应的OD :补充:00401086处的0x40115E是跳转索引 通过跳转索引取跳转表的地址
Release对应的OD
Release对应的ida分析
f5之后
所以IDA对流程控制语句的识别还是很准的 得出结论 综合IDA
do while循环语句的特点:
地址123456
cmp 、test之类的影响标记位的操作
jne 123456
因为do while是先执行一次有效命令 然后才进行判断 所以编译器一般情况会把 while for之类的循环优化成do while循环
while循环一般会优化成
int var ;
if(var == 0)
{
do{
}while(var > 0)
}