https://www.cnblogs.com/jack204/archive/2011/12/02/2271884.html
查看反匯編主要的思路在於將 流程,處理,算法 區分開來。
1 函數調用:
原C代碼:
int sum(int, int);
int main(){
int c = sum(1, 2);
printf("c=%d", c);
return 0;
}
int sum(int a, int b){
int c = a + b;
return c;
}
反匯編的函數調用主要使用bp-frame式(不懂自己去查去)的調用方式:
mmm
然后是被調用的sum:
ss
2 for循環:
基本的for循環是這樣的:
int sum(int b){
int c, i=0;
c = 0;
for(i=0; i<4; i++){
c += b;
}
return c;
}
然后反匯編后,for循環一般是以下的形式的:
下面看看上面的c代碼反匯編后變成了什么:
3 do-while循環
例子代碼為:
int sum(int b){
int c, i=0;
c = 0;
do{
c += b;
i++;
}while(i < 4);
return c;
}
do-while循環的基本結構:
然后我例子代碼的反匯編為:
4 while循環|
例子代碼為:
int sum(int b){
int c, i=0;
c = 0;
while(i < 4){
c += b;
}
return c;
}
while反匯編的基本結構為:
上述代碼反匯編的結果為:
5 if-else分支判斷:
例子代碼的c語言為:
int sum(int b){
int c, i=0;
c = 0;
if(i<0){
c = -1;
}else if(i<1){
c = 1;
}else if(i<3){
c = 3;
}
return c;
}
if-else分支的基本結構:
然后上述代碼的反匯編結果為:
6 switch-case 判斷分支:
int sum(int b){
int c, i=0;
c = 0;
switch(i){
case 1:
c = -1;
break;
case 2:
c = 0;
break;
case 3:
c = 1;
break;
default:
c = 2;
}
return c;
}
反匯編結果很直接:
7 使用結構體:
結構體的例子代碼:
int sum(int b){
jack j;
pjack pj = &j;
j.one = 1;
j.two = 2;
pj->one = 3;
pj->two = 4;
return pj->two;
}
結構體反匯編代碼: