我在的逆向工程Windows可执行的过程。我发现了一类,我想从一些代码使用我注入到可执行文件(不同的线程,自己的堆栈)。我怎么会去宣布这样一类,定方法的地址和成员变量的结构?

例如,让我们说我发现了一个名为foo的类,它的构造@ 0x4012D30和功能doTheMario @ 40125D4。我也知道它持有的私人数据的三个DWORD值。由于这两种方法都_thiscalls,我声明一个类,像这样在我的代码:

class GuessedFoo {
    private:
        int bar;
        char *cafebabe;
        float deadbeef;
    public:
        GuessedFoo(int a, int b);
        void doTheMario();
};

现在,这是一个完美的花花公子类,但现在有没有什么办法让编译器/连接绑定类的方法前面的两个地址,我说?当然,我可以写一个ASM包装到STDCALL转换成thiscall每一个方法,我需要使用,然后用结构替代类,但必须有一个更好的办法。

我使用gcc /克++此刻,但我可以切换到VC ++(因为gcc的内联汇编给我反正头痛)。

有帮助吗?

解决方案

如果类没有虚函数表,你可以,原则上,在自己的代码,创建一个这样的类,所有的函数调用调用适当的真正实现。您可以通过拧成员函数作为裸体功能做到这一点含的组件转移命令到所述实实现。

如果班里有一个虚函数表,事情可能会得到更加复杂;您可能需要显式地创建虚函数表的函数指针的结构,使你的函数调用存根到他们。这意味着更复杂的垫片的功能;用跳简单的裸体功能可能是不够的,它可能是更好的去与真正的功能。但请记住,在Win32成员函数使用不同的调用会;这意味着,一个普通的成员函数调用将无法正常工作。您的可以的能够逃脱建设的指针到成员函数,但要记住,他们有一个的很奇怪的结构他们,你需要的东西,具有相同的表示为虚函数表的指针相匹配。祝你好运!

其他提示

您是逆向工程在这里,因此(差不多,大概)被迫变得更低,当谈到与现有代码进行交互。

我使用纯汇编代码会调用此函数。结果, 如果EXE的修复基址那就更简单了。结果 示例代码:

void main()
{
    int bar = 5;
    int * cafebabe = &bar;
    __asm
    {
        push [bar];
        push [cafebabe];
        mov eax, 123456; // address of the function
        call eax;
    }
}

只需点击此函数作用是由原始的代码来看望在命令你需要推动的论点。不要忘了,一些参数可能需要通过寄存器传递!

我不完全相信我理解你正确,但无论如何:我认为“手工定位”的方法是使用函数指针的最简单的途径。

C ++没有定义任何种类的二进制接口的使得它几乎不可能实现任何种类的动态的对C ++类结合。

你能做的最好是声明两个结构 - 一种含c函数类型定义为每个方法中,其他反射镜的类数据布局

当然 - 因为一个类的方法__thiscall传递“这个”通过ECS注册,我不相信的,你其实可以做出明确的C函数声明中,将有同样的效果,所以你可能需要执行所有来电经由你有在装配写入定制的“CallThisCallMethodWithParameters”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top