首页
社区
课程
招聘
[旧帖] [分享][分享]2.1.1、CALL的概念(远程调用CALL) 0.00雪花
发表于: 2012-8-11 00:33 1988

[旧帖] [分享][分享]2.1.1、CALL的概念(远程调用CALL) 0.00雪花

2012-8-11 00:33
1988
近期学习上稍作改动,利用工作之余把郁金香的课程好好学完先。知识在于积累,可能我写的内容很简单,希望大牛们不要嘲笑我。

 2.1.1、CALL的概念(远程调用CALL)
       a、写个调用示例(假想游戏客户端)
       b、用OD找CALL,初探(用OD找出我们自己写的CALL)
          C、代码注入器,远程CALL调用

a.开始写我们的假想游戏客户端:
   1.打开VC6.0,新建一个基于对话框的MFC可执行程序的工程,删除上面所有附带的控件,然后加入一个编辑框,和两个Button按钮。将编辑框关联一个控件类型的变量m_edt1。
  2.从界面右键->“Events”->WM_INITDIALOG,进入界面的初始化程序部分,找到下面一行代码:
     // TODO: Add extra initialization here
     这个地方,我们添加如下代码:
   char s[33];
  itoa(BoolValue,s,10);  //  整型 转 字符串.
  m_edt1.SetWindowText(s);
   其中, BoolValue 为我们的血值,把它定义到程序的最顶部去: 
                int BoolValue=3000;  // 血值.
   然后F7编译,F5执行,就可以看到一个对话框跳出来,编辑框里面显示的3000.
   3.接下来,我们实现加血和减血的功能,把界面的两个控件分别改成“加血”和“减血”。
  双击"加血"按钮,进入程序编辑模式,我们在此函数外面再写一个单独的加血函数,如下:
      void addBlood()
      {
        char s[33];
        BoolValue+=22;
        itoa(BoolValue,s,10);  //  整型 转 字符串.
  m_edt1.SetWindowText(s);
     }
   然后在我们的 void CMyGameDlg::OnButton1()  函数里面加入: addBlood();
  编译,会出现报错。这个是因为我们在 addBlood()函数里面直接调用了类的成员变量m_edt1,基于这点,我们需要将这个编辑框导出成对象来操作。
  在全局定义出处,定义我们想构建的对象: HWND edit_hwnd;
   然后,在 BOOL CMyGameDlg::OnInitDialog()函数的末尾,加入:   edit_hwnd=m_edt1.m_hWnd;
   来给我们的对象赋值。
  最后将我们的addBlood()函数重写为:
   void addBlood()
   {
  char s[33];
  BoolValue+=22;
  itoa(BoolValue,s,10);  //  整型 转 字符串.
  SetWindowText(edit_hwnd,s);
   }
   编译,执行,点击"加血",就可以看到效果了。(血值,每次点击增加22)。
  4.用同样的方法,我们加入"减血"的功能。双击"减血"功能按钮,进入代码编辑模式,写一个单独的减血函数,如下:
      void decBlood()
      {
  char s[33];
  BoolValue-=22;
  itoa(BoolValue,s,10);  //  整型 转 字符串.
  SetWindowText(edit_hwnd,s);
      }
   然后在我们的 void CMyGameDlg::OnButton1()  函数里面加入: decBlood();
   编译,执行,点击"减血",就可以看到效果了。(血值,每次点击减少22)。
  这样,我们的假想游戏客户端就算完成了。

b、用OD找CALL,初探(用OD找出我们自己写的CALL)
   1.先用Cheat_Engine找到血值变量的基址。
  运行我们写好的程序,然后打开Cheat_Engine,然后绑定我们程序的进程,在数值里面输入3000,回车,就可以看到左侧,已经找到两处了:然后点击"加血",可以看到有一个基址对应的数值在变动,而且是增加了22,说明这个就是我们需要找到的变量了。我找到的是:0x004166B0.
    好了,把这个地址记好,就可以关掉Cheat_Engine和我们的程序了。
  2.用OD查找CALL:
   首先用OD载入我们的程序,在OD的底部有一个Command的命令行输入框,我们输入:
   hw 4166B0   ,然后回车,这样我们就成功下了一个硬件断点。好的运行程序,点击加血,发现OD跳转了,找到函数的头部,是00402360,然后打开OD工具栏里面的代码注入器,输入:
call 402360   ,选择目标进程,注入远程代码,就可以看到,每点击一次"注入远程代码",就会加血一次。
  用同样的方法找出"减血"的CALL,为: call 4023d0 .

C、代码注入器,远程CALL调用
 上面的操作,我们是用的工具栏里面的“代码注入器”,其实其实现函数为 :
  HANDLE CreateRemoteThread(
            HANDLE hProcess,        // OpenProcess
            LPSECURITY_ATTRIBUTES lpThreadAttributes,  // 安全结构指针 NULL
            DWORD dwStackSize,      // 0
            LPTHREAD_START_ROUTINE lpStartAddress, // 指向我们的CALL 地址
        LPVOID lpParameter,     // 传递的参数指针 NULL
            DWORD dwCreationFlags,  // 0
            LPDWORD lpThreadId      // 返回一个 线程ID标识
  );

好啦,我今天就这么多,算是一份学习后交的作业吧。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//