[原创]反C代码的总结
发表于:
2009-5-8 19:54
8760
学``算法``有段时间了``
该是对所学的``小结一下了~
下面是我`对 C语言的一些简单结构的反汇编学习的小结~
不对之处`望指出~相互学习~!
for 循环:
mov 进行初始化。jmp 跳过循环变量改变代码。cmp 实现条件判断,jge 根据条件跳转。
用jmp 回到循环改变代码进行下一次循环
mov <循环变量>,<初始值> ;给循环变量赋初值
jmp B ;跳到第一次循环处
A: (改动循环变量) ;修改循环变量。
…
B: cmp <循环变量>,<限制变量> ;检查循环条件
jgp 跳出循环
(循环体)
…
jmp A ;跳回去修改循环变量
-------------------------------------------
do --- while 循环:
d
o 循环就是一个简单的条件跳转回去
cmp <循环变量>,<限制变量> jl <循环开始点>
例:
do {
c = c+i;
00411A55 mov eax,dword ptr [c]
00411A58 add eax,dword ptr [i]
00411A5B mov dword ptr [c],eax
} while(c< 100);
00411A5E cmp dword ptr [c],64h
00411A62 jl myfunction+35h (411A55h)
return c;
-------------------------------------------
while循环:
while 除了开始的时候判断循环条件之外,后面还必须有一条无条件跳转回到循环开始的地方,
共用三条指令实现
A: cmp <循环变量>,<限制变量>
jge B
(循环体)
…
jmp A
B: (循环结束)
例:
while(c<100){
00411A55 cmp dword ptr [c],64h
00411A59 jge myfunction+46h (411A66h)
c = c+i;
00411A5B mov eax,dword ptr [c]
00411A5E add eax,dword ptr [i]
00411A61 mov dword ptr [c],eax
}
00411A64 jmp myfunction+35h (411A55h)
return c
-----------------------------------
if语句:
if 判断都是使用cmp 再加上条件跳转指令。对于if( A && B)的情况,一般都是使用否决法。如果A
不成立,立刻跳下一个分支。
依次,如果B 不成立,同样跳下一分支。:
cmp <条件>
jle <下一个分支>
----------------------------------
switch结构的反汇编情况
条件分支中,有比较特殊的情况是switch.switch 的特点是有多个判断。因为swtich 显然不用判断
大于小于,所以都是je,分别跳
到每个case 处。最后一个是无条件跳转,直接跳到default 处。以下的代码:
switch(c)
{
case 0:
printf(“c>0”);
case 1:
{
printf(“c>10 && c<100”);
break;
}
default:
printf(“c>10 && c<100”);
}
反汇编的结果是:
switch(c)
00411A66 mov eax,dword ptr [c]
00411A69 mov dword ptr [ebp-0E8h],eax
00411A6F cmp dword ptr [ebp-0E8h],0
00411A76 je myfunction+63h (411A83h)
00411A78 cmp dword ptr [ebp-0E8h],1
00411A7F je myfunction+70h (411A90h)
00411A81 jmp myfunction+7Fh (411A9Fh)
{
…
显然是比较c 是否是0,1,这两个数字。至于先把c 移动到ebp-0E8h 这个地址,然后再比较,这是
调试版本编译的特点。可能是
为了防止直接操作堆栈而导致堆栈破坏?最后一条直接跳转到default 处。如果没有default,就跳
到swtich 之外。
case 0:
printf(“c>0”);
00411A83 push offset string “c>0” (4240DCh)
00411A88 call @ILT+1300(_printf) (411519h)
00411A8D add esp,4
case 1:
{
printf(“c>10 && c<100”);
00411A90 push offset string “c>10 && c<100” (424288h)
00411A95 call @ILT+1300(_printf) (411519h)
00411A9A add esp,4
break;
00411A9D jmp myfunction+8Ch (411AACh)
}
default:
printf(“c>10 && c<100”);
00411A9F push offset string “c>10 && c<100” (424288h)
00411AA4 call @ILT+1300(_printf) (411519h)
00411AA9 add esp,4
}
至于case 和default 都非常简单。如果有break,则会增加一个无条件跳转。没有break 的情况下,没有任何循环控制代码
而剩下的`就是 函数的调用`~
和``数组`结构体了``
这就是偶学 学习反C代码的一些小总结~!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课