Added uid to SNI names

This commit is contained in:
M66B 2023-09-20 08:46:43 +02:00
parent ddb5ce73fa
commit 0ebecc2a0c
8 changed files with 34 additions and 8 deletions

View File

@ -42,6 +42,7 @@ public class AdapterDns extends CursorAdapter {
private int colAName; private int colAName;
private int colResource; private int colResource;
private int colTTL; private int colTTL;
private int colUid;
public AdapterDns(Context context, Cursor cursor) { public AdapterDns(Context context, Cursor cursor) {
super(context, cursor, 0); super(context, cursor, 0);
@ -58,6 +59,7 @@ public class AdapterDns extends CursorAdapter {
colAName = cursor.getColumnIndex("aname"); colAName = cursor.getColumnIndex("aname");
colResource = cursor.getColumnIndex("resource"); colResource = cursor.getColumnIndex("resource");
colTTL = cursor.getColumnIndex("ttl"); colTTL = cursor.getColumnIndex("ttl");
colUid = cursor.getColumnIndex("uid");
} }
@Override @Override
@ -73,6 +75,7 @@ public class AdapterDns extends CursorAdapter {
String aname = cursor.getString(colAName); String aname = cursor.getString(colAName);
String resource = cursor.getString(colResource); String resource = cursor.getString(colResource);
int ttl = cursor.getInt(colTTL); int ttl = cursor.getInt(colTTL);
int uid = cursor.getInt(colUid);
long now = new Date().getTime(); long now = new Date().getTime();
boolean expired = (time + ttl < now); boolean expired = (time + ttl < now);
@ -84,6 +87,7 @@ public class AdapterDns extends CursorAdapter {
TextView tvAName = view.findViewById(R.id.tvAName); TextView tvAName = view.findViewById(R.id.tvAName);
TextView tvResource = view.findViewById(R.id.tvResource); TextView tvResource = view.findViewById(R.id.tvResource);
TextView tvTTL = view.findViewById(R.id.tvTTL); TextView tvTTL = view.findViewById(R.id.tvTTL);
TextView tvUid = view.findViewById(R.id.tvUid);
// Set values // Set values
tvTime.setText(new SimpleDateFormat("dd HH:mm").format(time)); tvTime.setText(new SimpleDateFormat("dd HH:mm").format(time));
@ -91,5 +95,6 @@ public class AdapterDns extends CursorAdapter {
tvAName.setText(aname); tvAName.setText(aname);
tvResource.setText(resource); tvResource.setText(resource);
tvTTL.setText("+" + Integer.toString(ttl / 1000)); tvTTL.setText("+" + Integer.toString(ttl / 1000));
tvUid.setText(uid > 0 ? Integer.toString(uid) : null);
} }
} }

View File

@ -46,7 +46,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "NetGuard.Database"; private static final String TAG = "NetGuard.Database";
private static final String DB_NAME = "Netguard"; private static final String DB_NAME = "Netguard";
private static final int DB_VERSION = 21; private static final int DB_VERSION = 22;
private static boolean once = true; private static boolean once = true;
private static List<LogChangedListener> logChangedListeners = new ArrayList<>(); private static List<LogChangedListener> logChangedListeners = new ArrayList<>();
@ -190,6 +190,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
", aname TEXT NOT NULL" + ", aname TEXT NOT NULL" +
", resource TEXT NOT NULL" + ", resource TEXT NOT NULL" +
", ttl INTEGER" + ", ttl INTEGER" +
", uid INTEGER" +
");"); ");");
db.execSQL("CREATE UNIQUE INDEX idx_dns ON dns(qname, aname, resource)"); db.execSQL("CREATE UNIQUE INDEX idx_dns ON dns(qname, aname, resource)");
db.execSQL("CREATE INDEX idx_dns_resource ON dns(resource)"); db.execSQL("CREATE INDEX idx_dns_resource ON dns(resource)");
@ -349,6 +350,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {
oldVersion = 21; oldVersion = 21;
} }
if (oldVersion < 22) {
if (!columnExists(db, "dns", "uid"))
db.execSQL("ALTER TABLE dns ADD COLUMN uid INTEGER");
oldVersion = 22;
}
if (oldVersion == DB_VERSION) { if (oldVersion == DB_VERSION) {
db.setVersion(oldVersion); db.setVersion(oldVersion);
db.setTransactionSuccessful(); db.setTransactionSuccessful();
@ -828,6 +835,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
cv.put("qname", rr.QName); cv.put("qname", rr.QName);
cv.put("aname", rr.AName); cv.put("aname", rr.AName);
cv.put("resource", rr.Resource); cv.put("resource", rr.Resource);
cv.put("uid", rr.uid);
if (db.insert("dns", null, cv) == -1) if (db.insert("dns", null, cv) == -1)
Log.e(TAG, "Insert dns failed"); Log.e(TAG, "Insert dns failed");
@ -892,7 +900,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
String query = "SELECT d.qname"; String query = "SELECT d.qname";
query += " FROM dns AS d"; query += " FROM dns AS d";
query += " WHERE d.resource = '" + ip.replace("'", "''") + "'"; query += " WHERE d.resource = '" + ip.replace("'", "''") + "'";
query += " ORDER BY d.qname"; query += " ORDER BY (d.uid = " + uid + ") DESC, d.qname";
query += " LIMIT 1"; query += " LIMIT 1";
// There is no way to known for sure which domain name an app used, so just pick the first one // There is no way to known for sure which domain name an app used, so just pick the first one
return db.compileStatement(query).simpleQueryForString(); return db.compileStatement(query).simpleQueryForString();

View File

@ -29,6 +29,7 @@ public class ResourceRecord {
public String AName; public String AName;
public String Resource; public String Resource;
public int TTL; public int TTL;
public int uid;
private static DateFormat formatter = SimpleDateFormat.getDateTimeInstance(); private static DateFormat formatter = SimpleDateFormat.getDateTimeInstance();
@ -42,6 +43,7 @@ public class ResourceRecord {
" A " + AName + " A " + AName +
" R " + Resource + " R " + Resource +
" TTL " + TTL + " TTL " + TTL +
" uid " + uid +
" " + formatter.format(new Date(Time + TTL * 1000L).getTime()); " " + formatter.format(new Date(Time + TTL * 1000L).getTime());
} }
} }

View File

@ -148,7 +148,7 @@ void parse_dns_response(const struct arguments *args, const struct ng_session *s
return; return;
} }
dns_resolved(args, qname, name, rd, ttl); dns_resolved(args, qname, name, rd, ttl, -1);
log_android(ANDROID_LOG_DEBUG, log_android(ANDROID_LOG_DEBUG,
"DNS answer %d qname %s qtype %d ttl %d data %s", "DNS answer %d qname %s qtype %d ttl %d data %s",
a, name, qtype, ttl, rd); a, name, qtype, ttl, rd);

View File

@ -281,6 +281,8 @@ void handle_ip(const struct arguments *args,
} }
} }
jint uid = -1;
// Get server name // Get server name
char server_name[TLS_SNI_LENGTH + 1]; char server_name[TLS_SNI_LENGTH + 1];
*server_name = 0; *server_name = 0;
@ -292,7 +294,8 @@ void handle_ip(const struct arguments *args,
if (get_sni(data, datalen, server_name)) { if (get_sni(data, datalen, server_name)) {
log_android(ANDROID_LOG_INFO, "TLS server name: %s", server_name); log_android(ANDROID_LOG_INFO, "TLS server name: %s", server_name);
dns_resolved(args, server_name, server_name, dest, -1); uid = get_uid(version, protocol, saddr, sport, daddr, dport);
dns_resolved(args, server_name, server_name, dest, -1, uid);
} }
} }
@ -300,10 +303,9 @@ void handle_ip(const struct arguments *args,
strcpy(data, "sni"); strcpy(data, "sni");
// Get uid // Get uid
jint uid = -1;
if (protocol == IPPROTO_ICMP || protocol == IPPROTO_ICMPV6 || if (protocol == IPPROTO_ICMP || protocol == IPPROTO_ICMPV6 ||
(protocol == IPPROTO_UDP && !has_udp_session(args, pkt, payload)) || (protocol == IPPROTO_UDP && !has_udp_session(args, pkt, payload)) ||
(protocol == IPPROTO_TCP && (syn || *server_name != 0))) { (protocol == IPPROTO_TCP && syn)) {
if (args->ctx->sdk <= 28) // Android 9 Pie if (args->ctx->sdk <= 28) // Android 9 Pie
uid = get_uid(version, protocol, saddr, sport, daddr, dport); uid = get_uid(version, protocol, saddr, sport, daddr, dport);
else else

View File

@ -580,9 +580,10 @@ jfieldID fidQName = NULL;
jfieldID fidAName = NULL; jfieldID fidAName = NULL;
jfieldID fidResource = NULL; jfieldID fidResource = NULL;
jfieldID fidTTL = NULL; jfieldID fidTTL = NULL;
jfieldID fidDnsUid = NULL;
void dns_resolved(const struct arguments *args, void dns_resolved(const struct arguments *args,
const char *qname, const char *aname, const char *resource, int ttl) { const char *qname, const char *aname, const char *resource, int ttl, jint uid) {
#ifdef PROFILE_JNI #ifdef PROFILE_JNI
float mselapsed; float mselapsed;
struct timeval start, end; struct timeval start, end;
@ -610,6 +611,7 @@ void dns_resolved(const struct arguments *args,
fidAName = jniGetFieldID(args->env, clsRR, "AName", string); fidAName = jniGetFieldID(args->env, clsRR, "AName", string);
fidResource = jniGetFieldID(args->env, clsRR, "Resource", string); fidResource = jniGetFieldID(args->env, clsRR, "Resource", string);
fidTTL = jniGetFieldID(args->env, clsRR, "TTL", "I"); fidTTL = jniGetFieldID(args->env, clsRR, "TTL", "I");
fidDnsUid = jniGetFieldID(args->env, clsRR, "uid", "I");
} }
jlong jtime = time(NULL) * 1000LL; jlong jtime = time(NULL) * 1000LL;
@ -625,6 +627,7 @@ void dns_resolved(const struct arguments *args,
(*args->env)->SetObjectField(args->env, jrr, fidAName, janame); (*args->env)->SetObjectField(args->env, jrr, fidAName, janame);
(*args->env)->SetObjectField(args->env, jrr, fidResource, jresource); (*args->env)->SetObjectField(args->env, jrr, fidResource, jresource);
(*args->env)->SetIntField(args->env, jrr, fidTTL, ttl); (*args->env)->SetIntField(args->env, jrr, fidTTL, ttl);
(*args->env)->SetIntField(args->env, jrr, fidDnsUid, uid);
(*args->env)->CallVoidMethod(args->env, args->instance, midDnsResolved, jrr); (*args->env)->CallVoidMethod(args->env, args->instance, midDnsResolved, jrr);
jniCheckException(args->env); jniCheckException(args->env);

View File

@ -521,7 +521,7 @@ void log_android(int prio, const char *fmt, ...);
void log_packet(const struct arguments *args, jobject jpacket); void log_packet(const struct arguments *args, jobject jpacket);
void dns_resolved(const struct arguments *args, void dns_resolved(const struct arguments *args,
const char *qname, const char *aname, const char *resource, int ttl); const char *qname, const char *aname, const char *resource, int ttl, jint uid);
jboolean is_domain_blocked(const struct arguments *args, const char *name); jboolean is_domain_blocked(const struct arguments *args, const char *name);

View File

@ -62,5 +62,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="@style/TextSmall" /> android:textAppearance="@style/TextSmall" />
<TextView
android:id="@+id/tvUid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextSmall" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>