рд╣рдо PHDays 9 рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд░рд┐рд╡рд░реНрд╕рд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВ

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдореЗрд░рд╛ рдирд╛рдо 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 -    def get_hash_2b(key_4s): #    def transform(b): # numbers -. if b <= 0x39: r = b - 0x30 # Letter case and @ else: # @ABCDEF if b <= 0x46: r = b - 0x37 else: # WXYZ if b >= 0x57: r = b - 0x57 # GHIJKLMNOPQRSTUV else: r = 0xff - (0x57 - b) + 1 # a9+b return r #    key_4b = bytearray(key_4s, encoding="ascii") #     codes = [transform(b) for b in key_4b] #      part0 = (codes[0] & 0xff) << 0xc part1 = (codes[1] << 0x8) & 0xf00 part2 = (codes[2] << 0x4) & 0xf0 hash_2b = (part0 | part1) & 0xffff hash_2b = (hash_2b | part2) & 0xffff hash_2b = (hash_2b | (codes[3] & 0xf)) return hash_2b 

рддреБрд░рдВрдд рдПрдХ рд╣реИрд╢ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ:

 #    4-  def decode_hash_4s(hash_2b): #    def transform(b): if b <= 0x9: return b + 0x30 if b <= 0xF: return b + 0x37 if b >= 0x0: return b + 0x57 return b - 0xa9 #         b0 = transform(hash_2b >> 12) b1 = transform((hash_2b & 0xfff) >> 8) b2 = transform((hash_2b & 0xff) >> 4) b3 = transform(hash_2b & 0xf) #  key_4s = [chr(b0), chr(b1), chr(b2), chr(b3)] key_4s = "".join(key_4s) return key_4s 

рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдпрд╛, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪреВрдВрдЧрд╛ (рдЕрднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ):

 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 ):

рдЫрд╡рд┐

рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рд╣реИ:

  1. рдПрдХ sub_5EC рдлрд╝рдВрдХреНрд╢рди рд╣реИред
  2. рдирд┐рд░реНрджреЗрд╢ 0x00001FB4 jsr (a0) рд╕рдм_E3E рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

  1. sub_5EC рдлрд╝рдВрдХреНрд╢рди d0 рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИ (рдпрд╣ рдиреАрдЪреЗ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ)ред
  2. рдмрд╛рдЗрдЯ рдкрддреЗ sp+0x33 ( 0x00FFFF79 , рдбреАрдмрдЧрд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ) рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ d1 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХреБрдВрдЬреА рд╣реИрд╢ рдкрддреЗ ( 0x00FF0D47 ) рд╕реЗ рджреВрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк рд░рд┐рдХреЙрд░реНрдб рдкрд░ 0x00FFFF79 рдкрд░ рдмреНрд░реЗрдХ 0x00FFFF79 : рдпрд╣ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ 0x00001F94 move.b 1(a2), 0x2F(sp) ред рдЗрд╕ рд╕рдордп рд░рдЬрд┐рд╕реНрдЯрд░ a2 рдкрддреЗ рдХреЛ 0x00FF0D46 - рд╣реИрд╢ рдкрддреЗ, рдпрд╛рдиреА 0x1(a2) = 0x00FF0D46 + 1 - рд╣реИрд╢ рдХреЗ рджреВрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ 0x1(a2) = 0x00FF0D46 + 1 рдХрд░рддрд╛ рд╣реИред
  3. рд░рдЬрд┐рд╕реНрдЯрд░ d0 рдХреЛ d0^d1 рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. рдкрд░рд┐рдгрд╛рдореА xor'a рдкрд░рд┐рдгрд╛рдо sub_E3E рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕рдХреА рдкрд┐рдЫрд▓реА рдЧрдгрдирд╛ (рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
  5. рджреЛрд╣рд░рд╛рдПрдБред

рдпрд╣ рдЪрдХреНрд░ рдХрд┐рддрдиреА рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ?

рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:

 #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 ?

  1. рдпрд╛ рдореЗрдореЛрд░реА рдбрдВрдк рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
  2. рдпрд╛ рдмрд╕ рд╕рднреА рджрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВред

рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдореБрдЭреЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, рдЕрд▓рдЧ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ? рдЗрд╕реЗ рджреЗрдЦреЗрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА:

 #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 :

  1. рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╕рд╣реЗрдЬреЗрдВред
  2. рдСрдлрд╕реЗрдЯ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
  3. 0x00011FC0 + offset (ROM) рдХреЗ рдкрддреЗ рдкрд░ 2 рдмрд╛рдЗрдЯреНрд╕ рдЦреАрдВрдЪреЗрдВред
  4. рдкрд░рд┐рдгрд╛рдо = ( >> 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 ) рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдХреБрдВрдЬреА рд╣реИрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдм рдЗрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

  1. рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рд╢рд╛рдЦрд╛ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: ( ) & 0b1 != 0 ред рдпрд╛рдиреА, рд╣реИрд╢ рдХрд╛ рдкрд╣рд▓рд╛ рдмрд┐рдЯ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдпрджрд┐ рдЖрдк рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:
    • рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджрд╛рдИрдВ рдУрд░ 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): #    def transform(hash_2b): new = hash_2b >> 1 if hash_2b & 0b1 != 0: new = new | 0x8000 return new main_cycle_counter = [17, 2, 2, 3, 4, 38, 10, 30, 4] second_cycle_counter = [2, 2, 2, 2, 2, 4, 2, 4, 28] counters = list(zip(main_cycle_counter, second_cycle_counter)) d2_storage = [] storage_offsets = [0x04, 0x04, 0x04, 0x1C, 0x1A, 0x1A, 0x06, 0x42, 0x02] prev_sub_E3E_result = 0x0000 sub_5EC = sub_5EC_gen() for i in range(9): c = counters[i] for _ in range(c[0]): d0 = next(sub_5EC) d1 = hash_2b & 0xff d2 = d0 ^ d1 curr_sub_E3E_result = sub_E3E(prev_sub_E3E_result, d2, d2_storage) prev_sub_E3E_result = curr_sub_E3E_result storage_offset = storage_offsets.pop(0) for _ in range(c[1]): d2 = d2_storage[-storage_offset] curr_sub_E3E_result = sub_E3E(prev_sub_E3E_result, d2, d2_storage) prev_sub_E3E_result = curr_sub_E3E_result hash_2b = transform(hash_2b) return curr_sub_E3E_result 

рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдБрдЪ


  1. рдбреАрдмрдЧрд░ рдореЗрдВ, рд╣рдо 0x0000180A move.l 0x1000,(sp) рдХреЗ рдкрддреЗ рдкрд░ 0x0000180A move.l 0x1000,(sp) (рд╣реИрд╢ рдЧрдгрдирд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж)ред
  2. 0x00001F16 beq.w loc_20EA (рдирд┐рд░рдВрддрд░ 0xCB4C рд╕рд╛рде рдЕрдВрддрд┐рдо рд╣реИрд╢ рдХреА рддреБрд▓рдирд╛) рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХред
  3. рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдХреБрдВрдЬреА ABCDEFGHIJKLMNOP Enter , Enter Enter ред
  4. рдбреАрдмрдЧрд░ 0x0000180A рдкрд░ 0x0000180A , рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рди 0xFFFF44CC d5 рд░рдЬрд┐рд╕реНрдЯрд░ 0x44CC , 0x44CC рдкрд╣рд▓рд╛ рд╣реИрд╢ рд╣реИред
  5. рд╣рдо рдЖрдЧреЗ рдбрд┐рдмрдЧрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
  6. рд╣рдо 0x00001F16 рдкрд░ 0x00001F16 рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 0x00FF0D6A рдкрд░ 0x00FF0D6A рд╕реНрдерд┐рдд рд╣реИ - рдЕрдВрддрд┐рдо рд╣реИрд╢
    рдЫрд╡рд┐
  7. рдЕрдм рд╣рдорд╛рд░реЗ 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 

рдЫрд╡рд┐

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

Source: https://habr.com/ru/post/hi453194/


All Articles