replace BitStream::ReadCompressed

This commit is contained in:
yugecin 2020-04-05 16:19:05 +02:00
parent 6f436ead4d
commit 267301a7ba
No known key found for this signature in database
GPG Key ID: BB3591E3D68964DE
9 changed files with 216 additions and 15 deletions

View File

@ -4,6 +4,7 @@
#include "common.h" #include "common.h"
#include "bitstream.h" #include "bitstream.h"
#include "packet.h" #include "packet.h"
#include <stdio.h>
__declspec(naked) __declspec(naked)
void __stdcall BitStream__ctor( void __stdcall BitStream__ctor(
@ -44,3 +45,61 @@ int __stdcall BitStream__Read(struct CBitStream *this, char *out)
jmp eax jmp eax
} }
} }
int __stdcall Hooked_BitStream__ReadCompressed(
char *out,
unsigned char a,
unsigned char unsignedData)
{
struct CBitStream *this;
unsigned char tmpa, tmpread;
int myReadOffset;
_asm mov this, ecx
tmpa = (a >> 3) - 1;
if (unsignedData) {
unsignedData = 0;
a = 0;
} else {
unsignedData = 0xFF;
a = 0xF0;
}
while (tmpa > 0) {
myReadOffset = this->readOffset + 1;
if (myReadOffset > this->numberOfBitsUsed) {
return 0;
}
if ((0x80 >> this->readOffset) == this->ptrData[myReadOffset]) {
this->readOffset = myReadOffset;
return (int) thiscall3(
(void*) 0x44DA70, this, (int) out, tmpa, 1);
}
this->readOffset = myReadOffset;
out[tmpa] = unsignedData;
tmpa--;
}
if (this->readOffset + 1 > this->numberOfBitsUsed) {
return 0;
}
if (!thiscall1((void*) 0x44D840, this, (int) &tmpread)) { /*readBit*/
return 0;
}
out += 0; /*? esi + ebx but esi should be always 0?*/
if (tmpread) {
if (!thiscall3((void*) 0x44DA70, this, (int) out, 4, 1)) {
return 0;
}
*out |= a;
} else {
if (!thiscall3((void*) 0x44DA70, this, (int) out, 8, 1)) {
return 0;
}
}
return 1;
}

View File

@ -21,3 +21,7 @@ void __stdcall BitStream__ctor(
void __stdcall BitStream__dtor(); void __stdcall BitStream__dtor();
int __stdcall BitStream__Read(struct CBitStream *this, char *out); int __stdcall BitStream__Read(struct CBitStream *this, char *out);
int __stdcall Hooked_BitStream__ReadCompressed(
char *out,
unsigned char,
unsigned char);

View File

@ -3,6 +3,67 @@
#include "common.h" #include "common.h"
__declspec(naked)
void * __stdcall thiscall0(void *address, void *this)
{
_asm {
add esp, 0xC
mov ecx, [esp-0x4]
mov eax, [esp-0x8]
push [esp-0xC]
jmp eax
}
}
__declspec(naked)
void * __stdcall thiscall1(void *address, void *this, int a)
{
_asm {
add esp, 0xC
mov ecx, [esp-0x4]
mov eax, [esp-0x8]
push [esp-0xC]
jmp eax
}
}
__declspec(naked)
void * __stdcall thiscall2(void *address, void *this, int a, int b)
{
_asm {
add esp, 0xC
mov ecx, [esp-0x4]
mov eax, [esp-0x8]
push [esp-0xC]
jmp eax
}
}
__declspec(naked)
void * __stdcall thiscall3(void *address, void *this, int a, int b, int c)
{
_asm {
add esp, 0xC
mov ecx, [esp-0x4]
mov eax, [esp-0x8]
push [esp-0xC]
jmp eax
}
}
__declspec(naked)
void * __stdcall thiscall4(void *address, void *this,
int a, int b, int c, int d)
{
_asm {
add esp, 0xC
mov ecx, [esp-0x4]
mov eax, [esp-0x8]
push [esp-0xC]
jmp eax
}
}
__declspec(naked) __declspec(naked)
void __stdcall RangeList__ctor(struct CRangeList *this) void __stdcall RangeList__ctor(struct CRangeList *this)
{ {

View File

@ -131,6 +131,11 @@ struct CInternalPacket {
EXPECT_SIZE(struct CInternalPacket, 0x38); EXPECT_SIZE(struct CInternalPacket, 0x38);
#pragma pack(pop) #pragma pack(pop)
void * __stdcall thiscall0(void *address, void *this);
void * __stdcall thiscall1(void *address, void *this, int);
void * __stdcall thiscall2(void *address, void *this, int, int);
void * __stdcall thiscall3(void *address, void *this, int, int, int);
void * __stdcall thiscall4(void *address, void *this, int, int, int, int);
void __stdcall RangeList__ctor(struct CRangeList *this); void __stdcall RangeList__ctor(struct CRangeList *this);
void __stdcall RangeList__dtor(struct CRangeList *this); void __stdcall RangeList__dtor(struct CRangeList *this);
int __stdcall BPlusTree__IsEmpty(void *this); int __stdcall BPlusTree__IsEmpty(void *this);

View File

@ -2,9 +2,11 @@
/* vim: set filetype=c ts=8 noexpandtab: */ /* vim: set filetype=c ts=8 noexpandtab: */
#include "common.h" #include "common.h"
#include "bitstream.h"
#include "rakpeer.h" #include "rakpeer.h"
#include "processnetworkpacket.h" #include "processnetworkpacket.h"
#include "uncompress.h" #include "uncompress.h"
#include "rangelist_deserialize.h"
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -24,4 +26,6 @@ void nethandler_init()
simple_redir_call(RP_PARSE_NETWORK_PACKET, ProcessNetworkPacket); simple_redir_call(RP_PARSE_NETWORK_PACKET, ProcessNetworkPacket);
simple_redir_call(RP_PARSE_CONNECTION_REQ, simple_redir_call(RP_PARSE_CONNECTION_REQ,
RakPeer__ParseConnectionRequestPacket); RakPeer__ParseConnectionRequestPacket);
//simple_redir_call((void*) 0x45F951, RangeList__Deserialize_hooked);
simple_redir_call((void*) 0x45E2EF, Hooked_BitStream__ReadCompressed);
} }

51
rangelist_deserialize.c Normal file
View File

@ -0,0 +1,51 @@
/* vim: set filetype=c ts=8 noexpandtab: */
#include "common.h"
#include "rangelist_deserialize.h"
#include "bitstream.h"
static
__declspec(naked)
int __stdcall RangeList__Deserialize(
struct CRangeList *this,
struct CBitStream *bitStream)
{
_asm {
pop eax
pop ecx
push eax
mov eax, 0x45E2D0
jmp eax
}
}
int __stdcall RangeList__Deserialize_hooked(struct CBitStream *bitStream)
{
struct CRangleList *this;
short result;
char confusingVar;
int value, valueshr3;
_asm mov this, ecx
thiscall0((void*) 0x45D820, this);
thiscall3((void*) 0x44DB30, bitStream, (int) &result, 0x10, 1);
if (result == 0) {
return 1;
}
confusingVar = *((char*) bitStream); // ??
if (bitStream->readOffset + 1 <= bitStream->numberOfBitsUsed) {
value = (int) bitStream->ptrData;
valueshr3 = value >> 3;
value &= 0x8000007;
if (value & 0x80000000) {
}
}
return 0;
}

8
rangelist_deserialize.h Normal file
View File

@ -0,0 +1,8 @@
/* vim: set filetype=c ts=8 noexpandtab: */
int __stdcall RangeList__Deserialize(
struct CRangeList *this,
struct CBitStream *bitStream);
int __stdcall RangeList__Deserialize_hooked(struct CBitStream *bitStream);

View File

@ -1,6 +1,8 @@
/* vim: set filetype=c ts=8 noexpandtab: */ /* vim: set filetype=c ts=8 noexpandtab: */
#define CALL_ORIGINAL
#define RELIABILITY_PRINT #define RELIABILITY_PRINT
#ifdef RELIABILITY_PRINT #ifdef RELIABILITY_PRINT
@ -13,6 +15,7 @@
#include "bitstream.h" #include "bitstream.h"
#include "rakpeer.h" #include "rakpeer.h"
#include "reliability.h" #include "reliability.h"
#include "rangelist_deserialize.h"
#include <stdio.h> #include <stdio.h>
__declspec(naked) __declspec(naked)
@ -74,21 +77,6 @@ __stdcall ReliabilityLayer__CreateInternalPacketFromBitStream(
} }
} }
static
__declspec(naked)
int __stdcall RangeList__Deserialize(
struct CRangeList *this,
struct CBitStream *bitStream)
{
_asm {
pop eax
pop ecx
push eax
mov eax, 0x45E2D0
jmp eax
}
}
/*ReliabilityLayer__RemovePacketFromResendListAndDeleteOlderReliableSequenced*/ /*ReliabilityLayer__RemovePacketFromResendListAndDeleteOlderReliableSequenced*/
__declspec(naked) __declspec(naked)
int __stdcall ReliabilityLayer__RemovePacketsConfirmedByAck( int __stdcall ReliabilityLayer__RemovePacketsConfirmedByAck(
@ -233,6 +221,9 @@ void AddBitsReceivedStatistic(struct CReliabilityLayer *this, int bits)
} }
} }
#ifdef CALL_ORIGINAL
__declspec(naked)
#endif
int __stdcall ReliabilityLayer__HandleSocketReceiveFromConnectedPlayer( int __stdcall ReliabilityLayer__HandleSocketReceiveFromConnectedPlayer(
struct CReliabilityLayer *this, struct CReliabilityLayer *this,
char *buffer, char *buffer,
@ -242,6 +233,15 @@ int __stdcall ReliabilityLayer__HandleSocketReceiveFromConnectedPlayer(
int MTUSize, int MTUSize,
int *ptrOutIsPacketFlood) int *ptrOutIsPacketFlood)
{ {
#ifdef CALL_ORIGINAL
_asm {
pop eax
pop ecx
push eax
mov eax, 0x45F7E0
jmp eax
}
#else
struct CInternalPacket *packet; struct CInternalPacket *packet;
struct CBitStream bitStream; struct CBitStream bitStream;
struct CRaknetTimeNS timeNS; struct CRaknetTimeNS timeNS;
@ -281,4 +281,5 @@ int __stdcall ReliabilityLayer__HandleSocketReceiveFromConnectedPlayer(
BitStream__dtor(&bitStream); BitStream__dtor(&bitStream);
dprintf("HandleSocketReceiveFromConnectedPlayerEnd\n"); dprintf("HandleSocketReceiveFromConnectedPlayerEnd\n");
return returnValue; return returnValue;
#endif
} }

View File

@ -141,6 +141,14 @@
RelativePath=".\rakpeer.h" RelativePath=".\rakpeer.h"
> >
</File> </File>
<File
RelativePath=".\rangelist_deserialize.c"
>
</File>
<File
RelativePath=".\rangelist_deserialize.h"
>
</File>
<File <File
RelativePath=".\reliability.c" RelativePath=".\reliability.c"
> >