| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5416 人关注过本帖
标题:请教一段经典汇编代码的解释
只看楼主 加入收藏
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
回复 10#
言之有理有据即可,何来"乱讲"之说?
有一分光发一分热,好过冷冷清清没人搭理哦.

[[it] 本帖最后由 ONEPROBLEM 于 2008-7-17 14:39 编辑 [/it]]
2008-07-17 14:37
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
  楼主觉得俺讲的不靠谱,用了"难道"一词.  俺也确实不太了解内嵌汇编,甚至连WIN32汇编也是刚学,再一看楼主所发过的帖子,只好自认乱说了.
虽说有理有据,但是毕竟心里没底,乱说就乱说了.等以后成大牛了,再来给自己平反
2008-07-17 22:16
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
回复 12# 你们都要疼我哦 的帖子
"等以后成大牛了,再来给自己平反"!
呵呵~~~~指日可待了
2008-07-18 08:28
woami66
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2008-2-29
收藏
得分:0 
高人给你指点,(*^__^*) 嘻嘻……,开个玩笑,别骂我啊!

这个东西其实很简单,自己画一下内存图就知道了,首先,ret指令会使EIP转向UnmapViewOfFile,这时UnmapViewOfFile需要一个参数,就是module,至于为什么不是DeleteFile,那是因为栈顶元素是返回地址,而栈顶+4才是第一个参数,这样,UnmapViewOfFile执行完后,直接“返回”到DeleteFile处执行删除自身的操作,而DeleteFile的参数就是buf,以此类推!
2008-07-18 16:20
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
又搜索了一下,发现这段代码很有来头的.

利用了堆栈执行的方法.
ret以后,要从堆栈里弹出返回地址,于是UnmapViewOfFile就弹出来了,这个API需要参数,于是就从堆栈里去取,它根据汇编语法,认为栈顶元素是返回地址,参数要+4,所以取到了push module.  执行完以后,又返回到它认为的返回地址,即DeleteFile,这个也需要参数,刚才module已弹出,所以它又认为push ExitProcess 是返回地址,参数要+4,所以取到了push eax,执行完以后,又返回到他认为的返回地址,即ExitProcess,...  所以为什么要PUSH进两个0的原因也清楚了,是为了堆栈平衡.

这段代码很神奇的用堆栈执行了3个操作,很有技巧和水平. 现在才明白.

感谢楼上高手指点.
2008-07-18 17:32
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
回复 9# ONEPROBLEM 的帖子
"当然,UnmapViewOfFile 的参数不一定是Address Of DeleteFile ,而是这样:
"当前栈顶"+08,"当前栈顶"+0C之类的."


UnmapViewOfFile原型如下:
BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

那Address of DeleteFile() 就应该是UnmapViewOfFile的参数呀?? 你为什么说"当前栈顶"+08,"当前栈顶"+0C之类的.

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-07-18 18:16
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
LPCVOID Pointer to a constant of any type.

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-07-18 18:17
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
回复 12# 你们都要疼我哦 的帖子
不好意思 用词不当之处还望海涵

咱们共同提高!!

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-07-18 18:19
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
回复 15# 你们都要疼我哦 的帖子
谢谢了 刚才看到你们的回复

谢谢大家的参与!!

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-07-18 18:21
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
回复 16# redice 的帖子
“UnmapViewOfFile原型如下:
BOOL UnmapViewOfFile(LPCVOID lpBaseAddress); ”
====================================================
对这个函数我真的一点也不懂的。包括英文,对我而言是天书啊。 全丢给老师啦。
我之所以说,"当前栈顶"+08,"当前栈顶"+0C之类的.你可以参照14#、15#的说法。
其实我是经常反汇编才知道有这回事的。[“当前栈顶”+04],往往是CALL本函数时压入的返回地址,本函数就从[“当前栈顶”+08]开始获取参数了。
当然,我所说的“当前栈顶”是不准确的!在汇编里,调用函数或子程序时:
push  ebp
mov   ebp,esp
... ...
执行这两条指令后,EBP中的值,我把它当作“当前栈顶”(可能不正确
在运行过程中,程序会保持EBP不变,从而通过[EBP+XX],或[EBP-XX]之类来得到栈中的数据。
返回的时候:
leave    ;相当于mov esp,ebp   pop ebp
ret
就一切OK了。
2008-07-18 18:39
快速回复:请教一段经典汇编代码的解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018785 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved