Created
July 9, 2021 04:24
-
-
Save Andoryuuta/d1995724f360d5d145f70e7462b74468 to your computer and use it in GitHub Desktop.
Monster Hunter Stories 2 blowfish key generation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <cstdint> | |
uint32_t HIDWORD(uint64_t v) { | |
return v >> 32; | |
} | |
class MtRandom { | |
public: | |
unsigned long field_0; | |
unsigned long field_4; | |
unsigned long field_8; | |
unsigned long field_C; | |
void Init(unsigned int seed) | |
{ | |
int v2; // r12 | |
int v3; // r3 | |
unsigned int v4; // lr | |
unsigned int v5; // r2 | |
int v6; // r1 | |
int v7; // r5 | |
v2 = 0x159A55E5; | |
this->field_0 = 123456789; | |
this->field_4 = 0x159A55E5; | |
v3 = 521288629; | |
v4 = 88675123; | |
v5 = seed ^ 0xAC9365; | |
v6 = 100; | |
this->field_8 = 521288629; | |
this->field_C = 88675123; | |
do | |
{ | |
v7 = v2; | |
v2 = v3; | |
v3 = v4; | |
--v6; | |
v5 ^= (0x65AC9365u >> (v5 & 3)) ^ ((v5 ^ (0x65AC9365u >> (v5 & 3))) >> 3) ^ ((v5 ^ (0x65AC9365u >> (v5 & 3))) >> 4) ^ (8 * (v5 ^ (0x65AC9365u >> (v5 & 3)))) ^ (16 * (v5 ^ (0x65AC9365u >> (v5 & 3)))); | |
v4 ^= v5 ^ (v5 << 15) ^ ((v5 ^ (v5 << 15)) >> 4) ^ (v4 >> 21); | |
} while (v6); | |
this->field_0 = v7; | |
this->field_4 = v2; | |
this->field_8 = v3; | |
this->field_C = v4; | |
} | |
int nrand() | |
{ | |
uint64_t v1; // kr00_8 | |
unsigned int v2; // r1 | |
int v3; // r1 | |
v1 = *(uint64_t*)&this->field_8; | |
v2 = this->field_0 ^ (this->field_0 << 15); | |
this->field_0 = this->field_4; | |
*(uint64_t*)&this->field_4 = v1; | |
v3 = v2 ^ (v2 >> 4) ^ HIDWORD(v1) ^ (HIDWORD(v1) >> 21); | |
this->field_C = v3; | |
return v3; | |
} | |
}; | |
int main() { | |
const char alphabet[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x7B, 0x7C, 0x7D, 0x7E, 0x20, 0x00}; | |
MtRandom mrand; | |
uint32_t rand_seed = 0x1FE01ED9; | |
char output[56]; | |
bool unk_mode = 0; | |
if (unk_mode == 1) | |
{ | |
mrand.Init(rand_seed); | |
for (size_t i = 0; i < 56; i++) | |
{ | |
char x = alphabet[(unsigned int)mrand.nrand() % 0x62]; | |
output[i] = x; | |
} | |
} | |
else | |
{ | |
mrand.Init((rand_seed >> 1) + 1); | |
for (size_t i = 0; i < 56; i++) | |
{ | |
output[i] = alphabet[(unsigned int)mrand.nrand() % 0x62]; | |
} | |
} | |
for (int i = 0; i < 56; i++) | |
{ | |
printf("%02X ", output[i]); | |
} | |
printf("\n"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment