Antidebugging w aplikacjach Android

Dzisiaj analizowałem sobie jedną starszą aplikację i natknąłem się na ciekawy kod, sprawdzający kilka rzeczy, których autorzy sobie nie życzą (to nie jest koncert życzeń), marnie zakamuflowanych pod fałszywymi nazwami 😀

Sprawdzane są m.in.

  • Czy urządzenie było zrootowanie i czy dostępne są narzędzia takie jak np. komenda su.
  • Czy podpięty jest debugger
  • Czy zainstalowane są ehem wrogie aplikacje

Kod mówi więcej niż słowa, dlatego spójrzcie sami, może komuś ta wiedza się kiedyś przyda, z zastrzeżeniem, że to starsza aplikacja i kilka rzeczy mogło się już zmienić.

using System;
using System.Collections.Generic;
using System.IO;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Xamarin.Forms;

namespace Abc
{
	// Token: 0x02000010 RID: 16
	public class CalendarService : ICalendarService
	{
		// Token: 0x06000044 RID: 68 RVA: 0x000080A5 File Offset: 0x000062A5
		public bool IsDateCorrect()
		{
			return this.IsDayCorrect() || this.IsProperUtcFormat() || this.IsMonthCorrect() || this.IsCurrentMonth() || this.IsItReallyCurrentYearAlready();
		}

		// Token: 0x06000045 RID: 69 RVA: 0x000080D0 File Offset: 0x000062D0
		public bool IsDayCorrect()
		{
			using (List<string>.Enumerator enumerator = new List<string>
			{
				"/system/app/Superuser.apk",
				"/sbin/su",
				"/system/bin/su",
				"/system/xbin/su",
				"/data/local/xbin/su",
				"/data/local/bin/su",
				"/system/sd/xbin/su",
				"/system/bin/failsafe/su",
				"/data/local/su",
				"/su/bin/su"
			}.GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					if (File.Exists(enumerator.Current))
					{
						return true;
					}
				}
			}
			string[] array = System.Environment.GetEnvironmentVariable("PATH").Split(':', StringSplitOptions.None);
			for (int i = 0; i < array.Length; i++)
			{
				if (File.Exists(Path.Combine(array[i], "su")))
				{
					return true;
				}
			}
			foreach (ActivityManager.RunningAppProcessInfo runningAppProcessInfo in ActivityManager.FromContext(Forms.Context).RunningAppProcesses)
			{
				if (runningAppProcessInfo.ProcessName.Contains("supersu") || runningAppProcessInfo.ProcessName.Contains("superuser"))
				{
					return true;
				}
			}
			return false;
		}

		// Token: 0x06000046 RID: 70 RVA: 0x00008240 File Offset: 0x00006440
		public bool IsProperUtcFormat()
		{
			return Build.Tags.Contains("test-keys");
		}

		// Token: 0x06000047 RID: 71 RVA: 0x00008251 File Offset: 0x00006451
		public bool IsMonthCorrect()
		{
			return (Forms.Context.ApplicationContext.ApplicationInfo.Flags & ApplicationInfoFlags.Debuggable) > ApplicationInfoFlags.None;
		}

		// Token: 0x06000048 RID: 72 RVA: 0x0000826C File Offset: 0x0000646C
		public bool IsCurrentMonth()
		{
			return Debug.IsDebuggerConnected;
		}

		// Token: 0x06000049 RID: 73 RVA: 0x00008274 File Offset: 0x00006474
		public bool IsItReallyCurrentYearAlready()
		{
			foreach (ApplicationInfo applicationInfo in Forms.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MetaData))
			{
				string packageName = applicationInfo.PackageName;
				if (packageName == "de.robv.android.xposed.installer" || packageName == "com.saurik.substrate" || packageName == "com.android.vending.billing.InAppBillingService.LUCK" || packageName == "com.android.vending.billing.InAppBillingService.CLON" || packageName == "com.android.vending.billing.InAppBillingService.COIN")
				{
					return true;
				}
			}
			return false;
		}
	}
}

Magazyn Programista 5/2014

Ukazało się nowe wydanie magazynu Programista 5/2014

Programista 5/2014

Spis treści:

  • Macierze w grafice 3D
  • Wzorce Programowania Gier:Zarządca Zawartości
  • Zwizualizuj to sam. Obsługa wyświetlaczy na Raspberry Pi
  • Jak napisać własny debugger w systemie Windows – część 4
  • Wprowadzenie do testowania w Robot Framework (Robot)
  • Profilowanie aplikacji w języku Python
  • Wzorce silników zdarzeń w C++
  • Brakujący element Agile
  • ASIS CTF Quals 2014 – Random Image
  • Jak całkowicie odmienić sposób programowania, używając refaktoryzacji
  • TDD. Sztuka tworzenia dobrego kodu

Zachęcam do czytania!

Magazyn Programista 02/2014 (21)

Wyszedł nowy numer magazynu Programista 02/2014 (21).

magazyn-programista-02-2014

Spis treści:

  • Interface a implementacja
  • Wstęp do WPF – część 2: Stylowanie kontrolek w WPF
  • ASP.NET SignalR – czyli aplikacje czasu bardzo rzeczywistego. Część 2
  • Java 8 – najbardziej rewolucyjna wersja w historii
  • Początki z językiem Fortran
  • Concepts Lite. Rozszerzenie standardu C++14
  • Jak napisać własny debugger w systemie Windows – część 1
  • Badanie jakości kodu C++
  • Refaktoryzacja testów legacy w kierunku wykonywalnych specyfikacji. Część II: Techniki ułatwiające utrzymanie testów
  • Brakujący element Agile Część 1: Feedback
  • Szczyt za szczytem
  • Ghost in the Shellcode 2014 – Pwn Adventure 2
  • Jak całkowicie odmienić sposób programowania, używając refaktoryzacji (część 6)

Visual DuxDebugger

Visual DuxDebugger to nowy debugger (darmowy) przeznaczony dla środowiska 64-bitowego, obsługujący ciekawe funkcje, jak debugowanie wielu procesów na raz oraz procesów „dzieci”.

Najciekawszą funkcją jest jednak obsługa tzw. „detours”, dzięki niej można do debugowanego procesu załadować wybraną i przygotowaną wcześniej bibliotekę i przekierować do niej wybrane funkcje z oryginalnych bibliotek (dzięki czemu można przechwycić wywoływane parametry lub zmienić ich wartość).

Poniżej seria filmików (niestety bez dźwięku) prezentująca możliwości nowego debuggera.

Basic (Create – Attach – Detach – Terminate)

Breakpoints (SW Breakpoints – HW Breakpoints – Wnd Frame Information)

Detours

Download — www.duxcore.com/fs_files/VisualDuxDbgSetup.zip

IDA Pro v5.4

IDA ProUkazała się wersja 5.4 disassemblera IDA Pro, chociaż disassemblerem tego już raczej nie można nazwać, bo to prawdziwy kombajn do analizy wszystkiego co binarne.

Główne zmiany to wprowadzenie modułów obsługi 3 dodatkowych debuggerów, zwiększających możliwość dynamicznej analizy kodu.

Pierwszy z nich opiera się na emualtorze x86 Bochs, który pozwala m.in. na wykonanie dowolnych fragmentów kodu 32 bitowego w emulowanym środowisku (chyba ukłon w stronę branży antywirusowej).

Kolejny debugger to GDBServer, ale chyba największą niespodzianką jest wprowadzenie obsługi debuggera WinDbg, dzięki czemu możliwe jest analizowanie sterowników systemowych.

Oficjalna lista zmian, a jest ich naprawdę sporo na:
https://www.hex-rays.com/idapro/54/index.htm