Мне было интересно, если есть возможность прочитать данные из с в функции.
Я знаю, что могу использовать обходные пути, чтобы перехватывать функции и свободно изменять параметры.
Но это все, что я понимаю, используя обходные пути.
Например:
//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?
Вы уже на правильном пути со своим примером, оба cout
а также endl
существуют за пределами функции обхода. На самом деле нет никаких явных ограничений на то, какой код вы помещаете в обход функции. Доступ к данным вне функции такой же, как и для любой другой программы.
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;
}
Других решений пока нет …