设为首页 加入收藏

TOP

vc++教程之win7下基址定位处理
2014-07-19 23:03:04 来源: 作者: 【 】 浏览:89
Tags:教程 win7 定位 处理

  处理目标程序如下:

  里面有二个方法,一个加血,一个是减血。由于系统是win7,寻到的Call基址,会改变,所以不能通过固定基址来远程调用这二个方法。所以我们只能变通了。

  首先我们知道,编译后程序相对于模块基址的偏移量是不变的,所以我们可以按这个思路来处理。

  首先分析寻找二个方法的基址(怎么分析,在这不多说明),如下:

  加方法基址:012F35B0

  减方法基址:012F36A0

  当前模块基址:012e0000

  根据刚才思路我们计算出二个方法的偏移,如下:

  计算公式:基址偏移=基址-模块基址

  加方法基址:135b0

  减方法基址:136a0

  根据思路我们调用时的正确基址计算公式应该如下:

  基址=模块基址+基址偏移

  下面是实例代码片段:

  //远程执行代码

  //iaddress  基址偏移 计算公式:基址-模块基址

  void RemoteCall(int iaddress){

  HWND hwnd=::FindWindow(NULL,_T(WyHelperTest));

  if (!hwnd)

  {

  return;

  }

  DWORD pid;

  ::GetWindowThreadProcessId(hwnd,&pid);

  HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);

  if (hModuleSnap==INVALID_HANDLE_VALUE)

  {

  AfxMessageBox(_T(创建进程模块失败!));

  }

  MODULEENTRY32 me;

  me.dwSize=sizeof(me);

  Module32First(hModuleSnap,&me);

  int dwBaseAddr;

  //memcpy(&dwBaseAddr,me.modBaseAddr,4);

  dwBaseAddr=(int)me.modBaseAddr;

  char ch[MAX_PATH];

  itoa(dwBaseAddr,ch,16);

  iaddress+=dwBaseAddr;

  HANDLE hdl=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);

  DWORD tid;

  HANDLE rhdl=::CreateRemoteThread(hdl,NULL,0,(LPTHREAD_START_ROUTINE)iaddress,NULL,0,&tid);

  CloseHandle(rhdl);

  CloseHandle(hdl);

  }

  调用加方法实例:

  void CWyHelperDemo1Dlg::OnBnClickedButton1()

  {

  // TODO: 在此添加控件通知处理程序代码

  RemoteCall(0x0135b0);

  //013C3570  01387B60 00387B60 00387C20  00EC7C20

  //00387B60 00387C20

  //00f700e8 00F67B60

  //         013835B0 013836A0

  //012e0000 012F35B0 012F36A0

  //         135b0    136a0

  }

  此实例测试环境win7 64

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++继承与面向对象设计 下一篇VC++ 创建msi文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)
·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)