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

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

上传的附件 汇编代码转为换c代码的练习.pdf

  • 标 题:答复
  • 作 者:cnhnyu
  • 时 间:2011-03-06 16:17:27

__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指令的作用是这样的

  • 标 题:答复
  • 作 者:cnhnyu
  • 时 间:2011-03-06 16:31:37

引用:
最初由 loongboy发布 查看帖子
ret 立即数
是在返回时,平衡堆栈,堆栈向下增长。所以应该是add esp, 立即数 是吧?
另外应该是先pop eip,再对esp进行操作的吧?
我也不是很确定,因为我就是闲着没事看过一遍8086汇编,没实际写过。
哦, 不好意思, 写错了, 的确是add esp, xxx , 我已经修改附件了。
栈是向下增长, push xxx相当于 sub esp, n
pop xxx 相当于 add esp, n

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

高地址 FFFFFFFF
  ^
   |
   |
低地址 00000000

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

所以, 以后我看书, 只要说“向下”我就认为是低地址, 这样就没有那么容易混淆了。

  • 标 题:汇编代码转为换c代码的练习
  • 作 者:cnhnyu
  • 时 间:2011-03-06 15:38:55

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

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

上传的附件 汇编代码转为换c代码的练习.pdf