求我下面几句汇编引起崩溃,是堆栈不平衡还是怎么了?什么是导出函数概念

jyzdtn 2010-09-08 05:39:52
http://www.cnblogs.com/Jesses/articles/1636340.html
是按照这个方法,里面提出了导出函数的概念
谁解释下啊


原理是:用我自己的函数替换掉recv ,然后 在我的函数里跳去执行原函数

于是内联了下面几句汇编,但是崩溃?

对了,问下 recv 反汇编后,前面5字节是mov edi,edi;

push ebp;

mov ebp,esp;
这几句吗?不知道有没用对?但是不要这几句也不行





说什么什么 read 什么的 ,崩溃

int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm

{

mov edi,edi;

push ebp;

mov ebp,esp;

mov eax,recv;


add eax,5;

jmp eax ;

}
return 0;
}

相关:


CULHook g_recv("wsock32.dll", "recv", (PROC)hook_recv);

CULHook::CULHook(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook)
{

bNewByte[0] = 0xE9 ;



LPVOID pNewFunEntry = (LPVOID)pfnHook ;


m_hModule = ::LoadLibrary(pszModName);
if(m_hModule == NULL)
{
m_pfnOrig = NULL;
return;
}

LPVOID pOldFunEntry = ::GetProcAddress(m_hModule, pszFuncName);



bNewByte[0] = 0xE9 ;
*((PDWORD)(&(bNewByte[1]))) = (DWORD)pNewFunEntry - (DWORD)pOldFunEntry - 5 ;

DWORD dwProtect, dwWriteByte, dwReadByte ;
VirtualProtect ( (LPVOID)pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
ReadProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bOldByte, 5, &dwReadByte ) ;
WriteProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bNewByte, 5, &dwWriteByte ) ;
VirtualProtect ( (LPVOID)pOldFunEntry, 5, dwProtect, NULL ) ;

}

...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
八哥 2010-09-09
  • 打赏
  • 举报
回复
int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm

{

mov edi,edi;

push ebp;

mov ebp,esp;

mov eax,recv;


add eax,5;

jmp eax ; //问题出在这儿 recv的入口环境已变了,
}
return 0;
}

改正方案
1 用CALL

int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm
{
mov eax,recv;
add eax,5;
call eax ;
}
return 0;
}

这种方式主能保证成功 谁知道编译器编译这个函数时,优化的代码是不是 push ebp mov ebp,esp
最好用下面那种 使用祼函数
2 用__declspec修饰函数

__declspec(naked) int hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm
{
mov eax,recv; 这里不用add eax,5 直接跳入就行了
jmp eax ;
}
return 0;
}


zara 2010-09-09
  • 打赏
  • 举报
回复
导出函数,就是在该文件中定义、可被其它程序模块使用的函数。

你这个拦截的问题,recv() 函数开头是不是那几个字节,字节用个反汇编或调试软件看下不就明白了。程序引起崩溃,最简单的就是在这个地方中断调试下。不过,如果你这程序的拦截是动态修改的话,内存里代码部分往往是“只读”的。
jyzdtn 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fl99 的回复:]
int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm

{

mov edi,edi;

push ebp;

mov ebp,esp;

mov eax,recv;


add eax,5;

jmp eax ; //问题出在这儿 recv的入口环境已变了,
}
……
[/Quote]
能说说2种方案区别吗
jyzdtn 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fl99 的回复:]
int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
_asm

{

mov edi,edi;

push ebp;

mov ebp,esp;

mov eax,recv;


add eax,5;

jmp eax ; //问题出在这儿 recv的入口环境已变了,
}
……
[/Quote]
recv 的前5个字节被我修改了啊,能不+5吗

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧