看流星社区

 找回密码
 注册账号
查看: 3997|回复: 7

[Delphi] 内联汇编如何禁止自动生成内存保护代码?

[复制链接]

该用户从未签到

发表于 2011-3-30 09:21:00 | 显示全部楼层 |阅读模式
例如:  
asm  
call addr  
end;  

生成:  
// 008A70C0 >/$ 55 push ebp  
// 008A70C1 |. 8BEC mov ebp, esp  
// 008A70C3 |. 51 push ecx
  
// 008A70C4 |. C745 FC 50A54>mov dword ptr [ebp-4], 49A550  
// 008A70CB |. FF55 FC call dword ptr [ebp-4]
  
// 008A70CE |. 59 pop ecx  
// 008A70CF |. 5D pop ebp  
// 008A70D0 \. C3 retn
  

但是我不想要其中的蓝色字体,怎么办?

该用户从未签到

发表于 2011-3-30 09:21:32 | 显示全部楼层
蓝色代码属于正常的,
可以理解为函数头部,你可以理解为
begin

end

该用户从未签到

发表于 2011-3-30 09:21:41 | 显示全部楼层
加函数修饰符,自己查资料
VC里是这样:__declspec(naked)

该用户从未签到

 楼主| 发表于 2011-3-30 09:23:08 | 显示全部楼层
建议你仔细看看我说的东西,对于一个函数的执行,是有函数执行修饰的,默认是由调用这个函数的函数或方法来处理堆栈平衡,也就是LZ的蓝色部分代码,当强制指定为_declspec(naked)就表示,这个修饰符所在的函数,自己处理堆栈平衡,那么就不会出现LZ蓝色部分代码。

该用户从未签到

发表于 2011-3-30 09:23:35 | 显示全部楼层
调用约定我已经看过了,但对LZ的问题我个人感觉还是用处不大,
主要是我觉得楼主想把代码去掉是一个很没道理的做法,
因为去掉和不去掉都要看游戏设计者安排了什么约定,总觉得楼主在代码设计上理解有错误。

现在这个不重要了,楼主居然是为了证实delphi能不能做到。。。

该用户从未签到

 楼主| 发表于 2011-3-30 09:24:20 | 显示全部楼层
其实事情的起因是这样的:

在写Hook Call的时候,发现Delphi 自动生成的堆栈保护代码修改了一些我想保留的寄存器,导致异常。
如果能够手工控制堆栈的话就不会这么麻烦了。

因为我是个新手,所以不熟悉,在晚上查了很多资料,发现C++有_declspec,但是不了解Delphi中有没有同样功能的东东,以及如何使用。
后来一直没解决。再后来呢,我干脆不Hook那个Call了,我Hook其他的地方(非call),将异常问题解决了。

因为之前要Hook的Call有传入参数,堆栈操作本来就很麻烦,Delphi又自作多情,干脆跳过去了。

该用户从未签到

发表于 2011-3-30 09:25:14 | 显示全部楼层
只要你在函数过程的BEGIN和END里直接加汇编,没有DELPHI的语句,那就没有蓝色的字体了.如果加了DELPHI语句,DELPHI堆栈自动平衡,保护ESP就是应该做的事了.

该用户从未签到

 楼主| 发表于 2011-3-30 09:26:37 | 显示全部楼层
回复 7# 叶落无痕

这个我知道,事实上也是这么做的,用来替代原来call的call我使用完全汇编的方法编写,变量用全局变量,然后自定义的处理过程封装为另一个方法,这样就避免了自动堆栈平衡。

起初我也认为自动生成的代码不会影响我的代码逻辑,但是后来发现,在过程中声明的变量越多或逻辑代码越多就越是麻烦,用OD跟了之后也没有发现什么规律,所以就干脆拒绝自动堆栈平衡了。完成之后,dll就非常稳定了。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 01:13

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表