0

だから私は1つのプログラム(正確にはゲーム)に「拡張」を書いています。それはもっとハックです。とにかく、キャラクター、アイテムなど、いくつかのクラスを逆にしています。良いメソッドを作りたいです。

だから私はこのようなものを作りました:

キャラクター.hpp

class CHARACTER
{
public:

int hp;
int level;
//....



int GetLevel(void);
void SetLevel(int lv);

};

キャラクター.cpp

#include "character.hpp"

int CHARACTER::GetLevel(void)
{
    return ((int(*)(CHARACTER*))0xADDR)(this);
}

void CHARACTER::SetLevel(int lv)
{
    ((void(*)(CHARACTER*,int))0xADDR)(this,lv);
}

main.cpp

void hook1(CHARACTER* pc)
{
    pc->SetLevel(99);
}

問題は、コードが 2 回実行されることです。hook1 に引数をプッシュしてから、再度 CHARACTER::SetLevel (以下の疑似 asm) にプッシュします: //////////////

hook1:

    push 99
    call CHARACTER__SetLevel


CHARACTER__SetLevel:

    push arg
    call 0xADDR

スタックにすべての引数が既にあり、関数にジャンプできるので、ジャンプを試みました。問題は、「asm」が追加することです

push ebp
mov ebp, esp

void CHARACTER::SetLevel(int lv)
{
    asm(".intel_syntax\n"
        "mov eax, 0xADDR\n"
        "jmp eax\n"
    );
}

at the beginning. So I have to execute this code at address + 3

(If I'm making hook in only asm, I do something like this)

void hook_asm(void)
{
    asm(".intel_syntax noprefix\n"
        ".whatever\n"
        );
}

void MAIN_HOOK(void)
{
    JmpPatch(0xADDR, &hook_asm+3); // Skip push ebp and mov ebp, esp
}

////////////////////

だから、私が見る唯一の解決策は、それを次のようにすることです

void asm_SetLevel(void)
{
    asm(".intel_syntax noprefix\n"
        "mov eax, 0xADDR\n"
        "jmp eax\n"
        );
}
CHARACTER::SetLevel(int lv)
{
    ((void(*)(void))&asm_SetLevel+3)();
}

しかし、それは私がやりたかったことではなく、すべてのメソッドに 2 つの関数が必要です。

良くする方法はありますか?

私の英語と混乱で申し訳ありません。私は自分の問題を説明するために最善を尽くしました。私の言いたいことを理解していただければ幸いです。

4

1 に答える 1

0

の定義をCHARACTER::SetLevel()ヘッダー ファイルに移動し、インライン化するようにマークします。

于 2013-10-22T21:11:52.340 に答える