Compara dois dumps do Free Fire — um não ofuscado (OB51) e um ofuscado (OB53) — e gera um mapeamento de classes, fields e métodos entre as duas versões.
- Python 3.8+
- Nenhuma dependência externa
Abra o d.py e edite as duas primeiras variáveis para apontar para seus dumps:
DEFAULT_OB51 = "51.cs" # dump não ofuscado
DEFAULT_OB53 = "53.cs" # dump ofuscadoOu passe os caminhos diretamente via argumento:
python d.py message --ob51 OB51.cs --ob53 OB53.csO argumento principal é o namespace que você quer analisar.
python d.py <Namespace>python d.py message
python d.py COW.GamePlay
python d.py tcp
python d.py protoAntes de rodar, use isso para ver todos os namespaces presentes no dump:
python d.py --list-nsSaída:
>> Namespaces disponiveis no OB51:
COW
COW.GamePlay
COW.GamePlay.UGCRuntime
COW.Gameplay
message
tcp
proto
...
Você pode combinar namespace com uma classe base para filtrar apenas subclasses específicas:
python d.py message --base-class UDPClientMessageBase
python d.py message --base-class TCPClientMessageBase
python d.py tcp --base-class TCPClientMessageBaseUse --search para encontrar uma classe pelo nome e ver o equivalente ofuscado:
python d.py message --search JoinMatchReqInfo
python d.py message --search PlayerInfo
python d.py COW.GamePlay --search WeaponPara ver os fields e métodos mapeados, adicione --show-fields:
python d.py message --search JoinMatchReqInfo --show-fieldsSaída:
================================================================
OB51 -> JoinMatchReqInfo
────────────────────────────────────────────────────────────────
[OB51] JoinMatchReqInfo
Namespace: message
Fields : 53
[OB53] DBGNDLHOIEJ
Namespace: message
Fields : 53
--- Fields ---
Offset OB51 (legivel) OB53 (ofuscado)
--------------------------------------------------------------------------
0x18 UserID MIJOCMKONAD [UInt64]
0x20 RoomID DGCJANAMDBJ [UInt64]
0x28 RoomType PHGKDHDOJPN [Byte]
...
--- Methods ---
OB53 (ofuscado) -> OB51 (legivel)
----------------------------------------------------------------------
Serialize == Serialize [Void]
UnSerialize == UnSerialize [Void]
Recycle == Recycle [Void]
python d.py message --list-allSaída:
================================================================================
OB51 (Legivel) Status OB53 (Ofuscado)
────────────────────────────────────────────────────────────────────────────────
C2S_RUDP_JoinMatch_Req EXATO CBNIDAPCOEP
JoinMatchReqInfo PARCIAL 36/53 DBGNDLHOIEJ
PProfileData SEM MATCH
...
Toda execução gera dois outputs automaticamente:
Contém o mapeamento completo de todas as classes:
mapping_message_51_vs_53.json
mapping_COW.GamePlay_51_vs_53.json
Estrutura de cada entrada no JSON:
{
"JoinMatchReqInfo": {
"ob51_name": "JoinMatchReqInfo",
"ob51_namespace": "message",
"ob51_fields": [
{ "type": "UInt64", "name": "UserID", "offset": "0x18" },
{ "type": "UInt64", "name": "RoomID", "offset": "0x20" }
],
"match_type": "partial",
"ob53_exact": [],
"ob53_partial": [
{
"name": "DBGNDLHOIEJ",
"score": 36,
"fields": [
{ "type": "UInt64", "name": "MIJOCMKONAD", "offset": "0x18" }
],
"method_map": [
{ "ob53": "Serialize", "ob51": "Serialize", "return_type": "Void" }
]
}
]
}
}Um arquivo .h por classe mapeada:
headers_message/
JoinMatchReqInfo.h
C2S_RUDP_JoinMatch_Req.h
PProfileData.h
...
Conteúdo de cada .h:
// Class : JoinMatchReqInfo
// OB53 : DBGNDLHOIEJ
// Namespace : message
// Inherits : UDPClientMessageBase
// Dll : Assembly-CSharp.dll
// Match : partial (36/53)
// --- Fields ---
// 0x18 MIJOCMKONAD -> UserID [UInt64]
// 0x20 DGCJANAMDBJ -> RoomID [UInt64]
// 0x28 PHGKDHDOJPN -> RoomType [Byte]
// --- Methods ---
// Serialize -> Serialize [Void]
// UnSerialize -> UnSerialize [Void]
// Recycle -> Recycle [Void]Se quiser apenas ver estatísticas ou fazer uma busca sem gerar arquivos:
# Sem JSON e sem headers
python d.py COW.GamePlay --no-json --no-headers
# Busca rápida sem gerar nada
python d.py message --search JoinMatch --no-json --no-headerspython d.py message --export meu_mapping.json| Argumento | Descrição |
|---|---|
<Namespace> |
Namespace a filtrar (ex: message, COW.GamePlay) |
--ob51 <arquivo> |
Caminho do dump não ofuscado |
--ob53 <arquivo> |
Caminho do dump ofuscado |
--base-class <nome> |
Filtro adicional por classe base |
--search <nome> |
Busca uma classe pelo nome |
--show-fields |
Mostra fields e métodos no --search |
--list-all |
Lista todas as classes com status de match |
--list-ns |
Lista todos os namespaces disponíveis |
--headers <pasta> |
Pasta customizada para os .h |
--no-headers |
Não gera arquivos .h |
--no-json |
Não salva JSON automático |
--export <arquivo> |
Exporta JSON em caminho específico |
| Status | Descrição |
|---|---|
EXATO |
Field types idênticos em ordem — match 100% confiável |
PARCIAL |
Prefixo de types coincide (ex: 36/53) — provável mas não garantido |
SEM MATCH |
Classe não encontrada no dump ofuscado |