JZ/JE指令:根據Z標志位進行跳轉
JZ和JE相同(shark恆老師說的,我就記錄下,但是他也說過不是完全相同)
1、直接定位到一個存在je跳轉的地址,然后發現是存在跳轉的,如圖
上圖的Z標志位為1,所以會進行跳轉,但是如果修改Z標志位為0則不會,如圖
同時JE和JZ也相同
JNZ/JNE指令:根據Z標志位進行跳轉
同樣是根據Z標志位進行跳轉,但是是相反的,當Z標志位為0的時候進行跳轉,當Z標志位為1的時候不跳轉
1、修改當前地址的匯編指令為cmp eax,ecx
,然后下個地址再修改為jnz 0040101D
2、修改eax的寄存器的值為00000001,ecx的寄存器的值為00000000
3、單步步過
cmp計算的結果不為0,所以Z標志位同樣不為1,所以JNZ/JEZ會進行跳轉,因為跟JE/JZ是相反判斷的
JMP指令:無條件跳轉,不會受標志位的影響
下面兩張圖能夠發現,無論Z標志位是否為1 都會進行跳轉
JS和JNS指令:根據S標志位進行判斷是否跳轉
JS和JNS都是根據S標志位進行判斷的,只是是否跳轉是判斷相反S標志位
1、修改當前地址的匯編指令為cmp eax,ecx
,然后下個地址再修改為js 0040101D
2、修改eax的寄存器的值為00000001,ecx的寄存器的值為00000000
3、單步步過
發現S標志位為0,不會進行跳轉,原因十六進制00000001減去十六進制00000000,結果是個正數所以S標志位為0,而JS是當S標志位為0的時候不跳轉,當S標志位為1的時候進行跳轉
JNS就是反一下,當S標志位為0的時候跳轉,為1的時候不跳轉
JP和JPZ指令:根據P標志位進行判斷是否跳轉
JP和JNP都是根據S標志位進行判斷的,只是是否跳轉是判斷相反P標志位
這里需要記錄下JP和JPE是相同的,JNP和JPO是相同的
1、修改當前地址的匯編指令為cmp eax,ecx
,然后下個地址再修改為jp 0040101D
2、修改eax的寄存器的值為00000001,ecx的寄存器的值為00000000
3、單步步過
發現不會進行跳轉,原因是P標志位是奇偶標志位,根據二進制數中的1的個數進行判斷的,cmp eax ecx
結果是00000001,轉換為二進制那么就是0001,1的個數為奇數那么P標志位就為0,那么也就不跳轉了
JNP就是反一下,當P標志位為0的時候跳轉,為1的時候不跳轉
JO和JNO指令:根據O標志位進行判斷
1、修改當前地址的匯編指令為add eax,ecx
,然后下個地址再修改為jo 0040101D
2、修改eax的寄存器的值為7FFFFFF,ecx的寄存器的值為00000001
3、單步步過
O標志位當溢出的時候7FFFFFFF + 0x1 為 80000000 變成有符號位的最小整數,自然O標志位為1,JO指令當O標志位為1的時候則進行跳轉
JNO則相反,當O標志位為0的時候則不進行跳轉
JB和JNB指令:當cmp指令第一個操作數小於第二個操作數的時候則進行跳轉
1、修改當前地址的匯編指令為cmp eax,ecx
,然后下個地址再修改為jb 0040101D
2、修改eax的寄存器的值為00000000,ecx的寄存器的值為00000001
3、單步步過
原因是eax小於ecx,C標志位為1,所以進行跳轉
當C標志位改為0的時候,則不進行跳轉
JNB則相反,當C標志位為0的時候,進行跳轉,否則不跳轉
JBE和JNBE指令:當cmp指令第一個操作數小於或等於第二個操作數的時候則進行跳轉,並且受標志位C和Z的影響
發現C標志位為0 但是Z標志位為1 ,則進行跳轉
JNBE則相反,JNBE跟JA相同
把C標志位置為0,Z標志位置為0,發現能夠進行跳轉
JL指令:根據S標志位進行判斷是否跳轉,並且計算的是有符號位之間的運算
1、修改當前地址的匯編指令為cmp eax,ecx
,然后下個地址再修改為jl 0040101D
2、修改eax的寄存器的值為00000000,ecx的寄存器的值為00000001
3、單步步過
發現S標志位為1,因為cmp指令 結果為十進制0-1 為 -1,是一個負數 所以S標志位為1
可以再把eax修改為FFFFFFF6,那么十進制就為-10,然后重新定位EIP,再進行單步步過
可以發現S標志位沒變化,還是為1,那么也可以證實了計算的是有符號位之間的運算
JL和JB指令之間的區別:http://bbs3.driverdevelop.com/read.php?tid=106427