首页
社区
课程
招聘
[求助]请教这段汇编的具体意思,希望大家热心发言,谢谢
2006-8-5 07:58 3815

[求助]请教这段汇编的具体意思,希望大家热心发言,谢谢

2006-8-5 07:58
3815
最近看那个截获API的资料
看一个大侠的修改IAT实现API HOOK德时候
源代码如下
#include <stdio.h>
#include <windows.h>
#include <Dbghelp.h>

#pragma comment(lib,"Dbghelp.lib")

/************************************************************/
char *szHookModName = "USER32.dll" ;
char *szHookFunName = "MessageBoxA" ;
char *szModName = NULL ;
char *szHacked = "MessageBoxA() has been hooked!" ;
DWORD dwHookFun ;
DWORD dwHookApiAddr ;
DWORD *dwCurAddr ;
DWORD dwOldProtect ;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc ;
PIMAGE_THUNK_DATA32 pImageThunkData ;
MEMORY_BASIC_INFORMATION mbi ;
ULONG uSize ;
/************************************************************/

void Hooked()
{
__asm
{
  mov  esp,ebp
  push szHacked
  pop  DWORD PTR [ebp+12]
  pop  ebp
  jmp dwHookApiAddr
}
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HMODULE hUser32 = LoadLibrary(szHookModName) ;

if (hUser32 == NULL)
{
  printf("Load User32.dll failed!\n") ;
  return -1 ;
}
dwHookFun = (DWORD)Hooked ;

dwHookApiAddr = (DWORD)GetProcAddress(hUser32,szHookFunName) ;

pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hInstance,
                 TRUE,
                 IMAGE_DIRECTORY_ENTRY_IMPORT,
                 &uSize) ;
//找到要HOOK的函数所在的模块
while(pImportDesc->Name)
{
  szModName = (char *)((PBYTE)hInstance+pImportDesc->Name) ;
  if (strcmp(szModName,szHookModName)==0)
  {
   break ;
  }
  pImportDesc++ ;
}
pImageThunkData = (PIMAGE_THUNK_DATA32)((PBYTE)hInstance+pImportDesc->FirstThunk) ;

while(pImageThunkData->u1.Function)
{
  dwCurAddr = &pImageThunkData->u1.Function ;
  if (*dwCurAddr == dwHookApiAddr)
  {
   VirtualQuery(dwCurAddr,&mbi,sizeof(MEMORY_BASIC_INFORMATION)) ;
   VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_READWRITE,&mbi.Protect) ;
   
   *dwCurAddr = dwHookFun ;
   VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,&dwOldProtect) ;
   break ;
  }
  pImageThunkData++ ;
}
//要hook这个API
MessageBoxA(0,"NOT HOOKED!","robinh00d/[Inh4ss]",0) ;

return 0 ;
}

我就是不知道这个
__asm
{
  mov  esp,ebp
  push szHacked
  pop  DWORD PTR [ebp+12]
  pop  ebp
  jmp dwHookApiAddr
}
到底实现了什么功能
请您详细解答
谢谢

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-8-5 13:13
2
0
修改MessageBox的第二个参数指针。
void Hooked()
{
__asm
{
  mov  esp,ebp //平衡MessageBox函数的堆栈。
  push szHacked  //要修改的指针
  pop  DWORD PTR [ebp+12] //修改MessageBox的第二个参数指针为szHacked指针
  pop  ebp //弹出call Hooked函数地址以平衡堆栈。
  jmp dwHookApiAddr \\跳向MessageBox函数
}
}
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
红火蚁 3 2006-8-5 13:41
3
0
拜谢小虾大哥阿
谢谢
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-8-5 13:51
4
0
这一句说错了。
pop  ebp //弹出call Hooked函数地址以平衡堆栈。

应该是:
pop ebp //弹出push ebp的值以平衡堆栈。
游客
登录 | 注册 方可回帖
返回