使用绕道DLL钩子从函数内读取数据

时间:2013-04-23 07:59:55

标签: c++ dll detours

我想知道是否可以从函数中读取数据 我知道我可以用弯路钩住功能并自由改变参数 但这是我所知道的使用弯路。

例如:

//cryptkeys
typedef int (WINAPI *pCryptKey)(int crypt1, int crypt2, int crypt3);
int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3);
pCryptKey MyCrypt2Key = (pCryptKey)(0x60FF50);

int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3)
{
    cout << crypt1 << crypt2 << crypt3 << endl;
    return MyCrypt2Key(999,135,2);
}

该代码在游戏中绕过密钥函数并在调用之前更改参数。因此当它被称为参数被改变时。

我在想如果函数中有数据而不是参数 如何更改或显示它?

我应该重写整个功能吗?

我想要的是使用游戏本身来加密和解密数据包 我已经搞定了这样做的功能,但我能做的就是改变参数 而游戏只是继续它的事情。

我在加密之前更改了数据包,因此发送了另一个数据包。但这只会在我尝试发送数据包并进行修改时才会发生。我想直接调用函数而不等待它被游戏调用,只是修改值 就像我将使用游戏输入我自己的未加密数据包并按加密以查看加密值,反之亦然。

教程的解释或链接会很棒。


如果我喜欢怎么办?

int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3)
{
    //dont know whats supposed to be in here. But it should be alot of codes.
}

并将回复称为:

int cryptValue = MyCrypt2Key(999,135,2);
cout << cryptValue << endl;    //to get the return?

1 个答案:

答案 0 :(得分:0)

您的示例已经走在正确的轨道上,coutendl都存在于绕道功能之外。对函数绕道内的代码实际上没有明确的限制。访问函数外部的数据与任何其他程序相同。

int globalVar = 1;

int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3)
{
    cout << crypt1 << crypt2 << crypt3 << globalVar << endl;

    globalVar++;

    return MyCrypt2Key(999,135,2);
}

要将数据保存在函数内部,您可以像通常那样声明变量,并在必要时使用静态存储持续时间。

int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3)
{
    static int staticVar = 1;
    int localVar = staticVar + 1;

    staticVar++;

    cout << localVar << crypt1 << crypt2 << crypt3 << endl;
    return MyCrypt2Key(999,135,2);
}

如果要完全替换该功能,只需删除对原始功能的调用,然后提供完整的实现。您应该记住,该函数在被调用时应该表现出与原始函数相同的行为,否则使用它的代码可能会失败。

int WINAPI MyCryptKey(int crypt1, int crypt2, int crypt3)
{
    cout << crypt1 << crypt2 << crypt3 << endl;

    return 5;
}

确定一个函数如何工作以替换它的实现是你必须付诸努力的地方。您通常可以通过阅读该文档的文档来了解该函数的工作原理。如果没有文件,或者没有太多文件,你将不得不为此工作。

您可以像平常一样调用原始功能。下面的示例将调用真正的MyCryptKey函数,而不是由您正在挂钩的应用程序调用。

int  FunctionForAnotherThread()
{
    int cryptValue = MyCrypt2Key(999,135,2);

    cryptValue += rand() % 10;

    return cryptValue;
}