S
sy0116
Unregistered / Unconfirmed
GUEST, unregistred user!
最近在写一个API Hook程序,因为一些特殊的原因我的替代函数不能够直接用Exit();返回,必须用内嵌汇编来返回,而且返回时不弹出堆栈,代码如下:
function MyCreateA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
if (lpApplicationName[0] = 'c') or (lpApplicationName[0] = 'C') then
begin
MessageBoxA(0,演示程序','演示',0);
//lpApplicationName := nil;这两句代码根本就没被编译
//lpCommandLine := nil;
//返回
asm
mov lpApplicationName,0//这样写就可以
mov lpCommandLine,0
pop ebp
ret
end;
end;
end;
这断代码的问题我已经在上面的注释中说明了,我觉得似乎是Delphi的编译器在编译时把那两句赋值代码给优化掉了,我用OD跟踪调试过,发现那两句代码根本就没有编译出来,请问有什么办法可以设置一下编译器让他不要把那两句代码给优化掉呢?
function MyCreateA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
if (lpApplicationName[0] = 'c') or (lpApplicationName[0] = 'C') then
begin
MessageBoxA(0,演示程序','演示',0);
//lpApplicationName := nil;这两句代码根本就没被编译
//lpCommandLine := nil;
//返回
asm
mov lpApplicationName,0//这样写就可以
mov lpCommandLine,0
pop ebp
ret
end;
end;
end;
这断代码的问题我已经在上面的注释中说明了,我觉得似乎是Delphi的编译器在编译时把那两句赋值代码给优化掉了,我用OD跟踪调试过,发现那两句代码根本就没有编译出来,请问有什么办法可以设置一下编译器让他不要把那两句代码给优化掉呢?