Files
ghidra-cli/crackme/__pycache__/keygen.cpython-314.pyc
T

86 lines
8.2 KiB
Plaintext
Raw Normal View History

2026-01-26 16:04:00 -08:00
+
ˆ"wiÔãóØRt^RItRtRtRtRtRtRtRtR R
lt R R lt
R
Rlt RRlt RRlt
RRltRt]R8Xd(^RIt]P$!]!4;'g^4R#R#)z;Keygen for Ragnarok.exe crackme based on bytecode analysis.NlÅ9i“imNÆAi90l¾:ýßL¸lÿÿÿÿlÿÿcó0V^8„dQhR\R\/#©éÚusernameÚreturn)ÚstrÚint)Úformats"Ú./home/kiselev/git/ghidra-cli/crackme/keygen.pyÚ __annotate__r s÷ ñ œð ¤ñ ócót\pVF+p\V4V, \,\,pK- V#)zrCompute FNV-1a hash of username.
Binary does: hash = (byte ^ hash) * prime
Note the XOR happens BEFORE multiply.
)ÚFNV_INITÚordÚ FNV_PRIMEÚMASK_32)rÚ
hash_valueÚchars& r
Ú
fnv1a_hashrs1ô €Jۈܘ4“y :ÕÕ:¼gÕ
ñà Ðr có0V^8„dQhR\R\/#)rÚstater)r)r s"r
r r s÷2”Cð2œCñ2r cóHV\,\,\,#)zPerform one LCG step.)ÚLCG_MULTÚLCG_ADDr)rs&r
Úlcg_nextrsà ”HÕ œwÕ &¬'Õ 1r có0V^8„dQhR\R\/#r)rÚtuple)r s"r
r r s÷//,¤3ð/,¬5ñ/,r có¬\V4p\V4p\V4pV^, R,VR,,pTp\V4p\V4pV^, R,VR,,pTp\V4p\V4pV^, R,VR,,pTp\V4p\V4pV^, R,VR,,pTp\V4pV^, R,p\V4pV^, R,p \V4pV^, R,p
\V4pV^, R,p WEWgW‰W«3#)zêGenerate C1-C4 and PRNG offsets from username hash.
From FUN_140001bf0 decompilation:
- Two LCG steps per coefficient
- Coefficient = (state1 >> 16 & 0x7fff) | (state2 & 0x7fff0000)
- This creates a 30-bit value with bit 15 always 0
iÿiÿ)rr) rrÚstate1Ústate2Úc1Úc2Úc3Úc4Úp1Úp2Úp3Úp4s & r
Úextract_coefficientsr( sCô
 €Eôe‹_€FÜ

€FØ R<˜
! f¨zÕ&9Õ :€BØ €Eôe_€FÜ

€FØ R<˜
! f¨zÕ&9Õ :€BØ €Eôe_€FÜ

€FØ R<˜
! f¨zÕ&9Õ :€BØ €Eôe_€FÜ

€FØ R<˜
! f¨zÕ&9Õ :€BØ €Eô
UO€EØ
2+˜Õ €Bä UO€EØ
2+˜Õ €Bä UO€EØ
2+˜Õ €Bä UO€EØ
2+˜Õ €Bà B˜B  +r c
óTV^8„dQhR\R\R\R\R\/#)rÚcoeffsÚs1Ús2Ús3r)rr)r s"r
r r Rs/÷ñœð¤Cð¬Sð´cð¼cñr cóòVwrErgr‰r«WA, V,p WR,V , p
Wc,
V
,pWÍ,V,\,p\V,
\,pVVV , , pV#)Solve for S4 given coefficients and S1, S2, S3.
From VM trace, the actual equation is:
R0 = (C1 ^ S1 + p1) + ((C2 + S2) ^ p2) + (C3 - S3 + p3) + ((C4 ^ S4) ^ p4)
Each serial part is processed differently:
- S1: XOR with C1, then ADD p1
- S2: ADD to C2, then XOR with p2
- S3: SUB from C3, then ADD p3
- S4: XOR with C4, then XOR with p4
Solving for S4:
TARGET = partial + ((C4 ^ S4) ^ p4)
(C4 ^ S4) ^ p4 = TARGET - partial
C4 ^ S4 = (TARGET - partial) ^ p4
S4 = C4 ^ ((TARGET - partial) ^ p4)
)ÚMASK_64ÚTARGET)r*r+r,r-r r!r"r#r$r%r&r'Úr1Úr2Úr3ÚpartialÚneededÚs4s&&&& r
Ú solve_serialr7Rsið$&,Ñ"€BˆBB˜
'R€BØ
'R€BØ
'B,€Bàw˜|œwÕ&€Gô¤'Õ
)€FØ ˆv˜€Bà
€Ir c ó`V^8„dQhR\R\R\R\R\R\/#)rrr+r,r-r6r)rrr)r s"r
r r ts6÷
ñ
œCð
¤Sð
¬cð
´
Äð
Ìñ
r cóö\V4pVwrgr‰r«rÍWa, V
,pWr,V , pWƒ,
V ,pW”, V
, pWï,V,V,\,pVV\8H3#)z?Verify serial produces target value. Returns (result, matches).)r(r/r0)rr+r,r-r6r*r r!r"r#r$r%r&r'r1r2r3Úr4Úr0s&&&&& r
Ú
verify_serialr<tslä
!