Closed trister1997 closed 3 months ago
I have the same problem right now, would love help from anyone that was able to intercept the network traffic
A bit late, just want to add my two cents to the conversation.
I think its because the game uses UDP instead of TCP.
Forcing the WebSocket connection to fail doesn't work anymore, it'll fallback regardless. This in turn means forcing HTTPS doesn't work either, WebSocket requests run on TCP which is what we receive.
I've tried to intercept WS packets through Fiddlr to no avail and I've tried countless of methods, it may be my expertise but I had no success in getting these.
Been still looking for it.
You can hook the ProcessEvent (detour it, address = "4C 8B F1 E8 ?? ?? ?? ?? 85 C0 0F 84" - 0x4A) function. In your hook redirect the connection to your local server:
void __fastcall hooks::hooked_process_event( UObject* object, UFunction* function, void* params, void* result ) {
if (function) {
if (strcmp(function->GetFullName().c_str(), "Function ProjectX.PsyNetConnection_X.HandleUrlChanged") == 0) {
conn = (UPsyNetConnection_X*)object;
}
}
if (conn) {
// Change it every tick just incase.
conn->URL->URLv2 = FString(L"http://127.0.0.1/rpc");
}
}
On your localhost run the HTTP&WS mitm servers. Something like that would do the work: https://gist.github.com/SD4RK/94edba56876a45fffd30fc1a2a09727b (code is dirty; should have Python+flask+websockets installed). This is a dirty workaround but it works.
You can hook the ProcessEvent (detour it, address = "4C 8B F1 E8 ?? ?? ?? ?? 85 C0 0F 84" - 0x4A) function. In your hook redirect the connection to your local server:
void __fastcall hooks::hooked_process_event( UObject* object, UFunction* function, void* params, void* result ) { if (function) { if (strcmp(function->GetFullName().c_str(), "Function ProjectX.PsyNetConnection_X.HandleUrlChanged") == 0) { conn = (UPsyNetConnection_X*)object; } } if (conn) { // Change it every tick just incase. conn->URL->URLv2 = FString(L"http://127.0.0.1/rpc"); } }
On your localhost run the HTTP&WS mitm servers. Something like that would do the work: https://gist.github.com/SD4RK/94edba56876a45fffd30fc1a2a09727b (code is dirty; should have Python+flask+websockets installed). This is a dirty workaround but it works.
@SD4RK - I've been looking around, not too familiar with C++ but I am similar with other languages so I'm able to read it sort of. Are you using an SDK?
I've tried to maybe get this working with BakkesMod through
gameWrapper->HookEventPost("Function ProjectX.PsyNetConnection_X.HandleUrlChanged", std::bind(&WSRedirectPlugin::HookPsyNet, this));
But have not yet been able to convert your function and conn part yet. Thanks for your reply and detailed explanation, but I think I'm not quite figuring it out properly yet lol
Could you maybe add me on Discord? PGSleepy#2108
@SD4RK Hey, could you maybe add me on Discord? PGSleepy#2108 ^^
Just wondering, did we ever find anything useful from this PR?
Just wondering, did we ever find anything useful from this PR?
Yes, we did, but not exactly the same way as SD4RK proposed because that required you to reverse an SDK. Are you trying to get ranked information?
One of many sorts of information yes
One of many sorts of information yes
Add me on Discord, QESleepy.
So ive written a project around your findings to get stats for Steam, PS4, and Xbox. I appreciate all the work finding this information!
I was trying to figure out how to get the requests to go through fiddler so I could use your proxy and fiddler script to dump the requests, but I think its because the game uses UDP instead of TCP. How would I get the requests to show up in fiddler? Force the game to TCP or make the game use some proxy or something?
Thanks!