首页
社区
课程
招聘
[分享]汇编代码转为换c代码的练习
发表于: 2011-3-6 15:38 13967

[分享]汇编代码转为换c代码的练习

2011-3-6 15:38
13967

最近在学习汇编以及windows安全编程,总感觉汇编代码看起来有些费劲,看《加密解密》之类的书籍感觉虽然看着是那么一回事, 但是动手太少,没有太大进步,总结一句话:纸上得来终觉浅,方知此事要躬行。于是自己写了一个小程序,然后看看汇编代码, 再对照汇编代码,一步步看看c代码的实现,感觉经过实际的分析, 收获不少, 于是写成小文章,和大家一起分享一下。有问题还望指正,谢谢。

因为文章涉及到排版问题,发贴比较麻烦,做成了pdf,大家自己下载吧。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
"0040D784 ret 8; 这里的ret 8 相当于sub esp, 8; pop eip; jmp 函数返回地址,从这里面
也可以看出,该函数是内部平衡栈空间的,是stdcall 的调用方式"
有点小问题吧?

知道了个vc的编译特点。初涉的菜鸟学习啦
2011-3-6 16:04
0
雪    币: 303
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习下.
2011-3-6 16:06
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
什么问题, 能说一下吗?
2011-3-6 16:09
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ret 立即数
是在返回时,平衡堆栈,堆栈向下增长。所以应该是add esp, 立即数 是吧?
另外应该是先pop eip,再对esp进行操作的吧?
我也不是很确定,因为我就是闲着没事看过一遍8086汇编,没实际写过。
2011-3-6 16:16
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
__cdecl 调用方式的add函数:
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
0040103E   pop         edi
0040103F   pop         esi
00401040   pop         ebx
00401041   mov         esp,ebp
00401043   pop         ebp
00401044   ret

__stdcall 调用方式add函数:
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
0040103E   pop         edi
0040103F   pop         esi
00401040   pop         ebx
00401041   mov         esp,ebp
00401043   pop         ebp
00401044   ret         8

这里比对一下, 除了最后一条指令不一样,其它都一样,
__cdecl栈外平衡, 所以, 直接ret
__stdcall栈内平衡, 所以ret 8
ret指令相当于:
pop eip

ret 8 指令相当于:
pop eip
add esp, 8

因为调用的时候, 先push参数的, 再push返回地址的:
push y
push x
push 返回地址
jmp add函数地址

对应的ret应该是完全相反的:
pop eip ; pop返回地址到eip
pop x
pop y

后面pop x; popy两条合成一条: add esp, 8

当然实际上pop eip指令是不对的, cpu不支持, 但是意思是这样的, ret指令的作用是这样的
2011-3-6 16:17
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
哦, 不好意思, 写错了, 的确是add esp, xxx , 我已经修改附件了。
栈是向下增长, push xxx相当于 sub esp, n
pop xxx 相当于 add esp, n

栈的向下增长, 这里面的“向下”意思是低地址方向, 从高地址到低地址。

高地址 FFFFFFFF
  ^
   |
   |
低地址 00000000

一般说“向下增长”画图像上面这么画。
有的书上的图是倒着画的:
低地址 00000000
   |
   |
  \/
高地址 FFFFFFFF
这个是还说“向下增长”容易让人迷惑, 明明“向上”吗

所以, 以后我看书, 只要说“向下”我就认为是低地址, 这样就没有那么容易混淆了。
2011-3-6 16:31
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
pdf里面也有堆栈结构的图嘛
esp一改,再pop eip不就弹出来个参数呢?
2011-3-6 16:33
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
谢谢楼上指出问题, 我已经修改附件了。这个栈的push和pop对应的加还是减我总是搞错, 要是画图的话, 倒还好
2011-3-6 16:52
0
雪    币: 69
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了。。。
2011-3-9 01:36
0
雪    币: 777
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看隨便看一遍就會啊、真厲害
2011-3-9 08:37
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,谢谢楼主的分享啊!
2011-6-24 11:35
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
下载了,谢谢楼主
2011-6-25 12:46
0
雪    币: 2637
活跃值: (2138)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
楼主厉害,学习中
2011-7-3 20:25
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶下楼主,楼主辛苦,收藏了
2011-7-4 22:19
0
雪    币: 293
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
lz码字辛苦了,支持下。
2011-7-4 22:23
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
thanks!
2011-7-4 23:32
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
辛苦,支持!
2011-7-7 01:28
0
雪    币: 224
活跃值: (55)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
19
support!!
2011-7-7 11:59
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看了三次,网上查了一些资料,在汇编和C上功力又进一步。
2011-7-14 17:05
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
lz辛苦,向lz致敬
2011-7-14 22:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不错  ,支持
2011-7-15 09:54
0
游客
登录 | 注册 方可回帖
返回
//