汇编 switch case

时间:2023-03-09 21:46:36
汇编  switch case
知识点:
switch case生成的汇编框架
逆向汇编代码还原成C++代码 一、了解switch case结构
、普通情况
|. 83C4 ADD ESP,
|. C745 FC >MOV DWORD PTR SS:[EBP-], ; a=;
0040101B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-]
0040101E |. F8 MOV DWORD PTR SS:[EBP-],EAX ; switch (a)
|. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
|. 0E JE SHORT switchCa.
|. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
0040102B |. JE SHORT switchCa.
0040102D |. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
|. JE SHORT switchCa.
|. EB JMP SHORT switchCa. ; default: 、跳转表 |. C745 FC >MOV DWORD PTR SS:[EBP-], ; a=;
0040101B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-]
0040101E |. F8 MOV DWORD PTR SS:[EBP-],EAX ; b=a
|. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-] ; b==
|. 83E9 SUB ECX, ; a-0x3=跳转表数组大小
|. 894D F8 MOV DWORD PTR SS:[EBP-],ECX
0040102A |. 837D F8 0E CMP DWORD PTR SS:[EBP-],0E ; 0E=case最大常量-case最小常量
0040102E |. JA SHORT switchCa. ; default:
|. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-]
|. 0FB682 CC1040>MOVZX EAX,BYTE PTR DS:[EDX+4010CC] ; 跳转表的索引数组
0040103A |> FF2485 B41040>JMP DWORD PTR DS:[EAX*+4010B4] ; /跳转表
知识点:
入口函数main的定位
逆向汇编代码还原成C++代码
索引表数组
跳转表 一、索引表及跳转表分析
、确定case常量
,,,
、确定case常量顺序 (可以根据 跳转表 调整也可以)
000210AC 30.00021063
000210B0 30.00021053
000210B4 30.00021048
000210B8 30.00021089
//调整后 实际上就是按地址大小排序
000210B4 30.00021048
000210B0 30.00021053
000210AC 30.00021063
000210B8 30.00021089 二、还原代码
printf("begin");
int a,b; a=0x16; b=;
switch(a)
{
case :
b=b+a;
break;
case :
printf("");
break;
//18,20,28,32
case :
if (b>)
{
printf("");
}else
{
printf("");
}
break;
case :
printf("");
//break;
default:
printf("00end");
break;
}
//end