逆向-識別循環

do - while 循環(後面 cmp + J指令)

    int v1 = 0;
0033172E C7 45 F8 00 00 00 00 mov         dword ptr [v1],0  
    do 
    {
        v1++;
00331735 8B 45 F8             mov         eax,dword ptr [v1]  
00331738 83 C0 01             add         eax,1  
    do 
    {
        v1++;
0033173B 89 45 F8             mov         dword ptr [v1],eax  
        printf("%d\r\n", v1);
0033173E 8B 45 F8             mov         eax,dword ptr [v1]  
00331741 50                   push        eax  
00331742 68 30 6B 33 00       push        336B30h  
00331747 E8 E8 FB FF FF       call        _printf (0331334h)  
0033174C 83 C4 08             add         esp,8  
 
    } while (!(v1==3));
0033174F 83 7D F8 03          cmp         dword ptr [v1],3  
00331753 75 E0                jne         Sub_1+25h (0331735h)

while 循環(最開始cmp + J指令 + 代碼塊 + jmp)

    int v1 = 0;
0033179E C7 45 F8 00 00 00 00 mov         dword ptr [v1],0  
    while (v1 != 3)
003317A5 83 7D F8 03          cmp         dword ptr [v1],3  
003317A9 74 1C                je          Sub_2+47h (03317C7h)  //和if語句一樣,J指令也是跳轉至不滿足的地方,所以J後面的條件也是和C語言white中的相反
    {
        v1++;
003317AB 8B 45 F8             mov         eax,dword ptr [v1]  
003317AE 83 C0 01             add         eax,1  
003317B1 89 45 F8             mov         dword ptr [v1],eax  
        printf("%d\r\n", v1);
003317B4 8B 45 F8             mov         eax,dword ptr [v1]  
003317B7 50                   push        eax  
003317B8 68 30 6B 33 00       push        336B30h  
003317BD E8 72 FB FF FF       call        _printf (0331334h)  
003317C2 83 C4 08             add         esp,8  
    }  
003317C5 EB DE                jmp         Sub_2+25h (03317A5h)

for 循環(jmp + cmp + J指令 + 代碼塊 + jmp)

    int i = 0;
0033181E C7 45 F8 00 00 00 00 mov         dword ptr [i],0  
    for (i=0;i<3;i++)
00331825 C7 45 F8 00 00 00 00 mov         dword ptr [i],0  
0033182C EB 09                jmp         Sub_3+37h (0331837h) 
 
0033182E 8B 45 F8             mov         eax,dword ptr [i]  //jmp跳轉的地方
00331831 83 C0 01             add         eax,1  
00331834 89 45 F8             mov         dword ptr [i],eax  
00331837 83 7D F8 03          cmp         dword ptr [i],3  
0033183B 7D 16                jge         Sub_3+53h (0331853h)  
    {
        printf("%d\r\n", i + 1);
0033183D 8B 45 F8             mov         eax,dword ptr [i]  
00331840 83 C0 01             add         eax,1  
00331843 50                   push        eax  
00331844 68 30 6B 33 00       push        336B30h  
00331849 E8 E6 FA FF FF       call        _printf (0331334h)  
0033184E 83 C4 08             add         esp,8  
    }
00331851 EB DB                jmp         Sub_3+2Eh (033182Eh)

C++源碼

#include<iostrean>
using namespace std;
//do    先執行循環體,後比較判斷
//while 先比較判斷,後執行循環體
//for   先初始化,再比較判斷,最後執行循環體
//goto  --->do while
 
void Sub_1();
void Sub_2();
void Sub_3();
void Sub_4();
int main()
{
    Sub_1();
    Sub_2();
    Sub_3();
    Sub_4();
    return 0;
}
 
void Sub_1()
{
 
    int v1 = 0;
    do 
    {
        v1++;
        printf("%d\r\n", v1);
 
    } while (!(v1==3));
}
void Sub_2()
{
    int v1 = 0;
    while (!(v1 == 3))
    {
        v1++;
        printf("%d\r\n", v1);
    }  
}
 
 
void Sub_3()
{
    int i = 0;
    for (i=0;i<3;i++)
    {
        printf("%d\r\n", i + 1);
    }
}
 
void Sub_4()
{
    int v1 = 0;
Flag1:
    v1++;
    printf("%d\r\n", v1);
    if (v1 == 3)
    {
        goto Exit;
    }
 
    goto Flag1;
Exit:
    return;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章