首页
社区
课程
招聘
[原创]反C代码的总结
发表于: 2009-5-8 19:54 8761

[原创]反C代码的总结

2009-5-8 19:54
8761

学``算法``有段时间了``
该是对所学的``小结一下了~
下面是我`对 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代码的一些小总结~!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
有心人啊,呵。呵。
2009-5-8 21:25
0
雪    币: 546
活跃值: (1672)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
好帖。收藏。
2009-5-9 01:34
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
有本书叫天书夜读...
大家可以看看..
2009-5-9 09:09
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
顶一下 很好
2009-5-9 13:37
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
喜欢这种自己研究出来的东西
2009-5-9 14:38
0
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
if....than exit(-1);形式的保护,可以手工修改C启动代码里__exit()函数,比如改成 ret
2009-5-9 14:58
0
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
书讲解的很细,由浅入深
2009-5-9 15:43
0
雪    币: 316
活跃值: (11)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
总结得很好啊
2009-5-9 17:32
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
总结得不错,谢谢楼主分享你的经验。
2009-5-9 22:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
讲解的很细,   谢谢
2009-5-9 22:29
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
楚狂人有本书滴。。。楼主可以看看
2010-10-31 19:15
0
雪    币: 7
活跃值: (31)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
虽然不知道有什么用 但是先收下...
2010-11-2 19:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
也不错啊!!!!!!
2010-12-8 11:12
0
游客
登录 | 注册 方可回帖
返回
//