Harvesting Runtime Values in Android Applications That Feature - - PowerPoint PPT Presentation

harvesting runtime values in android applications that
SMART_READER_LITE
LIVE PREVIEW

Harvesting Runtime Values in Android Applications That Feature - - PowerPoint PPT Presentation

Harvesting Runtime Values in Android Applications That Feature Anti-Analysis Techniques Siegfried Rasthofer, Steven Arzt, Marc Miltenberger, Eric Bodden SECURE SOFTWARE ENGINEERING GROUP 2 This we would still hope for @Override


slide-1
SLIDE 1

SOFTWARE ENGINEERING

GROUP

SECURE

Harvesting Runtime Values in Android Applications That Feature Anti-Analysis Techniques

Siegfried Rasthofer, Steven Arzt, Marc Miltenberger, Eric Bodden

slide-2
SLIDE 2

2

slide-3
SLIDE 3

3 @Override protected void onCreate(Bundle paramBundle) { SmsManager manager = SmsManager.getDefault(); manager.sendTextMessage("3353", null, "798657", null, null); }

This we would still hope for…

FakePlayer 2010

slide-4
SLIDE 4

But this is what we get…

4

public static void gdadbjrj(String paramString1, String paramString2) throws Exception{ // Get class instance Class clz = Class.forName( gdadbjrj.gdadbjrj("VRIf3+In9a.aTA3RYnD1BcVRV]af") ); Object localObject = clz.getMethod( gdadbjrj.gdadbjrj("]a9maFVM.9")).invoke(null); // Get method name String s = gdadbjrj.gdadbjrj(“BaRIta*9caBBV]a"); // Build parameter list Class c = Class.forName( gdadbjrj.gdadbjrj("VRIf3+InVTTnSaRI+R]KR9aR9")); Class[] arr = new Class[] { nglpsq.cbhgc, nglpsq.cbhgc, nglpsq.cbhgc, c, c }; // Get method and invoke it clz.getMethod(s, arr).invoke(localObject, paramString1, null, paramString2, null, null); }

SmsManager.sendTextMessage(...)

slide-5
SLIDE 5

Contributions

5

C1: Fully-Automatic Extraction of Runtime Data C2: Fully-Automatic Resolving of Reflective Method Calls C3: Improving the Coverage of Existing off-the-shelf Static and Dynamic Analysis Tools 
 C2: Fully-Automatic Resolving of Reflective Method Calls

slide-6
SLIDE 6

6

Harvester

sendTextMessage(num, text) Class.forName(className) sendTextMessage(“004242“, “loc_Other“) sendTextMessage(“008888“, “loc_US“) Class.forName(“SmsManager“)

slide-7
SLIDE 7

nr ¡+= ¡"4242"

7

if(Build.FINGERPRINT.startsWith("generic")) msg ¡= ¡AES.decrypt("1234","fri$ds\&S") nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ...

Static Analysis? Dynamic Analysis?

slide-8
SLIDE 8

Static Analysis + Dynamic Analysis

8

slide-9
SLIDE 9

9

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-10
SLIDE 10

10

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-11
SLIDE 11

11

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-12
SLIDE 12

12

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment

x

msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-13
SLIDE 13

x

13

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" if(simCountryIso().equals("US")) nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-14
SLIDE 14

if(simCountryIso().equals("US"))

x

14

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-15
SLIDE 15

x

15

if(Build.FINGERPRINT.startsWith("generic")) nr ¡= ¡"00" nr ¡+= ¡"4242" nr ¡+= ¡"8888" sendTextMessage(nr, ¡msg) ... Environment if(EXECUTOR_1) msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-16
SLIDE 16

16

nr ¡= ¡"00" nr ¡+= ¡"4242" nr ¡+= ¡"8888" Log(nr, ¡msg) if(EXECUTOR_1) sendTextMessage(nr, ¡msg) main() ¡{ ¡ ¡ ¡Callee1(false); ¡ ¡ ¡Callee1(true); ¡ } Callee1(boolean ¡EXECUTOR_1) ¡{

}

msg ¡= ¡AES.decrypt("1234","fri$ds\&S")

slide-17
SLIDE 17

Harvester++

17

Class c = Class.forName(gdadbjrj.gdadbjrj(„VRIf3+InVTTnSaRI+R]KR9aR9“)); ... Class c = Class.forName("SmsManager"); ... SmsManager.sendTextMessage(a, b, c, d, e); SmsManager ...

slide-18
SLIDE 18

18

Efficiency: Interesting findings: Recall: Precision:

16,799 Malware Samples

  • Premium-rate numbers
  • C&C messages
  • URLs (URIs)
  • Encryption key for WhatsApp data
  • Backend-as-a-Service: 56 Million Sensitive User Data

< 3 minutes 87% 100%

slide-19
SLIDE 19

19

slide-20
SLIDE 20

Siegfried Rasthofer TU Darmstadt/Fraunhofer SIT Email: siegfried.rasthofer@cased.de Blog: http://blogs.uni-paderborn.de/sse/ Twitter: @CodeInspect

20