Angell开心果 发表于 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 , 49A550
// 008A70CB |. FF55 FC call dword ptr
// 008A70CE |. 59 pop ecx
// 008A70CF |. 5D pop ebp
// 008A70D0 \. C3 retn

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

逍遥的男孩 发表于 2011-3-30 09:21:32

蓝色代码属于正常的,
可以理解为函数头部,你可以理解为
begin

end

niufen 发表于 2011-3-30 09:21:41

加函数修饰符,自己查资料
VC里是这样:__declspec(naked)

Angell开心果 发表于 2011-3-30 09:23:08

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

逍遥的男孩 发表于 2011-3-30 09:23:35

调用约定我已经看过了,但对LZ的问题我个人感觉还是用处不大,
主要是我觉得楼主想把代码去掉是一个很没道理的做法,
因为去掉和不去掉都要看游戏设计者安排了什么约定,总觉得楼主在代码设计上理解有错误。

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

Angell开心果 发表于 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就是应该做的事了.

Angell开心果 发表于 2011-3-30 09:26:37

回复 7# 叶落无痕

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

起初我也认为自动生成的代码不会影响我的代码逻辑,但是后来发现,在过程中声明的变量越多或逻辑代码越多就越是麻烦,用OD跟了之后也没有发现什么规律,所以就干脆拒绝自动堆栈平衡了。完成之后,dll就非常稳定了。
页: [1]
查看完整版本: 内联汇编如何禁止自动生成内存保护代码?