【问题标题】:C++ , Cheat Engine / OllyDBG finding base "static" address from multi-level pointersC++,作弊引擎/OllyDBG 从多级指针中找到基本“静态”地址
【发布时间】:2011-05-17 22:00:48
【问题描述】:

我又回来了,沮丧和绝望地寻求帮助:D。

我正在尝试为一个简单的程序创建一个作弊程序,它基本上将是一个 .dll 文件,当它使用其基地址注入主程序时,它将更改主程序的整数值。问题是,我无法使用作弊引擎找到它,主要是因为有多个带有 NEGATIVE 的级别指针?偏移量。例如:

//Starting pointer address
0x0033FCF0 -> 200

//Finding second level pointer using "Find out what's accessing this address" in Cheat Engine
**(mov eax,[ebp+08])** // **EAX=0x00000007** , **EPB=0x0033FCE8 => mov 00000007,[0033FCE8+08]**

2nd Level Pointer:
**(0033FCE8+18) -> 200**

所以我继续使用“找出什么是……”来查找下一个指针,但是在使用带有二级指针地址的 T-SEARCH 时,我得到了 7 - 8 个新的静态地址。

问题是,我不知道哪个是正确的,因为作弊引擎拒绝让我使用 NEGATIVE 添加指针?偏移量。

例子:

Base Pointer:
**mov eax,[epb-18] !!!** // Notice the **MINUS**

最重要的是,作弊引擎拒绝接受带有负偏移量的指针!

那么,有没有另一种方法可以从多级指针中找到基地址? 欢迎使用 OlyDBG / Idapro 解决方案。非常感谢你们!

这是我试图破解的简单程序的源代码:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>

int main(){
    int hp = 100;
    while(1){
        std::cout << hp << std::endl;
        Sleep(3000);
        hp += 10;
        system("cls");
    }
    return 0;
}

我想做的是用这个 .dll 编辑 hp 整数

#include <windows.h>
#define BASE    0xBASE_POINTERS_ADDRESS_WHICH_I_NEED_TO_FIND
#define OFFSET  0xTHE_OFFSET
#define VALUE   90
void MainFunction()
{
      while(1)
      {
            if (GetAsyncKeyState(VK_MENU)&0x8000 && GetAsyncKeyState('C')&0x8000) 
            MessageBox(0,L"Alt + C was pressed!",L"MessageBox! ",0);
            *(int*)((*(int*)BASE) + OFFSET) = VALUE;

            Sleep(100); //Let the program rest, otherwise it hogs cpu resources.
      }
}

BOOL WINAPI DllMain(HINSTANCE MyInstance,DWORD reason_for_call,LPVOID PointerToVoid)
{
         if (reason_for_call == DLL_PROCESS_ATTACH) CreateThread(0,0,(LPTHREAD_START_ROUTINE)&MainFunction,0,0,0);
         return true;
}

顺便说一句,我正在尝试破解 hp! 〜哦,等等,我已经说过了,哦,好吧,随便;)

谢谢你们,上帝保佑你们!

【问题讨论】:

  • 和你的问题无关,但是#define WIN_LEAN_AND_MEAN没用——首先,宏名是WIN32_LEAN_AND_MEAN;其次,它必须在之前 #include &lt;windows.h&gt;(或任何其他直接或间接包含windows.h的头文件)定义。
  • 哦,非常感谢!我没注意!我对整个多级指针的事情感到困惑......再次感谢:D
  • EBP 通常是 帧指针,从该寄存器的负偏移量通常表示程序正在访问函数参数。正偏移量表示局部变量。这是非常常见的。 (来自 other 指针的负偏移并不常见。)
  • 您要破解的程序的许可证是什么?
  • LPVOID PointerToVoid - 我必须承认,这个信息量很大!

标签: c++ pointers offset memory-address


【解决方案1】:

我认为您误解了 Cheat Engine 的目标。

CE 允许您修改以持久方式存储在内存中的值。例如,在堆上,或者在程序的静态数据中。

例如,C++ 对象以确定的方式分配,因此它们永远不会移动。这就是为什么它们可以被一个在对象的整个生命周期中保持不变的指针引用。该对象有时由另一个对象拥有。如果你找到了一个指向所有者对象的指针,你就找到了所谓的基指针

例如:

class Object
{
    bool dummy;
    int someField;
    Object* child;
};

现在假设您有一个嵌套树 3 Object。这意味着您有一个根Object(n°1),其child 是另一个Object(n°2),其child 是另一个Object(n°3)。想象一下你做这样的事情:

int main(int argc, char** argv)
{
    Object root; // n°1
    root.child = new Object(); // n°2
    root.child->child = new Object(); // n°3

    return 0;
}

您有兴趣弄乱 n°3 的 someField 值。你知道someField的地址,相对于Object,是+sizeof(bool) = 1。 所以(void*)&amp;(object n°3) + 1 是一个指向你想要的someField 的指针。

现在,如何找到指向对象 n°3 的指针? 知道child的相对地址是+sizeof(bool)+sizeof(int) = 5。我们知道指向对象 n°3 的指针是(void*)&amp;(object n°2) + 5。

对象 n°2 的地址也是如此,我将把它留作练习。

但是对象 n°1 呢?它不是在堆上分配的。它在堆栈上。废话。所以我们必须找到另一种方法来找到对象 n°1 的存储地址。

局部变量存储在堆栈中。在汇编中,它们通过它们相对于寄存器EBP(或ESP,如果函数不更改堆栈)的偏移来标识。 EBP 是栈顶,ESP 是栈底。

在这个例子中:

function foo()
{
    int a;
    double b;
}

调用 foo 时,堆栈会增加刚好足以容纳 a 和 b,即 sizeof(int) + sizeof(double),即 12 个字节。 a 将存储在EBP - sizeof(int) = EBP - 4(与ESP + 8 相同),b 将存储在EBP - sizeof(int) - sizeof(double) = EBP - 12(与ESP 相同)。 注意!编译器可以改变这个顺序,所以你的变量的声明顺序在内存中不一定相同。优化也可以完全改变这一点。但是让我们保持简单好吗?

回到我们的主要示例。我们有哪些局部变量?仅根。因此根目录将直接位于EBP - 9。但是,只有当 main 是调用堆栈顶部的函数时。没有调试器,你做不到。

假设我们的EBP 在 main 被调用时是 0028FF28(取自一个新编译的 C 程序)。

root 位于 (0x0028FF28 - 9) = 0x0028FF1F; 指向root.child 的指针位于 (0x0028FF1F + 5) = (0x0028FF24); 因此,root.child 位于 *0x0028FF24。

指向root.child-&gt;child 的指针位于 (*0x0028FF24 + 5) = (假设是 10000) 那么root.child-&gt;child 在 *10000 处。

最后,root.child-&gt;child.someField 位于 *10000 + 3。

总结:你只需要找到root的静态地址就可以找到其余的。 root 不在堆上或任何类型的持久内存上,但它在 main 的堆栈上,几乎在所有程序中都存在,所以它几乎就像是永久的。 CE通过扫描整个进程内存空间来帮助你找到一个静态地址

考虑到这一切,你应该能够计算hp在堆栈上的相对地址,并找到一个指向它的静态指针(main 非常、非常、非常有可能每次你都有一个静态帧地址启动程序)。如果您需要帮助,请使用调试器!我推荐免疫调试器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多