+ -
当前位置:首页 → 问答吧 → 请教各位大侠一个关于API 拦截函数的问题

请教各位大侠一个关于API 拦截函数的问题

时间:2011-01-20

来源:互联网

 _asm //我个人对这对段代码的理解是把pfMessageBoxA 所指向的内容覆盖到OldMessageBoxACode 所指向的内容
 { 
  lea edi,OldMessageBoxACode 
  mov esi,pfMessageBoxA 
  cld 
  movsd 
  movsb //前面已近覆盖了32位,这里为什么又要多覆盖8位(函数指针的长度是32位)
 } 
 NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令 //Oxe9是什么意思 为什么要这样做
 _asm [color=#FF0000]//这段代码我就看不明白了(我是指它的原理,不是汇编上的意{ 
  lea eax,MyMessageBoxA 
  mov ebx,pfMessageBoxA 
  sub eax,ebx 
  sub eax,5 
  mov dword ptr [NewMessageBoxACode+1],eax 
 } 

谁可以解释一下这一段汇编的作用,不是简单的解释汇编语言做了什么,而是他背后的意义,我的理解可能不正确,谢谢了。

----------------------下面是完整的代码-------------------------------------------------

BOOL init()//初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令  
{  
hModule=LoadLibrary( "user32.dll ");  
pfMessageBoxA=GetProcAddress(hModule, "MessageBoxA ");  
if(pfMessageBoxA==NULL)  
return false;  
_asm  
{  
lea edi,OldMessageBoxACode  
mov esi,pfMessageBoxA  
cld  
movsd  
movsb  
}  
NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令  
_asm  
{  
lea eax,MyMessageBoxA  
mov ebx,pfMessageBoxA  
sub eax,ebx  
sub eax,5  
mov dword ptr [NewMessageBoxACode+1],eax  
}  
dwIdNew=GetCurrentProcessId(); //得到所属进程的ID  
dwIdOld=dwIdNew;  
HookOn();//开始拦截  
return(true);  
}  

作者: wuxuerong5   发布时间: 2011-01-20

函数的结构是包含一个指令码和函数指针,movsb 应该就是移动到指令码地址,然后写入指令的值,比如jmp

作者: bdmh   发布时间: 2011-01-20

这个要到汇编版块去问

作者: yangglemu   发布时间: 2011-01-20