рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдореЗрд░рд╛ рдирд╛рдо Marat Gayanov рд╣реИ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде
Best Reverser рдХреЙрдиреНрдЯреЗрд╕реНрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЗрд╕ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП
рдХреАрдЬреЗрди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рд╡рд┐рд╡рд░рдг
рдЗрд╕ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ, рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЧрд╛ рдореЗрдЧрд╛ рдбреНрд░рд╛рдЗрд╡ (
best_reverser_phd9_rom_v4.bin ) рдХреЗ рд▓рд┐рдП ROM рдЧреЗрдореНрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп: рдРрд╕реА рдХреБрдВрдЬреА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЗ рдИрдореЗрд▓ рдкрддреЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдорд╛рдиреНрдп рдорд╛рдиреА рдЬрд╛рдПрдЧреАред
рддреЛ рд╕рдорд╛рдзрд╛рди ...
рдЙрдкрдХрд░рдг
рдХреБрдВрдЬреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдЖрдкрдХреЛ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпреЗ 16 рд╡рд░реНрдг рд╣реИрдВред рдпрджрд┐ рдХреБрдВрдЬреА рдЫреЛрдЯреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛: тАЬрдЧрд▓рдд рд▓рдВрдмрд╛рдИ! рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЛтАж тАЭред
рдЖрдЗрдП рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ (Alt-B) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдХреНрдпрд╛ рдкрд╛рдПрдВрдЧреЗ?
рд╣рдо рдХреЗрд╡рд▓ рдпрд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЖрд╕-рдкрд╛рд╕ рдХреА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рднреА рджреЗрдЦреЗрдВрдЧреЗ: тАЬрдЧрд▓рдд рдХреБрдВрдЬреА! рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ ... "рдФрд░" рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ! "
рдореИрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП
WRONG_LENGTH_MSG
,
YOU_ARE_THE_BEST_MSG
рдФрд░
WRONG_KEY_MSG
рд╕реЗрдЯ рдХрд░рддрд╛
WRONG_LENGTH_MSG
ред
рдкрддрд╛
0x0000FDFA
рдкрдврд╝рдиреЗ рдкрд░ рдПрдХ рдмреНрд░реЗрдХ
0x0000FDFA
- рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕рдВрджреЗрд╢ "рдЧрд▓рдд рд▓рдВрдмрд╛рдИ" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЛтАж тАЭред рдФрд░ рдбрд┐рдмрдЧрд░ рдЪрд▓рд╛рдПрдВ (рдпрд╣ рдХреБрдВрдЬреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рдмрд╛рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЙрдк рдкрд░ F9 рджрдмрд╛рдПрдВ)ред рдЕрдкрдирд╛ рдИрдореЗрд▓, рдХреБрдВрдЬреА
ABCD
рджрд░реНрдЬ рдХрд░реЗрдВред
рдбрд┐рдмрдЧрд░
0x00006FF0 tst.b (a1)+
: рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ
рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реА рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП
0x00001D2A jsr (sub_6FC0).l
ред
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдкрд╛рдП рдЧрдП рдереЗред рд▓реЗрдХрд┐рди рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐
WRONG_KEY_LEN_CASE_1D1C
рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХрд╣рд╛рдБ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдмреНрд░реЗрдХ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд╕ рдмреНрд▓реЙрдХ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддреАрд░ рдкрд░ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рдПрдБред рдХреЙрд▓рд░
0x000017DE loc_17DE
рдкрд░ рд╕реНрдерд┐рдд рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдирд╛рдо рдмрджрд▓рдХрд░
CHECK_KEY_LEN
):
рдкрддреЗ рдкрд░ рдПрдХ рдмреНрд░реЗрдХ рд▓рдЧрд╛рдПрдВ
0x000017EC cmpi.b 0x20 (a0, d0.l)
(рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА рд╡рд░реНрдг рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рдЦрд╛рд▓реА рд╡рд░реНрдг рд╣реИ рдпрд╛ рдирд╣реАрдВ), рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ, рдореЗрд▓ рдФрд░
ABCD
рдХреБрдВрдЬреА рджрд░реНрдЬ рдХрд░реЗрдВред рдбрд┐рдмрдЧрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рджрд░реНрдЬ рдХреА рдЧрдИ рдХреБрдВрдЬреА рдкрддрд╛
0x00FF01C7
рдкрд░ рд╕реНрдерд┐рдд рд╣реИ (рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЙрд╕ рдкрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ)
рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЦреЛрдЬ рд╣реИ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рд╕рдм рдХреБрдЫ рд╣рдбрд╝рдк рд▓реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ:
рдЗрд╕ рд╕реНрдерд╛рди рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдВрдЬреА рдХреЗ рдЖрдЧреЗ рдореЗрд▓ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:
рд╣рдо рдЧрд╣рд░рд╛ рдФрд░ рдЧрд╣рд░рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреБрдВрдЬреА рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирджрдВрдб рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдмрд▓реНрдХрд┐, рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реАред
рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирджрдВрдб
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛
рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд╛рд▓рди рд╣реЛрдЧрд╛ред рдЬрд╛рдБрдЪ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмреНрд▓реЙрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдпрд╣ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред
get_hash_2b
рдлрд╝рдВрдХреНрд╢рди (рдореВрд▓ рдореЗрдВ
sub_1526
рдерд╛) рдХреЛ рджреЛ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдВрдЬреА рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ рдЗрд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд░рдЬрд┐рд╕реНрдЯрд░
a0
рдореЗрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ
KEY_BYTE_0
), рджреВрд╕рд░реА рдмрд╛рд░ - рдкрд╛рдБрдЪрд╡рд╛ (
KEY_BYTE_4
)ред
рдореИрдВрдиреЗ рдлрдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рдирд╛рдо рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 2-рдмрд╛рдЗрдЯ рд╣реИрд╢ рдХреА рддрд░рд╣ рдХреБрдЫ рд╕рдордЭрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЙрдард╛рдпрд╛ред
рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рддреБрд░рдВрдд рдЗрд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред рд╡рд╣ рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬреЗрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдЙрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрдЧрд╣ рд▓реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд: рдЗрдирдкреБрдЯ рдкрддреЗ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕ рдкрддреЗ рд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рднреЗрдЬреА, рдФрд░ рдлрд╝рдВрдХреНрд╢рди 1,2,3,4 рд╡реЗрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдкрд╛рдВрдЪрд╡рд╛рдВ рджрд╛рдпрд░, рд╕рдорд╛рд░реЛрд╣ 5,6,7,8 рд╡реЗрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рдкрд╣рд▓реЗ рдЖрдзреЗ рднрд╛рдЧ рдХреА рдЧрдгрдирд╛ рд╣реЛрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо
d0
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рддреЛ
get_hash_2b
рдлрд╝рдВрдХреНрд╢рди:
рддреБрд░рдВрдд рдПрдХ рд╣реИрд╢ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ:
рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдпрд╛, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪреВрдВрдЧрд╛ (рдЕрднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ):
key_4s == decode_hash_4s(get_hash_2b(key_4s))
get_hash_2b
рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░
d0
рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╣рдо
0x000017FE
,
0x00001808
рдкрд░ рдмреНрд░реЗрдХ
0x00001808
, рдЬрд┐рд╕ рдХреБрдВрдЬреА рдХреЛ рд╣рдо
ABCDEFGHIJKLMNOP
рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред
рдорд╛рди
0xABCD
,
0xEF01
рд░рдЬрд┐рд╕реНрдЯрд░
d0
рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдФрд░ рдХреНрдпрд╛
get_hash_2b
?
>>> first_hash = get_hash_2b("ABCD") >>> hex(first_hash) 0xabcd >>> second_hash = get_hash_2b("EFGH") >>> hex(second_hash) 0xef01
рд╕рддреНрдпрд╛рдкрди рдкрд╛рд╕ рд╣реБрдЖред
рдлрд┐рд░
xor eor.w d0, d5
рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛
xor eor.w d0, d5
рд╣реИ, рдкрд░рд┐рдгрд╛рдо
d5
рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
>>> hex(0xabcd ^ 0xef01) 0x44cc
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реИрд╢ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
0x44CC
рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╣реИрд╢ рдХрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ
рдпрджрд┐ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рд╕рдХрддреЗред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣
d5
рд╕реЗ рдореЗрдореЛрд░реА рддрдХ рдЪрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╣реАрдВ рдФрд░ рдХрд╛рдо рдЖрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░реЗрд╕ (
d5
рджреЗрдЦрдиреЗ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдиреБрдЕрд▓ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рддред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорджрдж рдХрд░реЗрдЧрд╛:
#include <idc.idc> static main() { auto d5_val; auto i; for(;;) { StepOver(); GetDebuggerEvent(WFNE_SUSP, -1); d5_val = GetRegValue("d5"); // d5 if (d5_val != 0xFFFF44CC){ break; } } }
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╣рдо рдЕрдм рдЖрдЦрд┐рд░реА рдмреНрд░реЗрдХ
0x00001808 eor.w d0, d5
ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ (
Shift-F2
),
Run
рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдирд┐рд░реНрджреЗрд╢
0x00001C94 move.b (a0, a1.l), d5
рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
0x00001C94 move.b (a0, a1.l), d5
, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреНрд╖рдг рддрдХ
d5
рдкрд╣рд▓реЗ рд╣реА рд╕рд╛рдлрд╝ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
d5
рд╕реЗ рдорд╛рди рдХреЛ рдирд┐рд░реНрджреЗрд╢
0x00001C56 move.w d5,a6
d5
рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
0x00001C56 move.w d5,a6
: рдЗрд╕реЗ
0x00FF0D46
(2 рдмрд╛рдЗрдЯреНрд╕) рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ: рд╣реИрд╢ 0x00FF0D46
рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИредрд╣рдо рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ
0x00FF0D46-0x00FF0D47
рд╣реИрдВ рдЬреЛ
0x00FF0D46-0x00FF0D47
рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рдо рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ)ред рдкрдХрдбрд╝реЗ рдЧрдП 4 рдмреНрд▓реЙрдХ:




рд╕рд╣реА / рд╕рд╣реА рдХрд╛ рдЪрдпрди рдХреИрд╕реЗ рдХрд░реЗрдВ?
рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:
рдпрд╣ рдмреНрд▓реЙрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо
LOSER_CASE
рдпрд╛
WINNER_CASE
:
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ
d1
рдЬреАрддрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╢реВрдиреНрдп рд╕реЗрдЯ рдХрд╣рд╛рдВ рд╣реИ? рдмрд╕ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ:
рдпрджрд┐
loc_1EEC
рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реИ:
*(a6 + 0x24) == *(a6 + 0x22)
рддрдм рд╣рдореЗрдВ
d5
рдореЗрдВ рд╢реВрдиреНрдп рдорд┐рд▓рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдирд┐рд░реНрджреЗрд╢
0x00001F16 beq.w loc_20EA
, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
a6 + 0x24 = 0x00FF0D6A
рдФрд░ рдорд╛рди
0x4840
рд╡рд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдФрд░
a6 + 0x22 = 0x00FF0D68
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
0xCB4C -
ред
рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм 0x00FF0D6A
рдореЗрдВ рднреА 0xCB4C
ред рдпрд╣ рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирджрдВрдб рд╣реИредрд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐
0x00FF0D6A
рдореЗрдВ рдХреМрди рд╕реЗ рдмреНрд▓реЙрдХ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ - рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдмреНрд░реЗрдХ рд▓рдЧрд╛рдПрдВ, рдлрд┐рд░ рд╕реЗ рдореЗрд▓ рдФрд░ рдХреА рджрд░реНрдЬ рдХрд░реЗрдВред
рдФрд░ рд╣рдореЗрдВ рдпрд╣
loc_EAC
рдмреНрд▓реЙрдХ рдорд┐рд▓реЗрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ 3 рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рджреЛ рд╕рд┐рд░реНрдл
0x00FF0D6A
рдмрд╛рд╣рд░ рд╢реВрдиреНрдп):
рдпрд╣ рдмреНрд▓реЙрдХ
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИред
рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐
sub_E3E
рдлрд╝рдВрдХреНрд╢рди
sub_E3E
рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛
loc_1F94
,
loc_203E
:


рдпрд╛рдж рд░рдЦреЗрдВ рд╣рдореЗрдВ рдкрд╣рд▓реЗ 4 рдмреНрд▓реЙрдХ рдорд┐рд▓реЗ рдереЗ?
loc_1F94
рд╣рдордиреЗ рд╡рд╣рд╛рдВ рджреЗрдЦрд╛ - рдпрд╣ рдореБрдЦреНрдп рдХреБрдВрдЬреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред
рдкрд╣рд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реВрдк loc_1F94
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
loc_1F94
рдПрдХ рдЪрдХреНрд░ рдХреЛрдб рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдЗрд╕реЗ
0x00001FBA d4,loc_1F94
рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдирд┐рд░реНрджреЗрд╢
0x00001FBA d4,loc_1F94
):
рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рд╣реИ:
- рдПрдХ
sub_5EC
рдлрд╝рдВрдХреНрд╢рди рд╣реИред - рдирд┐рд░реНрджреЗрд╢ 0x00001FB4 jsr (a0) рд╕рдм_E3E рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
sub_5EC
рдлрд╝рдВрдХреНрд╢рди d0
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИ (рдпрд╣ рдиреАрдЪреЗ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ)ред- рдмрд╛рдЗрдЯ рдкрддреЗ
sp+0x33
( 0x00FFFF79
, рдбреАрдмрдЧрд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ) рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ d1
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХреБрдВрдЬреА рд╣реИрд╢ рдкрддреЗ ( 0x00FF0D47
) рд╕реЗ рджреВрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк рд░рд┐рдХреЙрд░реНрдб рдкрд░ 0x00FFFF79
рдкрд░ рдмреНрд░реЗрдХ 0x00FFFF79
: рдпрд╣ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ 0x00001F94 move.b 1(a2), 0x2F(sp)
ред рдЗрд╕ рд╕рдордп рд░рдЬрд┐рд╕реНрдЯрд░ a2
рдкрддреЗ рдХреЛ 0x00FF0D46
- рд╣реИрд╢ рдкрддреЗ, рдпрд╛рдиреА 0x1(a2) = 0x00FF0D46 + 1
- рд╣реИрд╢ рдХреЗ рджреВрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ 0x1(a2) = 0x00FF0D46 + 1
рдХрд░рддрд╛ рд╣реИред - рд░рдЬрд┐рд╕реНрдЯрд░
d0
рдХреЛ d0^d1
рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкрд░рд┐рдгрд╛рдореА xor'a рдкрд░рд┐рдгрд╛рдо
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕рдХреА рдкрд┐рдЫрд▓реА рдЧрдгрдирд╛ (рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред - рджреЛрд╣рд░рд╛рдПрдБред
рдпрд╣ рдЪрдХреНрд░ рдХрд┐рддрдиреА рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ?
рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:
#include <idc.idc> static main() { auto pc_val, d4_val, counter=0; while(pc_val != 0x00001F16) { StepOver(); GetDebuggerEvent(WFNE_SUSP, -1); pc_val = GetRegValue("pc"); if (pc_val == 0x00001F92){ counter++; d4_val = GetRegValue("d4"); print(d4_val); } } print(counter); }
0x00001F92 subq.l 0x1,d4
- рдпрд╣рд╛рдБ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реВрдк рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ
0x00001F92 subq.l 0x1,d4
рдХреНрдпрд╛ рд╣реЛрдЧрд╛:
рд╣рдо рд╕рдм_5рдИрд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред
sub_5EC
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ рдХреЛрдб:
рдЬрд╣рд╛рдБ
0x2c(a2)
рд╣рдореЗрд╢рд╛
0x00FF1D74
ред
рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
d0 = a2 + 0x2C *(a2+0x2C) = *(a2+0x2C) + 1 #*(0x00FF1D74) = *(0x00FF1D74) + 1 result = *(d0) & 0xFF
рдпрд╣реА рд╣реИ,
0x00FF1D74
рд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЬрдЧрд░ рдореЗрдВ
sub_5EC
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ
sub_5EC
?
- рдпрд╛ рдореЗрдореЛрд░реА рдбрдВрдк рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
- рдпрд╛ рдмрд╕ рд╕рднреА рджрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВред
рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдореБрдЭреЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, рдЕрд▓рдЧ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ? рдЗрд╕реЗ рджреЗрдЦреЗрдВред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА:
#include <idc.idc> static main() { auto pc_val=0, d0_val; while(pc_val != 0x00001F16){ pc_val = GetRegValue("pc"); if (pc_val == 0x00001F9C) StepInto(); else StepOver(); GetDebuggerEvent(WFNE_SUSP, -1); if (pc_val == 0x00000674){ d0_val = GetRegValue("d0") & 0xFF; print(d0_val); } } }
рдореИрдВ рд╕рд┐рд░реНрдл рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдХреА рддреБрд▓рдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреБрдВрдЬреА, рдореЗрд▓ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдВред
рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдИ рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
sub_5EC
рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рд╕рд░рдгреА рд╕реЗ рдЕрдЧрд▓рд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
def sub_5EC_gen(): dump = [0x92, 0x8A, 0xDC, 0xDC, 0x94, 0x3B, 0xE4, 0xE4, 0xFC, 0xB3, 0xDC, 0xEE, 0xF4, 0xB4, 0xDC, 0xDE, 0xFE, 0x68, 0x4A, 0xBD, 0x91, 0xD5, 0x0A, 0x27, 0xED, 0xFF, 0xC2, 0xA5, 0xD6, 0xBF, 0xDE, 0xFA, 0xA6, 0x72, 0xBF, 0x1A, 0xF6, 0xFA, 0xE4, 0xE7, 0xFA, 0xF7, 0xF6, 0xD6, 0x91, 0xB4, 0xB4, 0xB5, 0xB4, 0xF4, 0xA4, 0xF4, 0xF4, 0xB7, 0xF6, 0x09, 0x20, 0xB7, 0x86, 0xF6, 0xE6, 0xF4, 0xE4, 0xC6, 0xFE, 0xF6, 0x9D, 0x11, 0xD4, 0xFF, 0xB5, 0x68, 0x4A, 0xB8, 0xD4, 0xF7, 0xAE, 0xFF, 0x1C, 0xB7, 0x4C, 0xBF, 0xAD, 0x72, 0x4B, 0xBF, 0xAA, 0x3D, 0xB5, 0x7D, 0xB5, 0x3D, 0xB9, 0x7D, 0xD9, 0x7D, 0xB1, 0x13, 0xE1, 0xE1, 0x02, 0x15, 0xB3, 0xA3, 0xB3, 0x88, 0x9E, 0x2C, 0xB0, 0x8F] l = len(dump) offset = 0 while offset < l: yield dump[offset] offset += 1
0x02, 0x15, 0xB3, 0xA3, def sub_5EC_gen(): dump = [0x92, 0x8A, 0xDC, 0xDC, 0x94, 0x3B, 0xE4, 0xE4, 0xFC, 0xB3, 0xDC, 0xEE, 0xF4, 0xB4, 0xDC, 0xDE, 0xFE, 0x68, 0x4A, 0xBD, 0x91, 0xD5, 0x0A, 0x27, 0xED, 0xFF, 0xC2, 0xA5, 0xD6, 0xBF, 0xDE, 0xFA, 0xA6, 0x72, 0xBF, 0x1A, 0xF6, 0xFA, 0xE4, 0xE7, 0xFA, 0xF7, 0xF6, 0xD6, 0x91, 0xB4, 0xB4, 0xB5, 0xB4, 0xF4, 0xA4, 0xF4, 0xF4, 0xB7, 0xF6, 0x09, 0x20, 0xB7, 0x86, 0xF6, 0xE6, 0xF4, 0xE4, 0xC6, 0xFE, 0xF6, 0x9D, 0x11, 0xD4, 0xFF, 0xB5, 0x68, 0x4A, 0xB8, 0xD4, 0xF7, 0xAE, 0xFF, 0x1C, 0xB7, 0x4C, 0xBF, 0xAD, 0x72, 0x4B, 0xBF, 0xAA, 0x3D, 0xB5, 0x7D, 0xB5, 0x3D, 0xB9, 0x7D, 0xD9, 0x7D, 0xB1, 0x13, 0xE1, 0xE1, 0x02, 0x15, 0xB3, 0xA3, 0xB3, 0x88, 0x9E, 0x2C, 0xB0, 0x8F] l = len(dump) offset = 0 while offset < l: yield dump[offset] offset += 1
рддреЛ
sub_5EC
рддреИрдпрд╛рд░ рд╣реИред
sub_E3E
рдкрдВрдХреНрддрд┐ рдореЗрдВ
sub_E3E
ред
sub_E3E
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ рдХреЛрдб:
рд╕рдордЭрдиреЗ:
, d2, . a2 0xFF0D46, a2 + 0x34 = 0xFF0D7A d0 = *(a2 + 0x34) *(a2 + 0x34) = *(a2 + 0x34) + 1 , a0 a0 = d0 *(a0) = d2 offset, d2. a2 0xFF0D46, a2 + 0x24 = 0xFF0D6A - , (. ) 0x00000000, d0 = *(a2 + 0x24) d2 = d0 ^ d2 d2 = d2 & 0xFF d2 = d2 + d2 - 2 0x00011FC0 + d2, ROM, 0x00011FC0 + d2 a0 = 0x00011FC0 d2 = *(a0 + d2) 8 d0 = d0 >> 8 d2 = d0 ^ d2 *(a2 + 0x24) = d2
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдЗрди рдЪрд░рдгреЛрдВ рдореЗрдВ
sub_E3E
:
- рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╕рд╣реЗрдЬреЗрдВред
- рдСрдлрд╕реЗрдЯ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
0x00011FC0 + offset
(ROM) рдХреЗ рдкрддреЗ рдкрд░ 2 рдмрд╛рдЗрдЯреНрд╕ рдЦреАрдВрдЪреЗрдВред- рдкрд░рд┐рдгрд╛рдо =
( >> 8) ^ (2 0x00011FC0 + offset)
ред
рдЗрд╕ рд░реВрдк рдореЗрдВ
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
def sub_E3E(prev_sub_E3E_result, d2, d2_storage): def calc_offset(): return 2 * ((prev_sub_E3E_result ^ d2) & 0xff) d2_storage.append(d2) offset = calc_offset() with open("dump_00011FC0", 'rb') as f: dump_00011FC0_4096b = f.read() some = dump_00011FC0_4096b[offset:offset + 2] some = int.from_bytes(some, byteorder="big") prev_sub_E3E_result = prev_sub_E3E_result >> 8 return prev_sub_E3E_result ^ some
dump_00011FC0
рд╕рд┐рд░реНрдл рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рекреж реп рем рдмрд╛рдЗрдЯреНрд╕ рдХреЛ
[0x00011FC0:00011FC0+4096]
рд╕реЗ рдмрдЪрд╛рдпрд╛ред
1FC4 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЧрддрд┐рд╡рд┐рдзрд┐
рд╣рдордиреЗ рдЕрднреА рддрдХ
0x00001FC4
рдкрддреЗ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмреНрд▓реЙрдХ рд▓рдЧрднрдЧ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдмреНрд▓реЙрдХ рдкрддрд╛
0x00FF0D46
(рд░рдЬрд┐рд╕реНрдЯрд░
a2
) рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдХреБрдВрдЬреА рд╣реИрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдм рдЗрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
- рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рд╢рд╛рдЦрд╛ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
( ) & 0b1 != 0
ред рдпрд╛рдиреА, рд╣реИрд╢ рдХрд╛ рдкрд╣рд▓рд╛ рдмрд┐рдЯ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред - рдпрджрд┐ рдЖрдк рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:
- рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджрд╛рдИрдВ рдУрд░ 1 рдмрд┐рдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред
- рдмрд╛рдИрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реИрд╢ рдСрдкрд░реЗрд╢рди
0x8000
рдХрд┐рдпрд╛ 0x8000
ред - рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕реНрдб рд╣реИрд╢ рдорд╛рди
0x00FF0D46
рдкрддреЗ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рд╣реИрд╢ рдХреЛ рдПрдХ рдирдП рдорд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдореЛрдЯреЗ рддреМрд░ рдкрд░,
(a2)
рдореЗрдВ рдХреЛрдИ рд▓реЗрдЦрди рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ (рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рджреВрд╕рд░рд╛ рдСрдкрд░реЗрдВрдб (a2)
)ред
рдЗрд╕ рддрд░рд╣ рдПрдХ рдмреНрд▓реЙрдХ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЛ:
def transform(hash_2b): new = hash_2b >> 1 if hash_2b & 0b1 != 0: new = new | 0x8000 return new
рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реВрдк loc_203E рд╣реИ
loc_203E
- рд▓реВрдк, рдХреНрдпреЛрдВрдХрд┐
0x0000206C bne.s loc_203E
рдпрд╣ рдЪрдХреНрд░ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:
jsr (a0)
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рдВрдЪ рд▓рд┐рдпрд╛ рд╣реИ - рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рдо рдХреЗ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдХреБрдЫ рдЗрдирдкреБрдЯ рддрд░реНрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдКрдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░
d2
рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣рд╛рдВ
d0
рдорд╛рдзреНрдпрдо рд╕реЗ) )ред
рдЖрдЗрдП
d0
рдХрд┐
d0
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕реЗ рдХреНрдпрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдирд┐рд░реНрдорд╛рдг
0x34(a2)
-
sub_E3E
рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╛рд░рд┐рдд рддрд░реНрдХ рдЗрд╕ рд▓реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВред
рдХреЛрдб рднрд╛рдЧ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ:
2 a2+0x1C move.w 0x1C(a2), d0 neg.l d0 a0 sub_E3E movea.l 0x34(a2), a0 , d0 2 a0-d0( d0 ) move.b (a0, d0.l), d0
рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛ рдПрдХ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рддрд░реНрдХ рдХреЛ
d0
рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ 4 рдХреЛ
d0
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪреМрдереЗ рддрддреНрд╡ рдХреЛ рдЕрдВрдд рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
d0
рдХреНрдпрд╛
d0
? рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХ рд▓рдЧрд╛рддреЗ рд╣реБрдП, рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦ рджрд┐рдпрд╛ред рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ:
0x04, 0x04, 0x04, 0x1C, 0x1A, 0x1A, 0x06, 0x42, 0x02
ред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реНрдг рдХреБрдВрдЬреА рд╣реИрд╢ рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИред
рдкреВрд░реНрдг рд╣реИрд╢ рдЧрдгрдирд╛ рд╕рдорд╛рд░реЛрд╣
def finish_hash(hash_2b):
рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдБрдЪ
- рдбреАрдмрдЧрд░ рдореЗрдВ, рд╣рдо
0x0000180A move.l 0x1000,(sp)
рдХреЗ рдкрддреЗ рдкрд░ 0x0000180A move.l 0x1000,(sp)
(рд╣реИрд╢ рдЧрдгрдирд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж)ред 0x00001F16 beq.w loc_20EA
(рдирд┐рд░рдВрддрд░ 0xCB4C
рд╕рд╛рде рдЕрдВрддрд┐рдо рд╣реИрд╢ рдХреА рддреБрд▓рдирд╛) рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХред- рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдХреБрдВрдЬреА
ABCDEFGHIJKLMNOP
Enter
, Enter Enter
ред - рдбреАрдмрдЧрд░
0x0000180A
рдкрд░ 0x0000180A
, рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рди 0xFFFF44CC
d5
рд░рдЬрд┐рд╕реНрдЯрд░ 0x44CC
, 0x44CC
рдкрд╣рд▓рд╛ рд╣реИрд╢ рд╣реИред - рд╣рдо рдЖрдЧреЗ рдбрд┐рдмрдЧрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо
0x00001F16
рдкрд░ 0x00001F16
рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 0x00FF0D6A
рдкрд░ 0x00FF0D6A
рд╕реНрдерд┐рдд рд╣реИ - рдЕрдВрддрд┐рдо рд╣реИрд╢
- рдЕрдм рд╣рдорд╛рд░реЗ finish_hash (hash_2b) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ:
>>> r = finish_hash(0x44CC) >>> print(hex(r)) 0x4840
рд╣рдо рд╕рд╣реА рдХреБрдВрдЬреА 1 рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рд╕рд╣реА рдХреБрдВрдЬреА рдпрд╣ рдХреБрдВрдЬреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдВрддрд┐рдо рд╣реИрд╢
0xCB4C
(рдКрдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛) рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рд╡рд╛рд▓: рдлрд╛рдЗрдирд▓ рдХреЗ рд▓рд┐рдП
0xCB4C
рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд╣реИрд╢ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдЕрдм рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
def find_CB4C(): result = [] for hash_2b in range(0xFFFF+1): final_hash = finish_hash(hash_2b) if final_hash == 0xCB4C: result.append(hash_2b) return result >>> r = find_CB4C() >>> print(r)
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реИ: рдкрд╣рд▓рд╛ рд╣реИрд╢
0xFEDC
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдореЗрдВ рдХрд┐рди рд╡рд░реНрдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рд╣реИрд╢
0xFEDC
?
рдЪреВрдБрдХрд┐
0xFEDC = __4_ ^ __4_
рдмрд╛рдж,
0xFEDC = __4_ ^ __4_
, рдЖрдкрдХреЛ рдХреЗрд╡рд▓
__4_
рдХреЗ
__4_
рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЗ рдХрд╛
__4_ = __4_ ^ 0xFEDC
ред рдФрд░ рдлрд┐рд░ рджреЛрдиреЛрдВ рд╣реИрд╢ рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
def get_first_half(): from collections import deque from random import randint def get_pairs(): pairs = [] for i in range(0xFFFF + 1): pair = (i, i ^ 0xFEDC) pairs.append(pair) pairs = deque(pairs) pairs.rotate(randint(0, 0xFFFF)) return list(pairs) pairs = get_pairs() for pair in pairs: key_4s_0 = decode_hash_4s(pair[0]) key_4s_1 = decode_hash_4s(pair[1]) hash_2b_0 = get_hash_2b(key_4s_0) hash_2b_1 = get_hash_2b(key_4s_1) if hash_2b_0 == pair[0] and hash_2b_1 == pair[1]: return key_4s_0, key_4s_1
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдХреЛрдИ рднреА рдЪреБрдиреЗрдВред
рд╣рдо рд╕рд╣реА рдХреБрдВрдЬреА 2 рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдХреБрдВрдЬреА рдХрд╛ рдкрд╣рд▓рд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рддреИрдпрд╛рд░ рд╣реИ, рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдХреЛрдб рдХрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЯреБрдХрдбрд╝рд╛
0x00FF2012
рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рдореИрдиреБрдЕрд▓ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╕реЗ рд▓рдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдкрддрд╛
0x00001F16 beg.w loc_20EA
(рдХреБрдВрдЬреА рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХрд╛ рд╕рддреНрдпрд╛рдкрди) рд╣реИред рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ
a0
рдореЗрд▓ рдПрдбреНрд░реЗрд╕ рд╣реИ,
loc_FF2012
рдПрдХ рдЪрдХреНрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
bne.s loc_FF2012
рдЗрд╕реЗ рддрдм рддрдХ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ
*(a0+d0)
(рдореЗрд▓ рдХрд╛ рдЕрдЧрд▓рд╛ рдмрд╛рдЗрдЯ) рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
рдФрд░
jsr (a3)
рдирд┐рд░реНрджреЗрд╢ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд
get_hash_2b
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдХреБрдВрдЬреА рдХреЗ рджреВрд╕рд░реЗ рдЫрдорд╛рд╣реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ:
while(d1 != 0x20){ d2++ d1 = d1 & 0xFF d3 = d3 + d1 d0 = 0 d0 = d2 d1 = *(a0+d0) } d0 = get_hash_2b(key_byte_8) d3 = d0^d3 d0 = get_hash_2b(key_byte_12) d2 = d2 - 1 d2 = d2 << 8 d2 = d0^d2 if (d2 == d3) success_branch
рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ
d2
-
( -1) << 8
ред
d3
, рдореЗрд▓ рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдпреЛрдЧред
рд╢реБрджреНрдзрддрд╛ рдорд╛рдирджрдВрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
__ ^ d2 == ___2 ^ d3
ред
рд╣рдо рдХреБрдВрдЬреА рдХреА рджреВрд╕рд░реА рдЫрдорд╛рд╣реА рдХреЗ рдЪрдпрди рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
def get_second_half(email): from collections import deque from random import randint def get_koeff(): k1 = sum([ord(c) for c in email]) k2 = (len(email) - 1) << 8 return k1, k2 def get_pairs(k1, k2): pairs = [] for a in range(0xFFFF + 1): pair = (a, (a ^ k1) ^ k2) pairs.append(pair) pairs = deque(pairs) pairs.rotate(randint(0, 0xFFFF)) return list(pairs) k1, k2 = get_koeff() pairs = get_pairs(k1, k2) for pair in pairs: key_4s_0 = decode_hash_4s(pair[0]) key_4s_1 = decode_hash_4s(pair[1]) hash_2b_0 = get_hash_2b(key_4s_0) hash_2b_1 = get_hash_2b(key_4s_1) if hash_2b_0 == pair[0] and hash_2b_1 == pair[1]: return key_4s_0, key_4s_1
keygen
рдореЗрд▓ рдПрдХ рдХреИрдкреНрд╕реВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
def keygen(email): first_half = get_first_half() second_half = get_second_half(email) return "".join(first_half) + "".join(second_half) >>> email = "M.GAYANOV@GMAIL.COM" >>> print(keygen(email)) 2A4FD493BA32AD75
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рд╕рднреА рдХреЛрдб
рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред