рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢


рдкрд░рд┐рдЪрдп


рдорд╛рд░реНрдЪ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд╣рдордиреЗ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрд╕рддреНрдпрд╛рдкрд┐рдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдПрдХ рдЫрд┐рдкреА рдХреНрд╖рдорддрд╛ рдХреА рдЦреЛрдЬ рдХреАред рдЖрдЬ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣реИрдХрд░реНрд╕ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрд╣реБрдд рдЖрдХреНрд░рд╛рдордХ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдпрд╣ рдореИрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрдбрд╝ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдЗрдЯреЛрдВ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП (рдпрд╛рдиреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд╢реНрд▓реАрд▓ рдХреНрд▓рд┐рдк, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдПрдкреАрдХреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдмреНрд░рд╛рдЙрдЬрд╝рд░), рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рднрдпрд╛рд╡рд╣ рдмреИрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреБрд░рд╛рдирд╛, рдХрдордЬреЛрд░ рдФрд░ рд╕рд╛рдорд╛рди рдЬреИрд╕рд╛ рд╣реИред рд╡реАрдХреЗ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдореВрд╣ рдХрд╛ рдПрдХ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдЪрд┐рдд рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред 2016 рдореЗрдВ, рд░реВрд╕реА рдореЗрдВ рднреА рд╡реАрдбрд┐рдпреЛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдерд╛ (рд╣рд╛рдБ, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЬреЛ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ)ред

рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА Google Play рдкрд░ 500,000,000 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд╛рдкрдирд╛рдПрдБ рд╣реИрдВред рдпрд╣ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИ - рдХреЗрд╡рд▓ Google Chrome рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИред рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЖрдк Google Play рдкрд░ рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╢рд┐рдХрд╛рдпрддреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдзреНрдпрдпрди рдХрд╛ рдХрд╛рд░рдг рдерд╛: рд╣рдордиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреБрдЫ рдмреБрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд╣ рдпрд╣ рдХрд░ рд░рд╣рд╛ рдерд╛!

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛, рдЬреЛ Google Play рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд┐рдЯрдо рд╣рдорд▓реЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рдорд▓реЗ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрддреЗ рд╣реИрдВред

рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕рдм рдХреБрдЫ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдЬреЛ рдЕрдзреНрдпрдпрди рдХреЗ рд╕рдордп Google Play рдкрд░ рдореМрдЬреВрдж рдерд╛:

package: com.UCMobile.intl versionName: 12.10.8.1172 versionCode: 10598 sha1 APK-: f5edb2243413c777172f6362876041eb0c3a928c 

рд╣рдорд▓рд╛ рд╡реЗрдХреНрдЯрд░


рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рдХрдЯ рдореЗрдВ, рдЖрдк com.uc.deployment.UpgradeDeployService рдирд╛рдордХ рдПрдХ рд╕реЗрд╡рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  <service android:exported="false" android:name="com.uc.deployment.UpgradeDeployService" android:process=":deploy" /> 

рдЬрдм рдпрд╣ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ puds.ucweb.com/upgrad/index.xhtml рдкрд░ POST рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдпрд╛рддрд╛рдпрд╛рдд рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╡рд╛рдм рдореЗрдВ, рдЙрд╕реЗ рдПрдХ рдЕрдкрдбреЗрдЯ рдпрд╛ рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдиреЗ рдРрд╕реА рдХрдорд╛рдВрдб рдирд╣реАрдВ рджреА, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреАрдбреАрдПрдл рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдкрддреЗ рдкрд░ рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдореВрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛: рдПрдХ рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреАрдбреАрдПрдл рдЦреЛрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬреЛ рдХрд┐ рдПрдкреАрдХреЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдФрд░ рдкреАрдбреАрдПрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рдерд╛ред

рдЗрд╕рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реАрдзреЗ рдкреАрдбреАрдПрдл рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдкрд╣рд▓реЗ puds.ucweb.com/upgrad/index.xhtml рдкрд░ POST рдЕрдиреБрд░реЛрдз рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж
рдкреАрдбреАрдПрдл рдФрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ (рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛), рдФрд░ рдЗрд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдкрддрд╛ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдХреБрдЫ рдФрд░ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реИред

рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

рд░рд┐рд╕реНрдкрд╛рдВрд╕ рд╕реНрдирд┐рдкреЗрдЯ







рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ рдЬрд╝рд┐рдк рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЛрдб рдЦреЛрдЬреЗрдВ



рдЪрд▓реЛ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред com.uc.deployment.UpgradeDeployService : onStartCommand рд╡рд┐рдзрд┐ рд╕реЗ, com.uc.deployment.bx рдкрд░ рдЬрд╛рдПрдВ , рдФрд░ рдЗрд╕реЗ com.uc.browser.core.dcfe рдкрд░ рджреЗрдЦреЗрдВ :

  public final void e(l arg9) { int v4_5; String v3_1; byte[] v3; byte[] v1 = null; if(arg9 == null) { v3 = v1; } else { v3_1 = arg9.iGX.ipR; StringBuilder v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]product:"); v4.append(arg9.iGX.ipR); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]version:"); v4.append(arg9.iGX.iEn); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]upgrade_type:"); v4.append(arg9.iGX.mMode); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]force_flag:"); v4.append(arg9.iGX.iEo); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]silent_mode:"); v4.append(arg9.iGX.iDQ); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]silent_type:"); v4.append(arg9.iGX.iEr); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]silent_state:"); v4.append(arg9.iGX.iEp); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]silent_file:"); v4.append(arg9.iGX.iEq); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apk_md5:"); v4.append(arg9.iGX.iEl); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]download_type:"); v4.append(arg9.mDownloadType); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]download_group:"); v4.append(arg9.mDownloadGroup); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]download_path:"); v4.append(arg9.iGH); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apollo_child_version:"); v4.append(arg9.iGX.iEx); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apollo_series:"); v4.append(arg9.iGX.iEw); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apollo_cpu_arch:"); v4.append(arg9.iGX.iEt); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apollo_cpu_vfp3:"); v4.append(arg9.iGX.iEv); v4 = new StringBuilder("["); v4.append(v3_1); v4.append("]apollo_cpu_vfp:"); v4.append(arg9.iGX.iEu); ArrayList v3_2 = arg9.iGX.iEz; if(v3_2 != null && v3_2.size() != 0) { Iterator v3_3 = v3_2.iterator(); while(v3_3.hasNext()) { Object v4_1 = v3_3.next(); StringBuilder v5 = new StringBuilder("["); v5.append(((au)v4_1).getName()); v5.append("]component_name:"); v5.append(((au)v4_1).getName()); v5 = new StringBuilder("["); v5.append(((au)v4_1).getName()); v5.append("]component_ver_name:"); v5.append(((au)v4_1).aDA()); v5 = new StringBuilder("["); v5.append(((au)v4_1).getName()); v5.append("]component_ver_code:"); v5.append(((au)v4_1).gBl); v5 = new StringBuilder("["); v5.append(((au)v4_1).getName()); v5.append("]component_req_type:"); v5.append(((au)v4_1).gBq); } } j v3_4 = new j(); mb(v3_4); h v4_2 = new h(); mb(v4_2); ay v5_1 = new ay(); v3_4.hS(""); v3_4.setImsi(""); v3_4.hV(""); v5_1.bPQ = v3_4; v5_1.bPP = v4_2; v5_1.yr(arg9.iGX.ipR); v5_1.gBF = arg9.iGX.mMode; v5_1.gBI = arg9.iGX.iEz; v3_2 = v5_1.gAr; c.aBh(); v3_2.add(g.fs("os_ver", c.getRomInfo())); v3_2.add(g.fs("processor_arch", com.uc.baacgetCpuArch())); v3_2.add(g.fs("cpu_arch", com.uc.baacPb())); String v4_3 = com.uc.baacPd(); v3_2.add(g.fs("cpu_vfp", v4_3)); v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo()))); v3_2.add(g.fs("fromhost", arg9.iGX.iEm)); v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn)); v3_2.add(g.fs("target_lang", arg9.iGX.iEs)); v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt)); v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu)); v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv)); v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx)); v3_2.add(g.fs("ver_series", arg9.iGX.iEw)); v3_2.add(g.fs("child_ver", r.aVw())); v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl)); v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature())); v3_2.add(g.fs("upgrade_log", i.bjt())); v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ))); v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp))); v3_2.add(g.fs("silent_file", arg9.iGX.iEq)); v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr))); v3_2.add(g.fs("cpu_archit", com.uc.baacPc())); v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction())); boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true; v3_2.add(g.fs("neon", String.valueOf(v4_4))); v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.baacJl()))); v3_2.add(g.fs("ram_1", String.valueOf(com.uc.baahPo()))); v3_2.add(g.fs("totalram", String.valueOf(com.uc.baahOL()))); c.aBh(); v3_2.add(g.fs("rom_1", c.getRomInfo())); v4_5 = e.getScreenWidth(); int v6 = e.getScreenHeight(); StringBuilder v7 = new StringBuilder(); v7.append(v4_5); v7.append("*"); v7.append(v6); v3_2.add(g.fs("ss", v7.toString())); v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT))); v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks())); Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator(); while(v4_6.hasNext()) { Object v6_1 = v4_6.next(); v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue())); } v3 = v5_1.toByteArray(); } if(v3 == null) { this.iGY.iGI.a(arg9, "up_encode", "yes", "fail"); return; } v4_5 = this.iGY.iGw ? 0x1F : 0; if(v3 == null) { } else { v3 = gi(v4_5, v3); if(v3 == null) { } else { v1 = new byte[v3.length + 16]; byte[] v6_2 = new byte[16]; Arrays.fill(v6_2, 0); v6_2[0] = 0x5F; v6_2[1] = 0; v6_2[2] = ((byte)v4_5); v6_2[3] = -50; System.arraycopy(v6_2, 0, v1, 0, 16); System.arraycopy(v3, 0, v1, 16, v3.length); } } if(v1 == null) { this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail"); return; } if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) { this.iGY.iGI.a(arg9, "up_url", "yes", "fail"); return; } StringBuilder v0 = new StringBuilder("["); v0.append(arg9.iGX.ipR); v0.append("]url:"); v0.append(this.iGY.mUpgradeUrl); com.uc.browser.core.dci v0_1 = this.iGY.iGI; v3_1 = this.iGY.mUpgradeUrl; com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.dci$a(v0_1, arg9)); v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb"; n v3_5 = v0_2.uc(v3_1); mb(v3_5, false); v3_5.setMethod("POST"); v3_5.setBodyProvider(v1); v0_2.b(v3_5); this.iGY.iGI.a(arg9, "up_null", "yes", "success"); this.iGY.iGI.b(arg9); } 

рд╣рдо рдпрд╣рд╛рдВ POST рдЕрдиреБрд░реЛрдз рдХреЗ рдЧрдарди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо 16 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ рдЗрд╕рдХреЗ рднрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: 0x5F, 0, 0x1F, -50 (= 0xCE)ред рдКрдкрд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╡рд╣ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдЙрд╕реА рдХрдХреНрд╖рд╛ рдореЗрдВ, рдЖрдк рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИ:

  public final void a(l arg10, byte[] arg11) { f v0 = this.iGQ; StringBuilder v1 = new StringBuilder("["); v1.append(arg10.iGX.ipR); v1.append("]:UpgradeSuccess"); byte[] v1_1 = null; if(arg11 == null) { } else if(arg11.length < 16) { } else { if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) { goto label_57; } int v3 = 1; int v5 = arg11[1] == 1 ? 1 : 0; if(arg11[2] != 1 && arg11[2] != 11) { if(arg11[2] == 0x1F) { } else { v3 = 0; } } byte[] v7 = new byte[arg11.length - 16]; System.arraycopy(arg11, 16, v7, 0, v7.length); if(v3 != 0) { v7 = gj(arg11[2], v7); } if(v7 == null) { goto label_57; } if(v5 != 0) { v1_1 = gP(v7); goto label_57; } v1_1 = v7; } label_57: if(v1_1 == null) { v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail"); return; } q v11 = gb(arg10, v1_1); if(v11 == null) { v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail"); return; } if(v0.iGY.iGt) { v0.d(arg10); } if(v0.iGY.iGo != null) { v0.iGY.iGo.a(0, ((o)v11)); } if(v0.iGY.iGs) { v0.iGY.a(((o)v11)); v0.iGY.iGI.a(v11, "up_silent", "yes", "success"); v0.iGY.iGI.a(v11); return; } v0.iGY.iGI.a(v11, "up_silent", "no", "success"); } } 

рд╡рд┐рдзрд┐ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ 0x60 рд╣реИ рдпрд╛ рддреАрд╕рд░рд╛ рдмрд╛рдЗрдЯ 0xD0 рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдмрд╛рдЗрдЯ 1, 11 рдпрд╛ 0x1F рд╣реИред рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдЙрддреНрддрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ - 0x60, рджреВрд╕рд░рд╛ - 0x1F, рддреАрд╕рд░рд╛ - 0x60ред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ("up_decrypt", рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП), рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдпрд╣рд╛рдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред
рд╣рдо рдЬреАрдЬреЗ рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдСрдлрд╕реЗрдЯ 2 рдкрд░ рдмрд╛рдЗрдЯ (рдпрд╛рдиреА, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0x1F) рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд┐рдирд╛
рдкрд╣рд▓реЗ 16 рдмрд╛рдЗрдЯреНрд╕ред

  public static byte[] j(int arg1, byte[] arg2) { if(arg1 == 1) { arg2 = cc(arg2, c.adu); } else if(arg1 == 11) { arg2 = m.aF(arg2); } else if(arg1 != 0x1F) { } else { arg2 = EncryptHelper.decrypt(arg2); } return arg2; } 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рд╡рд╣реА рдмрд╛рдЗрдЯ, рдЬреЛ рд╣рдорд╛рд░реЗ рдореЗрдВ рд╣реИ
рдорд╛рдорд▓рд╛ 0x1F рд╣реИ, рддреАрди рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рд╣рдо рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдПрдХ-рджреЛ рдЪреБрдЯрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдмрд╛рдпрдмрд╛рдЗрдЯреНрд╕рдмрд╛рдпрдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рдеред

рдпрд╣рд╛рдВ, рджреЛ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рд╣рдорд╛рд░реЗ рдЙрддреНрддрд░ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрдирд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  private static byte[] decryptBytesByKey(byte[] bytes) { byte[] v0 = null; if(bytes != null) { try { if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) { } else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) { return v0; } else { byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE]; // 2  System.arraycopy(bytes, 0, prefix, 0, prefix.length); String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); //   if(keyId == null) { return v0; } else { a v2 = EncryptHelper.ayL(); if(v2 == null) { return v0; } else { byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE]; System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length); return v2.l(keyId, enrypted); } } } } catch(SecException v7_1) { EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode()); return v0; } catch(Throwable v7) { EncryptHelper.handleDecryptException(v7, 2); return v0; } } return v0; } 

рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдХреБрдВрдЬреА рдЕрднреА рддрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреА "рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рд╣реИред рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред

рдЕрдЧрд▓реА рд╡рд┐рдзрд┐ рдореЗрдВ, рдореМрдЬреВрджрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рджреЛ рдФрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЪрд╛рд░ рд╣реИрдВ: рдЬрд╛рджреВ рдирдВрдмрд░ 16, рдкреНрд░рдореБрдЦ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдФрд░ рдПрдХ рд╕рдордЭрджрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦрд╛рд▓реА)ред

  public final byte[] l(String keyId, byte[] encrypted) throws SecException { return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, ""); } 

рдХрдИ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEnnryptComponent рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА staticBinarySafeDecryptNoB64 рд╡рд┐рдзрд┐ рдкрд░ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ ред рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдХреЛрдИ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓ lib / armeabi-v7a / libsgmain.so рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ .so рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ ajar рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

 package com.alibaba.wireless.security.ai; // ... public class a implements IStaticDataEncryptComponent { private ISecurityGuardPlugin a; // ... private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) { return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString}); } // ... private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) { return this.a(2, magicInt, 0, keyId, encrypted, magicString); } // ... public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException { if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) { return this.b(magicInt, keyId, encrypted, magicString); } throw new SecException("", 301); } //... } 

рдпрд╣рд╛рдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╣рдорд╛рд░реА рд╕реВрдЪреА рджреЛ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реИ: 2 рдФрд░ 0. рджреНрд╡рд╛рд░рд╛
рд╕рднреА рдХреЗ рд▓рд┐рдП, 2 рдХрд╛ рдЕрд░реНрде рд╣реИ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди, рдЬреИрд╕реЗ рдХрд┐ javax.crypto.Cipher рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓рд╛рд╕ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВред рдФрд░ рдпрд╣ рд╕рдм 10601 рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХрдорд╛рдВрдб рдирдВрдмрд░ рд╣реИред

рдЕрдЧрд▓реА рд╕рдВрдХреНрд░рдордг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ IRouterComponent рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ doCommand рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 package com.alibaba.wireless.security.mainplugin; import com.alibaba.wireless.security.framework.IRouterComponent; import com.taobao.wireless.security.adapter.JNICLibrary; public class a implements IRouterComponent { public a() { super(); } public Object doCommand(int arg2, Object[] arg3) { return JNICLibrary.doCommandNative(arg2, arg3); } } 

рдФрд░ JNICLibrary рдХреНрд▓рд╛рд╕ рднреА, рдЬрд┐рд╕рдореЗрдВ doCommandNative рдореВрд▓ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ :

 package com.taobao.wireless.security.adapter; public class JNICLibrary { public static native Object doCommandNative(int arg0, Object[] arg1); } 

рддреЛ, рд╣рдо рдореВрд▓ рдХреЛрдб рдореЗрдВ doCommandNative рд╡рд┐рдзрд┐ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рдлрд┐рд░ рдордЬрд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдорд╢реАрди рдХреЛрдб рдХрд╛ рд╡рд┐рд░реЛрдз


Libsgmain.so рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдореВрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ .jar рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рд╛ рд╣реИ) рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ: libsgmainso-6.4.36.so ред рдЗрд╕реЗ рдЖрдИрдбреАрдП рдореЗрдВ рдЦреЛрд▓реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдмрдХреНрд╕реЗ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рддрд╛рд▓рд┐рдХрд╛ рдЕрдорд╛рдиреНрдп рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдЯреЗрдмрд▓ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╣реЗрдбрд░ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рд╢реВрдиреНрдп рдХрд░рддреЗ рд╣реБрдП, рдмрд╕ рд╕реЗрдХреНрд╢рди рдЯреЗрдмрд▓ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред



рдлрд┐рд░ рд╕реЗ рдЖрдИрдбреАрдП рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВред

рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдШреЛрд╖рд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдлреЙрд░реНрдо рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рд╣реИ Java_package_name_ClassName_Method_name ред

рджреВрд╕рд░рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИ ( JNI_OnLoad рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ)
RegisterNatives рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд╛рдо рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative ред

рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдРрд╕рд╛ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрдВрдЬреАрдХрд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо JNI_OnLoad рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:



рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдПрдЖрд░рдПрдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рд╕реНрдЯреИрдХ рдкрд░ рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ R0, R1 рдФрд░ R2), рд╕рд╛рде рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ LR рдХреА рд╕рд╛рдордЧреНрд░реА, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕реА рдкрддрд╛ рд╕реНрдерд┐рдд рд╣реИред рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде, рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рдкрддрд╛ рддреБрд░рдВрдд рдкреАрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреЗрдирд▓реНрдЯреАрдЯреНрдпреВрдЯ рдЕрдиреБрджреЗрд╢ рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реЛрдЧрд╛
рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрдиред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрддрд╛ 0xB130 рдХреЛ R1 рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 5 рдЗрд╕реЗ рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ R0 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 0x10 рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 0xB13B рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдИрдбреАрдП рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдкрд╕реА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдкрддреЗ 0xB13B рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реИред

рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдЖрд░рдПрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рджреЛ рдореЛрдб рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯ рд╣реИрдВ: рдПрдЖрд░рдПрдо рдФрд░ рдердореНрдмред рдкрддреЗ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 0xB13A рд╣реИ, рдФрд░ рдХрдо рдмрд┐рдЯ рдореЗрдВ рдЗрдХрд╛рдИ рдЕрдВрдЧреВрдареЗ рдореЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕рдорд╛рди "рдПрдбреЗрдкреНрдЯрд░" рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░
рдХрдЪрд░рд╛ рдХреЛрдбред рдЖрдЧреЗ рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ - рд╣рдо рд╕рд┐рд░реНрдл рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ
рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реБрд░реБрдЖрдд рдереЛрдбрд╝реА рдФрд░ рд╣реИред

рдЪреВрдВрдХрд┐ рдХреЛрдб рдореЗрдВ 0xB13A рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреНрд░рдордг рдирд╣реАрдВ рд╣реИ, рдЖрдИрдбреАрдП рдиреЗ рд╕реНрд╡рдпрдВ рдпрд╣ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирд╛ рдХрд┐ рдХреЛрдб рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдерд╛ред рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреЛ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдЖрдИрдбреАрдП рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рд╣реИ:



0xB144 рдкрд░, рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред Sub_494C рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?



рдЬрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ LR рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ (0xB144)ред R0 рдореЗрдВ, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХред рдпрд╣реА рд╣реИ, рдПрдХ рдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрд▓рдЖрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ред рдЖрдЗрдП рдЗрд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: 0xB144 + [0xB144 + 8 * 4] = 0xB144 + 0x120 = 0xB264ред рд╣рдо рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ 0xB140 рдкрд░ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╣реИрдВ:



рдЕрдм рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ 0x20 рдХреЗ рд╕рд╛рде рдСрдлрд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреЛрдб рдореЗрдВ рдРрд╕реЗ рдХрдИ рдмрджрд▓рд╛рд╡ рд╣реИрдВред рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЖрдИрдбреАрдП рдореЗрдВ рдХреЛрдб рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИ:

 def put_unconditional_branch(source, destination): offset = (destination - source - 4) >> 1 if offset > 2097151 or offset < -2097152: raise RuntimeError("Invalid offset") if offset > 1023 or offset < -1024: instruction1 = 0xf000 | ((offset >> 11) & 0x7ff) instruction2 = 0xb800 | (offset & 0x7ff) patch_word(source, instruction1) patch_word(source + 2, instruction2) else: instruction = 0xe000 | (offset & 0x7ff) patch_word(source, instruction) ea = here() if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR} ea1 = ea + 2 if get_wide_word(ea1) == 0xbf00: #NOP ea1 += 2 if get_operand_type(ea1, 0) == 1 and get_operand_value(ea1, 0) == 0 and get_operand_type(ea1, 1) == 2: index = get_wide_dword(get_operand_value(ea1, 1)) print "index =", hex(index) ea1 += 2 if get_operand_type(ea1, 0) == 7: table = get_operand_value(ea1, 0) + 4 elif get_operand_type(ea1, 1) == 2: table = get_operand_value(ea1, 1) + 4 else: print "Wrong operand type on", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1) table = None if table is None: print "Unable to find table" else: print "table =", hex(table) offset = get_wide_dword(table + (index << 2)) put_unconditional_branch(ea, table + offset) else: print "Unknown code", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2 else: print "Unable to detect first instruction" 

рд╣рдо рдХрд░реНрд╕рд░ рдХреЛ 0xB26A рд▓рд╛рдЗрди рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ 0xB4B0 рдкрд░ рд╕рдВрдХреНрд░рдордг рджреЗрдЦрддреЗ рд╣реИрдВ:



рдЖрдИрдбреАрдП рдиреЗ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рд╕рд╛рдЗрдЯ рдХреЛ рдПрдХ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирд╛ред рд╣рдо рдЙрд╕рдХреА рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдФрд░ рдирд┐рд░реНрдорд╛рдг рджреЗрдЦрддреЗ рд╣реИрдВ:



рдмреАрдПрд▓рдПрдХреНрд╕ рдХреЗ рдмрд╛рдж рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдмрд╣реБрдд рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдХреА рддрд░рд╣ рд╣реИред рд╣рдо рд╕рдм_4964 рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:



рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдБ рдПрд▓рдЖрд░ рдореЗрдВ рдкрдбрд╝реЗ рдкрддреЗ рдкрд░ рдбреЙрд░реНрдб рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрддреЗ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдкрд░ рдореВрд▓реНрдп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 4 рдХреЛ LR рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реА рдСрдлрд╕реЗрдЯ рдХреЛ рдХреВрдж рд╕рдХреЗрдВред рддрдм POP {R1} рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрддреЗ 0xB4BA + 0xEA = 0xB5A4 рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрддрд╛ рдкреГрд╖реНрда рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:



рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рд╕реЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдСрдлрд╕реЗрдЯ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рдХреЛрдб рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 patches = {} patches[0] = (0x00, 0xbf, 0x01, 0x48, 0x00, 0x68, 0x02, 0xe0) patches[1] = (0x00, 0xbf, 0x01, 0x49, 0x09, 0x68, 0x02, 0xe0) patches[2] = (0x00, 0xbf, 0x01, 0x4a, 0x12, 0x68, 0x02, 0xe0) patches[3] = (0x00, 0xbf, 0x01, 0x4b, 0x1b, 0x68, 0x02, 0xe0) patches[4] = (0x00, 0xbf, 0x01, 0x4c, 0x24, 0x68, 0x02, 0xe0) patches[5] = (0x00, 0xbf, 0x01, 0x4d, 0x2d, 0x68, 0x02, 0xe0) patches[8] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x80, 0xd8, 0xf8, 0x00, 0x80, 0x01, 0xe0) patches[9] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x90, 0xd9, 0xf8, 0x00, 0x90, 0x01, 0xe0) patches[10] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xa0, 0xda, 0xf8, 0x00, 0xa0, 0x01, 0xe0) patches[11] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xb0, 0xdb, 0xf8, 0x00, 0xb0, 0x01, 0xe0) ea = here() if (get_wide_word(ea) == 0xb082 #SUB SP, SP, #8 and get_wide_word(ea + 2) == 0xb503): #PUSH {R0,R1,LR} if get_operand_type(ea + 4, 0) == 7: pop = get_bytes(ea + 12, 4, 0) if pop[1] == '\xbc': register = -1 r = get_wide_byte(ea + 12) for i in range(8): if r == (1 << i): register = i break if register == -1: print "Unable to detect register" else: address = get_wide_dword(ea + 8) + ea + 8 for b in patches[register]: patch_byte(ea, b) ea += 1 if ea % 4 != 0: ea += 2 patch_dword(ea, address) elif pop[:3] == '\x5d\xf8\x04': register = ord(pop[3]) >> 4 if register in patches: address = get_wide_dword(ea + 8) + ea + 8 for b in patches[register]: patch_byte(ea, b) ea += 1 patch_dword(ea, address) else: print "POP instruction not found" else: print "Wrong operand type on +4:", get_operand_type(ea + 4, 0) else: print "Unable to detect first instructions" 

рд╣рдо рдЙрд╕ рдирд┐рд░реНрдорд╛рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд░реНрд╕рд░ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - 0xB4B2 - рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:



рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрддрд╛рдП рдЧрдП рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рднреА рдЗрд╕ рддрд░рд╣ рд╣реИрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, BLX рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж, рдПрдХ рдСрдлрд╕реЗрдЯ рд╣реИ:



рд╣рдо рдПрд▓рдЖрд░ рд╕реЗ рдкрддреЗ рдкрд░ рдСрдлрд╕реЗрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдПрд▓рдЖрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВред 0x72044 + 0xC = 0x72050ред рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

 def put_unconditional_branch(source, destination): offset = (destination - source - 4) >> 1 if offset > 2097151 or offset < -2097152: raise RuntimeError("Invalid offset") if offset > 1023 or offset < -1024: instruction1 = 0xf000 | ((offset >> 11) & 0x7ff) instruction2 = 0xb800 | (offset & 0x7ff) patch_word(source, instruction1) patch_word(source + 2, instruction2) else: instruction = 0xe000 | (offset & 0x7ff) patch_word(source, instruction) ea = here() if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR} ea1 = ea + 6 if get_wide_word(ea + 2) == 0xbf00: #NOP ea1 += 2 offset = get_wide_dword(ea1) put_unconditional_branch(ea, (ea1 + offset) & 0xffffffff) else: print "Unable to detect first instruction" 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:



рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдкреИрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрдИрдбреАрдП рдХреЛ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ HexRays рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕


рд╣рдордиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдпреВрд╕реА рдмреНрд░рд╛рдЙрдЬрд░ рд╕реЗ libsgmainso-6.4.36.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдХреА рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ рдФрд░ JNI_OnLoad рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

 int __fastcall real_JNI_OnLoad(JavaVM *vm) { int result; // r0 jclass clazz; // r0 MAPDST int v4; // r0 JNIEnv *env; // r4 int v6; // [sp-40h] [bp-5Ch] int v7; // [sp+Ch] [bp-10h] v7 = *(_DWORD *)off_8AC00; if ( !vm ) goto LABEL_39; sub_7C4F4(); env = (JNIEnv *)sub_7C5B0(0); if ( !env ) goto LABEL_39; v4 = sub_72CCC(); sub_73634(v4); sub_73E24(&unk_83EA6, &v6, 49); clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6); if ( clazz && (sub_9EE4(), sub_71D68(env), sub_E7DC(env) >= 0 && sub_69D68(env) >= 0 && sub_197B4(env, clazz) >= 0 && sub_E240(env, clazz) >= 0 && sub_B8B0(env, clazz) >= 0 && sub_5F0F4(env, clazz) >= 0 && sub_70640(env, clazz) >= 0 && sub_11F3C(env) >= 0 && sub_21C3C(env, clazz) >= 0 && sub_2148C(env, clazz) >= 0 && sub_210E0(env, clazz) >= 0 && sub_41B58(env, clazz) >= 0 && sub_27920(env, clazz) >= 0 && sub_293E8(env, clazz) >= 0 && sub_208F4(env, clazz) >= 0) ) { result = (sub_B7B0(env, clazz) >> 31) | 0x10004; } else { LABEL_39: result = -1; } return result; } 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  sub_73E24(&unk_83EA6, &v6, 49); clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6); 

рдЙрдк_73E24 рдлрд╝рдВрдХреНрд╢рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдЧ рдирд╛рдо рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред , , . , , . . FindClass , . , тАФ . , , . , sub_73E24.

 int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size) { int v4; // r6 int v7; // r11 int v8; // r9 int v9; // r4 size_t v10; // r5 int v11; // r0 struc_1 v13; // [sp+0h] [bp-30h] int v14; // [sp+1Ch] [bp-14h] int v15; // [sp+20h] [bp-10h] v4 = 0; v15 = *(_DWORD *)off_8AC00; v14 = 0; v7 = sub_7AF78(17); v8 = sub_7AF78(size); if ( !v7 ) { v9 = 0; goto LABEL_12; } (*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16); if ( !v8 ) { LABEL_9: v4 = 0; goto LABEL_10; } v4 = 0; if ( !in ) { LABEL_10: v9 = 0; goto LABEL_11; } v9 = 0; if ( out ) { memset(out, 0, size); v10 = size - 1; (*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10); memset(&v13, 0, 0x14u); v13.field_4 = 3; v13.field_10 = v7; v13.field_14 = v8; v11 = sub_6115C(&v13, &v14); v9 = v11; if ( v11 ) { if ( *(_DWORD *)(v11 + 4) == v10 ) { qmemcpy(out, *(const void **)v11, v10); v4 = *(_DWORD *)(v9 + 4); } else { v4 = 0; } goto LABEL_11; } goto LABEL_9; } LABEL_11: sub_7B148(v7); LABEL_12: if ( v8 ) sub_7B148(v8); if ( v9 ) sub_7B148(v9); return v4; } 

sub_7AF78 ( ). : ┬лDcO/lcK+h?m3c*q@┬╗ ( , ), тАФ . , sub_6115C . 3. , .

 int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2) { int v3; // lr unsigned int v4; // r1 int v5; // r0 int v6; // r1 int result; // r0 int v8; // r0 *a2 = 820000; if ( a1 ) { v3 = a1->field_14; if ( v3 ) { v4 = a1->field_4; if ( v4 < 0x19 ) { switch ( v4 ) { case 0u: v8 = sub_6419C(a1->field_0, a1->field_10, v3); goto LABEL_17; case 3u: v8 = sub_6364C(a1->field_0, a1->field_10, v3); goto LABEL_17; case 0x10u: case 0x11u: case 0x12u: v8 = sub_612F4( a1->field_0, v4, *(_QWORD *)&a1->field_8, *(_QWORD *)&a1->field_8 >> 32, a1->field_10, v3, a2); goto LABEL_17; case 0x14u: v8 = sub_63A28(a1->field_0, v3); goto LABEL_17; case 0x15u: sub_61A60(a1->field_0, v3, a2); return result; case 0x16u: v8 = sub_62440(a1->field_14); goto LABEL_17; case 0x17u: v8 = sub_6226C(a1->field_10, v3); goto LABEL_17; case 0x18u: v8 = sub_63530(a1->field_14); LABEL_17: v6 = 0; if ( v8 ) { *a2 = 0; v6 = v8; } return v6; default: LOWORD(v5) = 28032; goto LABEL_5; } } } } LOWORD(v5) = -27504; LABEL_5: HIWORD(v5) = 13; v6 = 0; *a2 = v5; return v6; } 

switch , 3. case 3: sub_6364C , , . . . sub_6364C , RC4.

. . : com/taobao/wireless/security/adapter/JNICLibrary . рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! .


RegisterNatives , doCommandNative . , JNI_OnLoad, sub_B7B0 :

 int __fastcall sub_B7F6(JNIEnv *env, jclass clazz) { char signature[41]; // [sp+7h] [bp-55h] char name[16]; // [sp+30h] [bp-2Ch] JNINativeMethod method; // [sp+40h] [bp-1Ch] int v8; // [sp+4Ch] [bp-10h] v8 = *(_DWORD *)off_8AC00; decryptString((unsigned __int8 *)&unk_83ED9, (unsigned __int8 *)name, 0x10u);// doCommandNative decryptString((unsigned __int8 *)&unk_83EEA, (unsigned __int8 *)signature, 0x29u);// (I[Ljava/lang/Object;)Ljava/lang/Object; method.name = name; method.signature = signature; method.fnPtr = sub_B69C; return ((int (__fastcall *)(JNIEnv *, jclass, JNINativeMethod *, int))(*env)->RegisterNatives)(env, clazz, &method, 1) >> 31; } 

, doCommandNative . . , .

 int __fastcall doCommandNative(JNIEnv *env, jobject obj, int command, jarray args) { int v5; // r5 struc_2 *a5; // r6 int v9; // r1 int v11; // [sp+Ch] [bp-14h] int v12; // [sp+10h] [bp-10h] v5 = 0; v12 = *(_DWORD *)off_8AC00; v11 = 0; a5 = (struc_2 *)malloc(0x14u); if ( a5 ) { a5->field_0 = 0; a5->field_4 = 0; a5->field_8 = 0; a5->field_C = 0; v9 = command % 10000 / 100; a5->field_0 = command / 10000; a5->field_4 = v9; a5->field_8 = command % 100; a5->field_C = env; a5->field_10 = args; v5 = sub_9D60(command / 10000, v9, command % 100, 1, (int)a5, &v11); } free(a5); if ( !v5 && v11 ) sub_7CF34(env, v11, &byte_83ED7); return v5; } 

, , . 10601.

, : command / 10000 , command % 10000 / 100 command % 10 , . ., , 1, 6 1. , JNIEnv , , . ( N1, N2 N3) .

:



JNI_OnLoad .
. . тАФ . , , , ( , ).


, : 0x5F1AC. : UC Browser .

, Java-,
0x4D070. .

R7 R4 :



R11:



, :



, R4. 230 .

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? IDA, switch: Edit -> Other -> Specify switch idiom.



. , , sub_6115C :



switch, case 3 RC4. , doCommandNative . , magicInt 16. case тАУ , .



AES!

, : , , , ( AES). - sub_6115C , , , .


, Android Studio, , , , , , .

UC Browser ┬л┬╗. , , . :) , , , . . .

:



ARM R0-R3, , тАФ . LR . , , . , , PUSH.W {R0-R10,LR}. R7 , .

fopen /data/local/tmp/aes ┬лab┬╗,
. . . R0 , R1 тАФ . , . , , .



fopen .

aes int . , fwrite .



, , .



, aes .

APK , , /, . , , . , . - , . , UC Browser , , , : onCreate .

  const/16 v1, 0x62 new-array v1, v1, [B fill-array-data v1, :encrypted_data const/16 v0, 0x1f invoke-static {v0, v1}, Lcom/uc/browser/core/d/c/g;->j(I[B)[B move-result-object v1 array-length v2, v1 invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; move-result-object v2 const-string v0, "ololo" invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I 

, , , . NullPointerException, . . null.

, : ┬лMETA-INF/┬╗ ".RSA". , . . , , , . , ┬лMETA-INF/┬╗ ┬лBLABLINF/┬╗, APK .

, , , . рдмрд┐рдВрдЧреЛ! !

MitM


, . CBC.



URL , - MD5, ┬лextract_unzipsize┬╗ . : MD5 , . . , , Intent ┬лPWNED!┬╗. : puds.ucweb.com/upgrade/index.xhtml . MD5 ( ), .

, . , -
. , :



LEB128. , , , .

тАж тАУ ! :) .

https://www.youtube.com/watch?v=Nfns7uH03J8


UC Browser, . , . тАФ , , , .

UC Browser , , - . . , , , . 27
UC Browser 12.10.9.1193, HTTPS: puds.ucweb.com/upgrade/index.xhtml .

, ┬л┬╗ PDF ┬л, - !┬╗. PDF , , Google Play.

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


All Articles