だから私は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 つの関数が必要です。
良くする方法はありますか?
私の英語と混乱で申し訳ありません。私は自分の問題を説明するために最善を尽くしました。私の言いたいことを理解していただければ幸いです。