Skip to content

Instantly share code, notes, and snippets.

@Andoryuuta
Created July 9, 2021 04:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Andoryuuta/d1995724f360d5d145f70e7462b74468 to your computer and use it in GitHub Desktop.
Save Andoryuuta/d1995724f360d5d145f70e7462b74468 to your computer and use it in GitHub Desktop.
Monster Hunter Stories 2 blowfish key generation
#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