Monday, April 7, 2014

The #1 New Paid App In The Play Store Costs $4, Has Over 10,000 Downloads, A 4.7-Star Rating... And It's A Total Scam

unnamed (1)

Computer security is important, even if the computer in question fits in your hand. There should be no doubt about that fact. However, you should be just as wary of security software as any other app. Case in point: there's a slick new app in the Play Store called Virus Shield. It's got a cool look and it's easy to operate. Just press a single button and your virus shield is activated.

sNYflC7

For a new app, and especially one that costs $3.99, it's doing phenomenally well. Appbrain says it's been available for just over a week, and it's currently the #1 new paid app...

VYQMVqW

gbNd46b

The #3 overall paid app...

EjntIvQ

And it's got an impressive 4.7-star rating after over 10,000 downloads. The app description says that it "Prevents harmful apps from being installed on your device," "scans apps, settings, files, and media in real time," and "protects your personal information. Oh, and it has a low impact on battery life, and has "No, ZERO pesky advertisements!"

2014-04-07 02.03.42 2014-04-07 02.03.50

There's just one problem: it's a complete and total scam. We don't mean in the slightly skeevy way that some anti-virus and general security software overstates dangers and its own necessity. We mean it's literally a fake security app: the only thing that it does is change from an "X" image to a "check" image after a single tap. That's it. That's all there is, there isn't any more.

shield_disabled shield_enabled shield_launcher

Don't believe us? Then check out the code for yourself - we've decompiled the app and mirrored the java code on GitHub, minus a few art assets. We've confirmed that this app is totally and completely devoid of any security benefit, but you don't have to take our word for it - several Google+ users have helped us to confirm its bogus nature. Here's a link to the files (not the app) if you want to check our work.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
package com.deviant.security.shield;
public final class BuildConfig {
public static final String BUILD_TYPE = "debug";
public static final boolean DEBUG;
public static final String FLAVOR = "";
public static final String PACKAGE_NAME = "com.deviant.security.shield";
public static final int VERSION_CODE = 4;
public static final String VERSION_NAME = "2.2";
static {
DEBUG = Boolean.parseBoolean("true");
}
}
view raw BuildConfig.java hosted with ❤ by GitHub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
package com.deviant.security.shield;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import com.deviant.security.shield.utility.NotificationHelper;
public class MainActivity extends ActionBarActivity {
public static final String PREFS_NAME = "ShieldPrefs";
public boolean isEnabled;
private Menu menu;
SharedPreferences settings;
public MainActivity() {
this.isEnabled = false;
}
private void toggleShield() {
ImageView enableButton = (ImageView) findViewById(R.id.enableButton);
boolean isEnabled = this.settings.getBoolean("isEnabled", false);
Editor editor = this.settings.edit();
MenuItem status = this.menu.findItem(R.id.action_status);
if (isEnabled) {
editor.putBoolean("isEnabled", false);
status.setTitle(R.string.action_status_disabled);
enableButton.setImageResource(R.drawable.shield_disabled);
} else {
editor.putBoolean("isEnabled", true);
status.setTitle(R.string.action_status_enabled);
enableButton.setImageResource(R.drawable.shield_enabled);
}
editor.commit();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.settings = getSharedPreferences(PREFS_NAME, 0);
setContentView(R.layout.activity_main);
ImageView enableButton = (ImageView) findViewById(R.id.enableButton);
if (this.settings.getBoolean("isEnabled", false)) {
enableButton.setImageResource(R.drawable.shield_enabled);
} else {
enableButton.setImageResource(R.drawable.shield_disabled);
}
enableButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MainActivity.this.toggleShield();
}
});
new NotificationHelper(getApplicationContext()).createNotification();
}
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
getMenuInflater().inflate(R.menu.main, menu);
boolean isEnabled = this.settings.getBoolean("isEnabled", false);
MenuItem status = menu.findItem(R.id.action_status);
if (isEnabled) {
status.setTitle(R.string.action_status_enabled);
} else {
status.setTitle(R.string.action_status_disabled);
}
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == 2131165246) {
return true;
} else {
if (id == 2131165245) {
toggleShield();
}
return super.onOptionsItemSelected(item);
}
}
}
view raw MainActivity.java hosted with ❤ by GitHub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
package com.deviant.security.shield.utility;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat.Builder;
import com.deviant.security.shield.R;
public class NotificationHelper {
private int NOTIFICATION_ID;
private Builder mBuilder;
private PendingIntent mContentIntent;
private CharSequence mContentTitle;
private Context mContext;
private Notification mNotification;
private NotificationManager mNotificationManager;
public NotificationHelper(Context context) {
this.NOTIFICATION_ID = 1;
this.mContext = context;
}
public void createNotification() {
this.mNotificationManager = (NotificationManager) this.mContext.getSystemService("notification");
this.mBuilder = new Builder(this.mContext);
this.mBuilder.setContentTitle("Scan in progress").setContentText("Scanning for malicious content").setSmallIcon(R.drawable.shield_notification);
this.mBuilder.setContentInfo("0%");
this.mContentIntent = PendingIntent.getActivity(this.mContext, 0, new Intent(), 0);
this.mBuilder.setContentIntent(this.mContentIntent);
new Thread(new Runnable() {
public void run() {
int incr = 0;
while (incr <= 100) {
NotificationHelper.this.mBuilder.setContentInfo(incr + "%");
NotificationHelper.this.mBuilder.setProgress(100, incr, false);
NotificationHelper.this.mNotificationManager.notify(NotificationHelper.this.NOTIFICATION_ID, NotificationHelper.this.mBuilder.build());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
incr++;
}
NotificationHelper.this.mBuilder.setContentTitle("Scan complete");
NotificationHelper.this.mBuilder.setContentText("Your device is secure");
NotificationHelper.this.mBuilder.setProgress(0, 0, false);
NotificationHelper.this.mNotificationManager.notify(NotificationHelper.this.NOTIFICATION_ID, NotificationHelper.this.mBuilder.build());
}
}).start();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
package com.deviant.security.shield;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ToggleButton;
public class Settings extends ActionBarActivity {
public static final String PREFS_NAME = "ShieldPrefs";
SharedPreferences settings;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.settings = getSharedPreferences(PREFS_NAME, 0);
setContentView(R.layout.activity_settings);
ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggle1);
if (this.settings.getBoolean("realtime", false)) {
toggle1.setChecked(true);
} else {
toggle1.setChecked(false);
}
ToggleButton toggle2 = (ToggleButton) findViewById(R.id.toggle2);
if (this.settings.getBoolean("scanning", false)) {
toggle2.setChecked(true);
return;
} else {
toggle2.setChecked(false);
}
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
return item.getItemId() == 2131165250 ? true : super.onOptionsItemSelected(item);
}
public void toggleRealtime(View view) {
Editor editor = this.settings.edit();
ToggleButton toggle = (ToggleButton) findViewById(R.id.toggle1);
if (this.settings.getBoolean("realtime", false)) {
editor.putBoolean("realtime", false);
toggle.setChecked(false);
} else {
editor.putBoolean("realtime", true);
toggle.setChecked(true);
}
editor.commit();
}
public void toggleScanning(View view) {
Editor editor = this.settings.edit();
ToggleButton toggle = (ToggleButton) findViewById(R.id.toggle2);
if (this.settings.getBoolean("scanning", false)) {
editor.putBoolean("scanning", false);
toggle.setChecked(false);
} else {
editor.putBoolean("scanning", true);
toggle.setChecked(true);
}
editor.commit();
}
}
view raw Settings.java hosted with ❤ by GitHub
<pre><code class="language-java java">package com.deviant.security.shield; public final class BuildConfig { public static final String BUILD_TYPE = "debug"; public static final boolean DEBUG; public static final String FLAVOR = ""; public static final String PACKAGE_NAME = "com.deviant.security.shield"; public static final int VERSION_CODE = 4; public static final String VERSION_NAME = "2.2"; static { DEBUG = Boolean.parseBoolean("true"); } }</code></pre><pre><code class="language-java java">package com.deviant.security.shield; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import com.deviant.security.shield.utility.NotificationHelper; public class MainActivity extends ActionBarActivity { public static final String PREFS_NAME = "ShieldPrefs"; public boolean isEnabled; private Menu menu; SharedPreferences settings; public MainActivity() { this.isEnabled = false; } private void toggleShield() { ImageView enableButton = (ImageView) findViewById(R.id.enableButton); boolean isEnabled = this.settings.getBoolean("isEnabled", false); Editor editor = this.settings.edit(); MenuItem status = this.menu.findItem(R.id.action_status); if (isEnabled) { editor.putBoolean("isEnabled", false); status.setTitle(R.string.action_status_disabled); enableButton.setImageResource(R.drawable.shield_disabled); } else { editor.putBoolean("isEnabled", true); status.setTitle(R.string.action_status_enabled); enableButton.setImageResource(R.drawable.shield_enabled); } editor.commit(); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.settings = getSharedPreferences(PREFS_NAME, 0); setContentView(R.layout.activity_main); ImageView enableButton = (ImageView) findViewById(R.id.enableButton); if (this.settings.getBoolean("isEnabled", false)) { enableButton.setImageResource(R.drawable.shield_enabled); } else { enableButton.setImageResource(R.drawable.shield_disabled); } enableButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { MainActivity.this.toggleShield(); } }); new NotificationHelper(getApplicationContext()).createNotification(); } public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; getMenuInflater().inflate(R.menu.main, menu); boolean isEnabled = this.settings.getBoolean("isEnabled", false); MenuItem status = menu.findItem(R.id.action_status); if (isEnabled) { status.setTitle(R.string.action_status_enabled); } else { status.setTitle(R.string.action_status_disabled); } return true; } public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == 2131165246) { return true; } else { if (id == 2131165245) { toggleShield(); } return super.onOptionsItemSelected(item); } } }</code></pre><pre><code class="language-java java">package com.deviant.security.shield.utility; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat.Builder; import com.deviant.security.shield.R; public class NotificationHelper { private int NOTIFICATION_ID; private Builder mBuilder; private PendingIntent mContentIntent; private CharSequence mContentTitle; private Context mContext; private Notification mNotification; private NotificationManager mNotificationManager; public NotificationHelper(Context context) { this.NOTIFICATION_ID = 1; this.mContext = context; } public void createNotification() { this.mNotificationManager = (NotificationManager) this.mContext.getSystemService("notification"); this.mBuilder = new Builder(this.mContext); this.mBuilder.setContentTitle("Scan in progress").setContentText("Scanning for malicious content").setSmallIcon(R.drawable.shield_notification); this.mBuilder.setContentInfo("0%"); this.mContentIntent = PendingIntent.getActivity(this.mContext, 0, new Intent(), 0); this.mBuilder.setContentIntent(this.mContentIntent); new Thread(new Runnable() { public void run() { int incr = 0; while (incr &lt;= 100) { NotificationHelper.this.mBuilder.setContentInfo(incr + "%"); NotificationHelper.this.mBuilder.setProgress(100, incr, false); NotificationHelper.this.mNotificationManager.notify(NotificationHelper.this.NOTIFICATION_ID, NotificationHelper.this.mBuilder.build()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } incr++; } NotificationHelper.this.mBuilder.setContentTitle("Scan complete"); NotificationHelper.this.mBuilder.setContentText("Your device is secure"); NotificationHelper.this.mBuilder.setProgress(0, 0, false); NotificationHelper.this.mNotificationManager.notify(NotificationHelper.this.NOTIFICATION_ID, NotificationHelper.this.mBuilder.build()); } }).start(); } }</code></pre><pre><code class="language-java java">package com.deviant.security.shield; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ToggleButton; public class Settings extends ActionBarActivity { public static final String PREFS_NAME = "ShieldPrefs"; SharedPreferences settings; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.settings = getSharedPreferences(PREFS_NAME, 0); setContentView(R.layout.activity_settings); ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggle1); if (this.settings.getBoolean("realtime", false)) { toggle1.setChecked(true); } else { toggle1.setChecked(false); } ToggleButton toggle2 = (ToggleButton) findViewById(R.id.toggle2); if (this.settings.getBoolean("scanning", false)) { toggle2.setChecked(true); return; } else { toggle2.setChecked(false); } } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.settings, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { return item.getItemId() == 2131165250 ? true : super.onOptionsItemSelected(item); } public void toggleRealtime(View view) { Editor editor = this.settings.edit(); ToggleButton toggle = (ToggleButton) findViewById(R.id.toggle1); if (this.settings.getBoolean("realtime", false)) { editor.putBoolean("realtime", false); toggle.setChecked(false); } else { editor.putBoolean("realtime", true); toggle.setChecked(true); } editor.commit(); } public void toggleScanning(View view) { Editor editor = this.settings.edit(); ToggleButton toggle = (ToggleButton) findViewById(R.id.toggle2); if (this.settings.getBoolean("scanning", false)) { editor.putBoolean("scanning", false); toggle.setChecked(false); } else { editor.putBoolean("scanning", true); toggle.setChecked(true); } editor.commit(); } }</code></pre>

Let's not mince words here. This is fraud, pure and simple, and the developer "Deviant Solutions" potentially made considerable amounts of money based on a complete lie. We assume that a lot of the initial reviews were fake, but now that it's on the top of the charts, at least a few people will be buying it in the belief that it will protect them.

There is no developer website listed on the Play Store, but a quick search of the developer's email, "Jesse_Carter@live.com," reveals very little information. What you can see is a banned account at Sythe.com, where the user "Vibe" is accused of trying to scam people out of various low-value game items. That's about all we could find.

2014-04-07 02.08.02

Unfortunately the wide-open nature of the Play Store means that unscrupulous people can take advantage of it. We usually just post fake apps to the Android Police social accounts and our readers helpfully flag them, but this is such a brazen and expensive fake that we felt the need to give it some special attention. It's somewhat disheartening that an app so obviously fake could rise to the top, especially considering that it's paid, and possibly hundreds or thousands of people have been defrauded already.

What's the solution? We're sorry to say that we don't have one. Any effective way of deterring outright fraudsters like this would go way beyond the basic filtering that Google is doing at the moment, and it would also make the Play Store less "open," if only marginally so. That being said, it's also clear that something needs to be done. Perhaps a more hands-on approach to monitoring apps that rise as rapidly as Virus Shield (which we're almost certain did so with less than genuine downloads and reviews) is called for.

If you'd like to do something proactive, you can report the Virus Shield via the Play Store app. Go to the listing on your device, tap "flag as inappropriate," then tap "other objection" and write out why this guy is a complete jackass. Alternatively, you can report it on the web.

Michael Crider
Michael is a native Texan and a former graphic designer. He's been covering technology in general and Android in particular since 2011. His interests include folk music, football, science fiction, and salsa verde, in no particular order.


source: androidpolice

0 comments :