c++反汇编逆向还原jge jg jle jl jne je所还原的c++代码
c++反汇编逆向还原,if语句、赋值、算数|逻辑运算符(> 、>=、==、<、<=、if中的&&、!、||)
在汇编指令中
jge 前面>=后面
jg 前面>后面
jle 前面<=后面
jl 前面<后面
jne 前面不等于后面
je 前面等于后面
记忆技巧 e :equal 相等 g:greater 大 l:less 小
虽然汇编指令是这样
但是因为 如果cmp 对应的jnz 等 的条件成立为true,则执行绿色的线,否则则执行红色的线
参考下方的图,所以我们在还原代码时要反过来
比如都是 cmp a,b
jge 前面>=后面 翻译 if(a<b){}else{}
jg 前面>后面 翻译 if(a<=b){}else{}
jle 前面<=后面 翻译 if(a>b){}else{}
jl 前面<后面 翻译 if(a>=b){}else{}
jne 前面不等于后面 翻译 if(a==0{}else{}
je 前面等于后面 翻译 if(a!=b){}else{}
1.赋值
mov:传送指令,用于传送字或字节
示例:
mov a,b 把b赋值给a所在的地址
mov a,[b] 把b的地址赋值给a所在的地址 注意有没有[] 的区别 []类似指针的取址操作
还原:
mov [ebp+a], 0Ah
mov [ebp+b], 14h翻译成c++
int ebp_a=0xa;
int ebp_b=0x14;
2. 等于==
cmp指令 比较指令 jnz表示结果不为0,则执行loc_411938 两个数比较结果不为0表示false
int ebp_a=0xa;
int ebp_b=0x14;
int eax=ebp_a;
if(eax==ebp_b){
printf("yes =\n");
}
3.小于&小于等于 jg、jge
jge 表示cmp前的大于等于后面 则执行绿色的线,否则执行红色线 Jump if greater or equal
int eax=ebp_a;
if(eax>=ebp_b){
loc_41194D();
}else{printf("yes <\n");
}
所以jge可以翻译为mov eax, [ebp+a]
cmp eax, [ebp+b]if(eax<ebp_b){}
e表示equal 相等
mov eax, [ebp+a]
cmp eax, [ebp+b]jg short loc_411962
那么jg则表示 cmp前的大于后面 则执行绿色的线
所以逆向反过来就是
if(eax<=ebp_b){}
4.大于&大于等于 jle、jl
通过上面我们已经知道实际翻译的代码要与指令相反
jle 前面<=后面
jl 前面<后面
所以
jle则为
if(eax>ebp_b){}
jl则为
if(eax>=ebp_b){}
4.逻辑运算符 &&、||、!
if语句中的逻辑运算符,直接根据反汇编代码的意思原原本本还原,再自己转化成使用逻辑运算符的形式即可
在汇编中还有专门的逻辑运算指令
xor a,b 对a,b进行异或运算
or a,b 对a,b进行或运算
not a 对进行取反操作
and a,b 对a,b进行与运算
4.1 && 且
可以看到&&是有两个cmp才push输出的
这里按照汇编原原本本翻译过来就是
if(ebp_a!=0xa){
}else{
if(ebp_b!=0x14){
}else{
printf("yes");
}
}按照正常写代码翻译则为
if(ebp_a==0xa){
if(ebp_b==0x14){
printf("yes &&");
}
}所以可以翻译为
if(ebp_a==0xa&&ebp_b==0x14){
printf("yes &&");
}
4.2 || 或
同理 ||也是两个cmp
这里可以翻译为
if(ebp_a==0xa){
printf("yes ||");
}else{
if(ebp_b==0x14){
printf("yes ||");
}
}正常翻译可以写为
if(ebp_a==0xa||ebp_b==0x14){
printf("yes ||");
}
4.3 ! 非
翻译过来就是
if(ebp_a!=0xa){
print("yes");
}