What's new

C/C++ Some research on The Binding of Isaac: Rebirth

  • Thread starter XeClutch
  • Start date
  • Views 2,383
X

XeClutch

Contingency Dev
Messages
3,687
Reaction score
2,452
Was on a vacation awhile back to Tennessee and was messing with my friends brothers' computer and did some research on The Binding of Isaac: Rebirth. All I had was Cheat Engine so I wasn't able to get much done but I've mapped a few things out, feel free to use them.

Character enumeration
C++:
typedef enum _TBIR_Character : unsigned long
{
        Isaac = 0x0ACEE4E0,
        Magalene = 0x0ACEE590,
        Cain = 0x0ACEE640,
        Judas = 0x0ACEE6F0,
        BlueBaby = 0x0ACEE7A0,
        Eve = 0x0ACEE850,
        Samson = 0x0ACEE900,
        Azazel = 0x0ACEE9B0,
        Lazarus = 0x0ACEEA60,
        Eden = 0x0ACEEB10,
        TheLost = 0x0ACEEBC0
        Lazarus2 = 0x0ACEEC70,
        BlackJudas = 0x0ACEED20,
} TBIR_Character;
Player structure
C++:
typedef struct _TBIR_PlayerStruct
{
        // Probably more data in the beginning but I've haven't had access to IDA or ReClass
        
        char szDirection[9];
        // "HeadLeft " - Head is facing left
        // "HeadUp   " - Head is facing up
        // "HeadRight" - Head is facing right
        // "HeadDown " - Head is facing down
        unsigned char padding1[3];
        unsigned char unknown1[0x14];
     
        unsigned long dwMaxHearts; // max = 0x00000018
        unsigned long dwHeartCount;
        unsigned char unknown2[0x14];
     
        unsigned long dwKeyCount;
        unsigned char unknown3[8];
     
        unsigned long dwBombCount;
        unsigned long dwCoinCount;
        unsigned char unknown4[0x10];
     
        bool bMoving;
        unsigned char padding2[3];
        unsigned char unknown5[0x14];
        
        TBIR_Character character;
        unsigned char unknown
        
        unsigned long dwTearShotCount; // not 100% sure about this one
        unsigned char unknown6[0x104];
     
        unsigned long dwMovementFlag;
        // 0x00000000 - Moving left
        // 0x00000001 - Moving up
        // 0x00000002 - Moving right
        // 0x00000003 - Moving down
        // 0xFFFFFFFF - Not moving
} TBIR_PlayerStruct, *pTBIR_PlayerStruct;

Staff: I had no idea what section to post this in so if it needs to be moved please move it.
 
H

Hiyper

Enthusiast
Messages
227
Reaction score
61
Would you mind telling me how you did this with CE?
 
X

XeClutch

Contingency Dev
Messages
3,687
Reaction score
2,452
But what tool? How did you get variable names and variable types?
I came up with them. Figured out what they represented through tests and named them.
 
A

Auschwitz Guard

Banned
Messages
195
Reaction score
122
If you're doubtful that their could be more members than you've listed, then you've done it all wrong seeing that you don't know the size, why don't you try learning x86 and reverse engineer the exe instead of this dumping crap? GG though I guess

EDIT:
Moving flag is wrong, here is why
  1. You use the identifier unsigned, when by the readings of your testing, it's clearly signed
  2. You should learn more about bitflags and bits in general. 0x3 is a combination of 0x1 OR 0x2, which up and right combined logically could not equal down.
C++:
typedef enum : long
{
      MOVE_NONE = -1,
      MOVE_LEFT,
      MOVE_UP,
      MOVE_RIGHT,
      MOVE_DOWN
}movementType_t;
This is a more logical system for the member opposed to a bitflag
EDIT2:
I assume this member only has references to a store data thread? I can't see it having load support, seeing as more data such as speed, time and distance would be required. (If you didn't understand what I meant; is the members purpose for reading only or reading and writing?)
 
Last edited:
X

XeClutch

Contingency Dev
Messages
3,687
Reaction score
2,452
If you're doubtful that their could be more members than you've listed, then you've done it all wrong seeing that you don't know the size, why don't you try learning x86 and reverse engineer the exe instead of this dumping crap? GG though I guess

EDIT:
Moving flag is wrong, here is why
  1. You use the identifier unsigned, when by the readings of your testing, it's clearly signed
  2. You should learn more about bitflags and bits in general. 0x3 is a combination of 0x1 OR 0x2, which up and right combined logically could not equal down.
C++:
typedef enum : long
{
      MOVE_NONE = -1,
      MOVE_LEFT,
      MOVE_UP,
      MOVE_RIGHT,
      MOVE_DOWN
}movementType_t;
This is a more logical system for the member opposed to a bitflag
EDIT2:
I assume this member only has references to a store data thread? I can't see it having load support, seeing as more data such as speed, time and distance would be required. (If you didn't understand what I meant; is the members purpose for reading only or reading and writing?)
I know x64 and I could finish this if I wanted to but I'm not interested, that's why I released it. This just kept me busy while I was out of town. Everything in the struct is correct as it is, whether I went with proper naming conventions and whatnot is a different story.
 
A

Auschwitz Guard

Banned
Messages
195
Reaction score
122
I know x64 and I could finish this if I wanted to but I'm not interested, that's why I released it. This just kept me busy while I was out of town. Everything in the struct is correct as it is, whether I went with proper naming conventions and whatnot is a different story.

I see the constructive side of my response flew over your head...
 
Top Bottom