#454 PGR compatiblity

Open
opened 5 months ago by Yukimana · 8 comments

Well, shit, it seems like Punishing: Gray Raven is going to be another game where you'll need to add (Broken: Anticheat) to. All these companies really love that Tencent anti-cheat.

Well, shit, it seems like Punishing: Gray Raven is going to be another game where you'll need to add (Broken: Anticheat) to. All these companies really love that Tencent anti-cheat.
Krock commented 5 months ago
Owner

Is there yet any definitive (i.e. confirmed) information about this matter? To my knowledge, the necessary setup and workaround steps are implemented in the Borb Launcher to get the game running.

Is there yet any definitive (i.e. confirmed) information about this matter? To my knowledge, the necessary setup and workaround steps are implemented in the [Borb Launcher](https://github.com/an-anime-team/an-anime-borb-launcher/issues) to get the game running.

Borb is not being updated. Just use the official launcher

winetricks corefonts vcrun2022

This game does not require any patch to work in linux

Borb is not being updated. Just use the official launcher ``` winetricks corefonts vcrun2022 ``` This game does not require any patch to work in linux
Yukimana commented 5 months ago
Poster

They seem to have implemented an anti-cheat in this update. The game just refuses to start, even Windows users are getting crashes with false warnings like this now. I have had the game runnning pefectly for months now.

They seem to have implemented an anti-cheat in this update. The game just refuses to start, even Windows users are getting crashes with false warnings like this now. I have had the game runnning pefectly for months now.
mkrsym1 commented 5 months ago

Looks like it's the same amazing ACE implementation as #451 , unfortunately the two-line workaround will not work, because the string UnityPlayer.dll is longer than PGRBase.dll and won't fit. Patching it would be a little more involved, but still absolutely trivial. I'm not interested in this game either though.

Edit: yes, you can just take the patched exe from Reverse 1999 and rename it to PGR.exe, it will probably work.

Note: I did not verify any of this (except the fact that it's the same great implementation), merely a guess.

Looks like it's the same amazing ACE implementation as #451 , unfortunately the two-line workaround will not work, because the string `UnityPlayer.dll` is longer than `PGRBase.dll` and won't fit. Patching it would be a little more involved, but still absolutely trivial. I'm not interested in this game either though. Edit: yes, you can just take the patched exe from Reverse 1999 and rename it to PGR.exe, it will probably work. Note: I did not verify any of this (except the fact that it's the same great implementation), merely a guess.
Yukimana commented 5 months ago
Poster

I hope it doesn't have a way to detect that it's a different exe. It'd be great if it's dumb in that as well. Using the patched Reverse1999.exe as PGR.exe works perfectly for now.

I hope it doesn't have a way to detect that it's a different exe. It'd be great if it's dumb in that as well. Using the patched Reverse1999.exe as PGR.exe works perfectly for now.
Krock commented 5 months ago
Owner

@mkrsym1 Might it also work to copy or rename UnityPlayer.dll and do the binary patch in reverse?


Is there any official direct link to the Reverse1999 executable for those who would only like to play PGR?

@mkrsym1 Might it also work to copy or rename UnityPlayer.dll and do the binary patch in reverse? --- Is there any official direct link to the Reverse1999 executable for those who would only like to play PGR?
mkrsym1 commented 5 months ago

The only thing you have to do for the game to start is to somehow call UnityMain. You can do that, for example, with this piece of C code:

void *GetProcAddress(void *module, char *name);
void *LoadLibraryA(char *name);

int wWinMain(void *instance, void *prevInstance, void *cmdLine, int showCmd) {
  return ((int (*)())GetProcAddress(LoadLibraryA("UnityPlayer.dll"), "UnityMain"))(instance, prevInstance, cmdLine, showCmd);
}

You can use any cross-compiler of your liking, e.g. MinGW:

x86_64-w64-mingw32-gcc the_file.c -municode -Wl,--subsystem,windows -o PGR.exe

The compiled binary should then be able to launch both of the games (this might even be more stable than the two-line workaround I provided in #451 ).

Don't bother trying to use this on HI3/HSR/most other ACE games. Most likely they will either crash or exit immediately, or crash at some later point when something will call into the TVM section (which is missing from both PGR and R1999).

The only thing you have to do for the game to start is to somehow call UnityMain. You can do that, for example, with this piece of C code: ```c void *GetProcAddress(void *module, char *name); void *LoadLibraryA(char *name); int wWinMain(void *instance, void *prevInstance, void *cmdLine, int showCmd) { return ((int (*)())GetProcAddress(LoadLibraryA("UnityPlayer.dll"), "UnityMain"))(instance, prevInstance, cmdLine, showCmd); } ``` You can use any cross-compiler of your liking, e.g. MinGW: ``` x86_64-w64-mingw32-gcc the_file.c -municode -Wl,--subsystem,windows -o PGR.exe ``` The compiled binary should then be able to launch both of the games (this might even be more stable than the two-line workaround I provided in #451 ). Don't bother trying to use this on HI3/HSR/most other ACE games. Most likely they will either crash or exit immediately, or crash at some later point when something will call into the TVM section (which is missing from both PGR and R1999).
Krock commented 5 months ago
Owner

Thank you very much for this code. For convenience, I compiled your code with the Tiny C Compiler 0.9.27. Use at your own risk.

md5sum:  cd39b70d27f06a9cdec40ba099bca297
sha1sum: 30664fadb9707e9d43a2b92465a86b39c47b03af

Download link: https://drive.google.com/file/d/1NBUOXD3UMGI66GLq_Of0_XsiBGUHXEEO/view?usp=drive_link

Source code for completeness' sake (by mkrsym1):

void *GetProcAddress(void *module, char *name);
void *LoadLibraryA(char *name);

int wWinMain(void *instance, void *prevInstance, void *cmdLine, int showCmd) {
  return ((int (*)())GetProcAddress(LoadLibraryA("UnityPlayer.dll"), "UnityMain"))(instance, prevInstance, cmdLine, showCmd);
}
Thank you very much for this code. For convenience, I compiled your code with the Tiny C Compiler 0.9.27. **Use at your own risk.** ``` md5sum: cd39b70d27f06a9cdec40ba099bca297 sha1sum: 30664fadb9707e9d43a2b92465a86b39c47b03af ``` Download link: https://drive.google.com/file/d/1NBUOXD3UMGI66GLq_Of0_XsiBGUHXEEO/view?usp=drive_link Source code for completeness' sake (by mkrsym1): ```C++ void *GetProcAddress(void *module, char *name); void *LoadLibraryA(char *name); int wWinMain(void *instance, void *prevInstance, void *cmdLine, int showCmd) { return ((int (*)())GetProcAddress(LoadLibraryA("UnityPlayer.dll"), "UnityMain"))(instance, prevInstance, cmdLine, showCmd); } ```
Sign in to join this conversation.
Loading...
Cancel
Save
There is no content yet.