SnakeOil.apk, aka the N8 State app and why Google needs to screen their apps more.

UPDATE: As of April 13, 2021, the app has now been delisted by Google from the Play Store. We believe this may be due to their crackdowns on COVID-19-related misinformation as well as those related to conspiracist/right-winger nonsense as the N8 State website is still up. Whether this blog post may have convinced them or not is anyone's guess.

Even in this day and age, charlatans and devious snake oil salesmen, stereotypical examples of which were popularly depicted in Westerns and similar media, still run rampant. From homeopaths to conspiracy theorists profiteering from the fears and paranoia people have developed over the past few decades no thanks to 24-hour news networks and pervasive social media, these scoundrels have plundered and exploited the gullible and less-knowledgeable amongst us either for a quick buck or to incite misinformation and discord, sadly enough.

Smartphone application marketplaces, or popularly known as app stores, are unfortunately not safe from such trash either. There was this one app which could either make you cringe, laugh or be scornful in disgust, whichever sentiment it is that you feel like expressing upon encountering it. May I introduce to you N8 State.

According to the developer it protects the user's DNA from cellphone radiation by just the press of a button:

"N8 State is the ONLY app/technology to protect mobile phone users DNA from the harmful effects of Low-grade Electromagnetic Radiation also called RFR (Radio Frequency Radiation) or Non-ionizing Radiation. While other apps can only warn you of low-grade radiation levels and exposure times, N8’s app protects you from low-grade electromagnetic radiation at your body’s cellular level.

When installed on your mobile device, the N8 State app uses patented "Structured Photon Technology"(tm) turning your mobile devise into a preventative tool to deflect harmful wave interactions with your body’s cells from low-grade electromagnetic radiation while protecting and improving your DNA.

N8 works by re-ordering photons within its range, returning surrounding energy fields to their natural frequencies. Quantum science tell us that all chemical reactions involve a wave interaction, and the electrons and sub-atomic particles that revolve around the nucleus of an atom emit waves, so if we change the waves we can block the harmful chemical reaction, thereby, helping cells maintain their properties and oxygen intake (as compared to having potentially diminished cellular properties and oxygen intake after cells are zapped by EMR)."


Spoiler alert: none of these claims are true. I know and I am not surprised if any of you tinfoil heads somehow insist on its efficacy, but whatever conspiracist fantasies you have is bunk when the app I am exposing is nothing more than a dolled-up sugar pill. I am by no means an expert in Java, programming in general or the effects of electromagnetic radiation for that matter, but it's fortunate as to how easy it is to decompile a typical Android app and study whatever makes it tick. A friend of mine, whose name I won't disclose per his request, volunteered to rip the APK and decompile the contents of this app and explain how it actually works.

Most of the java code in the app is more or less mundane - after all, the app's reverse DNS identifier is com.n8zone.pushnotifications2 which basically states what it does in a nutshell: spit out notifications and "news" about the requisite quackery, essentially a news reader and nothing else. What we're interested in is the app's "DNA protection" abilities-or lack thereof.

StartActivity presents a tab view linking to various functions such as the aforementioned "news", studies and blog views. Again those aren't interesting unless you'd like to have a quick laugh at all the fallacies, so we'll focus on the StateFragment tab as it's the main attraction.

this.tab1.setText(R.string.txtState);
this.tab1.setIcon(R.drawable.ic_state);
this.tabsAdapter.addTab(this.tab1, StateFragment.class, null);
this.tab2 = this.bar.newTab().setCustomView(R.layout.tab);

As it turns out, all StateFragment does is render a button, which is done by the usual UI stuff any developer would do on Android, listen to its state, then do something about it. Clicking on the Protection button starts an overlay service, and displays an image telling its user that he/she is now "protected", or so it seems...


package com.n8zone.fragments;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
import com.n8zone.activities.StartActivity;
import com.n8zone.pushnotifications2.R;
import com.n8zone.utils.Constants;
import com.n8zone.utils.OverlayService;

public class StateFragment extends SherlockFragment {
    private boolean buttonEnabled;
    Intent overlayIntent;
    int savedState;
    ImageButton stateButton;
    ImageView stateLayout;
    TextView stateText;
    View view;

    @Override // android.support.v4.app.Fragment
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        this.buttonEnabled = true;
        this.view = inflater.inflate(R.layout.state_fragment, container, false);
        this.overlayIntent = new Intent(getActivity(), OverlayService.class);
        this.savedState = ((StartActivity) getActivity()).getApp().getPreference(Constants.PERSIST_STATE_NAME, 0);
        if (this.savedState == 1 && !((StartActivity) getActivity()).isOverlayServiceRunning()) {
            setProtection();
        }
        FragmentManager fragmentManager = getFragmentManager();
        for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {
            fragmentManager.popBackStack();
        }
        Fragment detailsF = fragmentManager.findFragmentByTag("DetailsF");
        if (detailsF != null) {
            FragmentTransaction fragmentTransaction2 = fragmentManager.beginTransaction();
            fragmentTransaction2.hide(detailsF);
            fragmentTransaction2.commit();
        }
        this.stateButton = (ImageButton) this.view.findViewById(R.id.stateButton);
        this.stateLayout = (ImageView) this.view.findViewById(R.id.stateImage);
        this.stateText = (TextView) this.view.findViewById(R.id.stateText);
        if (this.savedState == 0) {
            this.stateText.setText(getResources().getString(R.string.stateDisabled));
            this.stateText.setTextColor(getResources().getColor(R.color.disabledColor));
            this.stateLayout.setImageResource(R.drawable.img_damaged);
            this.stateButton.setSelected(false);
        } else {
            this.stateText.setText(getResources().getString(R.string.stateProtected));
            this.stateText.setTextColor(getResources().getColor(R.color.protectedColor));
            this.stateLayout.setImageResource(R.drawable.img_protected);
            this.stateButton.setSelected(true);
        }
        this.stateButton.setOnClickListener(new View.OnClickListener() {
            /* class com.n8zone.fragments.StateFragment.AnonymousClass1 */

            public void onClick(View button) {
                if (StateFragment.this.buttonEnabled) {
                    StateFragment.this.buttonEnabled = false;
                    /* set the button and state as red */
                    if (button.isSelected()) {
                        button.setSelected(false);
                        StateFragment.this.stateText.setTextColor(StateFragment.this.getResources().getColor(R.color.disabledColor));
                        StateFragment.this.stateText.setText(StateFragment.this.getResources().getString(R.string.stateDisabled));
                        ((StartActivity) StateFragment.this.getActivity()).getApp().setPreference(Constants.PERSIST_STATE_NAME, 0);
                        StateFragment.this.disableProtection();
                        StateFragment.this.buttonEnabled = true;
                        StateFragment.this.fadeOut();
                        return;
                    }
                    /* enable setProtection and display button as green */
                    button.setSelected(true);
                    StateFragment.this.stateText.setTextColor(StateFragment.this.getResources().getColor(R.color.protectedColor));
                    StateFragment.this.stateText.setText(StateFragment.this.getResources().getString(R.string.stateProtected));
                    ((StartActivity) StateFragment.this.getActivity()).getApp().setPreference(Constants.PERSIST_STATE_NAME, 1);
                    new Handler().postDelayed(new Runnable() {
                        /* class com.n8zone.fragments.StateFragment.AnonymousClass1.AnonymousClass1 */

                        public void run() {
                            StateFragment.this.setProtection();
                            StateFragment.this.buttonEnabled = true;
                        }
                    }, 600);
                    StateFragment.this.fadeOut();
                }
            }
        });
        return this.view;
    }
/* start the overlay service which renders a blank image */
    public void setProtection() {
        getActivity().startService(this.overlayIntent);
    }

    public void disableProtection() {
        getActivity().stopService(this.overlayIntent);
    }

    @Override // android.support.v4.app.Fragment
    public void onDestroy() {
        super.onDestroy();
    }

    public void fadeIn() {
        ((LinearLayout) this.view.findViewById(R.id.state_layout_image)).startAnimation(AnimationUtils.loadAnimation(getActivity(), R.layout.animation_fade_in));
    }

    public void fadeOut() {
        Animation myFadeInAnimation = AnimationUtils.loadAnimation(getActivity(), R.layout.animation_fade_out);
        ((LinearLayout) this.view.findViewById(R.id.state_layout_image)).startAnimation(myFadeInAnimation);
        myFadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
            /* class com.n8zone.fragments.StateFragment.AnonymousClass2 */

            public void onAnimationStart(Animation animation) {
            }

            public void onAnimationRepeat(Animation animation) {
            }

            public void onAnimationEnd(Animation animation) {
                if (StateFragment.this.stateButton.isSelected()) {
                    StateFragment.this.stateLayout.setImageResource(R.drawable.img_protected);
                } else {
                    StateFragment.this.stateLayout.setImageResource(R.drawable.img_damaged);
                }
                StateFragment.this.fadeIn();
            }
        });
    }
}


Now this is where all the fun happens: once OverlayService is started, all it does is to render a blank PNG file pulled from the app's /res folder, and somehow select a suitable image depending on the device's screen size or orientation. That's it. None of that "Structured Photon Technology" technobabble or all that. Anyone with a cursory knowledge about mobile hardware and programming can tell how bullshit N8's claims are; I'd somewhat believe them if it required a separate hardware to be plugged on the USB OTG port, but even that can be done fraudulently anyway. To quote TV Tropes: "While certain types of electromagnetic radiation can harm DNA, the type that most people are exposed on a regular basis is non-ionizing, which doesn't alter DNA (some things that produce this type of radiation include hair dryers, microwaves, televisions, electric blankets, and wifi). Additionally, while certain phones can lower the amount of electromagnetic radiation they produce, it's impossible for an app to significantly alter the amount of IMF radiation produced and cannot protect the user from it." Unfortunately the emergence of the COVID-19 pandemic, which has arguably brought fear and suffering amongst the general populace, has led to quack "cures" such as this especially when the 5G standard got scapegoated for allegedly causing the spread of the virus, case in point the glowing review on Google Play from some nutcase who mentioned the 5G conspiracy theory as to why she bought, er, fell for the app.

package com.n8zone.utils;

import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import com.n8zone.pushnotifications2.R;

public class OverlayService extends Service {
    View overlay;

    public void onCreate() {
        super.onCreate();
        WindowManager windowManager = (WindowManager) getSystemService("window");
        this.overlay = ((LayoutInflater) getSystemService("layout_inflater")).inflate(R.layout.overlay_total, (ViewGroup) null);
        windowManager.addView(this.overlay, new WindowManager.LayoutParams(-1, -1, 2003, 24, -3));
        setImage(windowManager);
    }

    private void setImage(WindowManager windowManager) {
        String image;
        new Point();
        boolean landscape = false;
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        Point screenSize = new Point(metrics.widthPixels, metrics.heightPixels);
        if (screenSize.y < screenSize.x) {
            int t = screenSize.x;
            screenSize.x = screenSize.y;
            screenSize.y = t;
            landscape = true;
        }
        /* Select image depending on orientation or aspect ratio? */
        double aspectRatio = ((double) screenSize.y) / ((double) screenSize.x);
        if (aspectRatio <= 1.55d) {
            image = "planar_150";
        } else if (aspectRatio <= 1.633d) {
            image = "planar_160";
        } else if (aspectRatio <= 1.722d) {
            image = "planar_166";
        } else {
            image = "planar_177";
        }
        if (landscape) {
            image = String.valueOf(image) + "_land";
        }
        Log.d("IMAGE", "Displaying image " + image);
        ((ImageView) this.overlay.findViewById(R.id.img_planar)).setImageResource(getResources().getIdentifier(image, "drawable", getPackageName()));
    }

    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onDestroy() {
        super.onDestroy();
        if (this.overlay != null) {
            ((WindowManager) getSystemService("window")).removeView(this.overlay);
            this.overlay = null;
        }
    }

    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("OverlayService", "Service configuration change");
        setImage((WindowManager) getSystemService("window"));
    }
}

I am writing this in disgust as the somewhat anarchic nature of the Google Play Store has led to deceitful apps such as this N8 State thing. It's a double-standard, really, like they took down the InfoWars app for spreading fake news about the pandemic yet this piece of nonsense that is N8 State is still available. Heck, their website is a charlatan goldmine, even promoting products which may remind you of that infamous Power Balance wristband such as derma-patches and ionised water. There's even a Windows app which redirects to their store page, with no trials or any of that to let the user try it out before forking over the money. The latter screams of a red flag if it's any indication.

So who is behind all of this? A VirusTotal scan of the APK hints at Mobiversal, a Romania-based mobile app developer co-founded by a certain Cristian Streng. Though in fairness the N8 State app isn't mentioned in their website or portfolio at all, and it isn't certain as to what Mobiversal's involvement is, e.g. whether they did this as a secretive side project to greedily profit from gullible users or some other party commissioned them to do this and they (begrudgingly) complied. I am not saying that I'm going to blindingly bash and troll the daylights out of the company; I'm just asking them for a clear answer as to why they are involved in this act of deception.

To those interested, here's a link to the decompiled app sources for everyone to peruse and study in case you're still not convinced: https://www.strawberryforum.org/techknow/dec.zip

Comments

Popular posts from this blog

And I came in for another LeapFrog Epic post.

LeapFrog Epic part 1: The hidden Lock Screen.

Macintosh in a pinch: Sierra on a Pentium G3258/ASUS H81M-D