Deconstruct VncThumbnailViewer 1.4.2 and add self-contained build

The shipped VncThumbnailViewerWin1.4.2.exe is a native launcher stub with a
Java JAR appended. This commit adds:

- src/: full Java source recovered from the bundled .class files (CFR),
  plus src/summary.txt with decompiler caveats
- ANALYSIS.md: architecture, data flow, hosts-file format, and security notes
- build-app-image.ps1: reproducible jpackage build that repackages the
  original classes and bundles a slim jlinked runtime (java.base + java.desktop)
  into a self-contained native app-image (no Java required on the target)

The 74 MB app-image is shipped as a release asset rather than tracked.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-01 10:42:42 -05:00
co-authored by Claude Opus 4.8
commit 41a52acef8
53 changed files with 9156 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
/*
* Decompiled with CFR 0.152.
*/
import java.applet.Applet;
import java.io.IOException;
import java.net.Socket;
class HTTPConnectSocketFactory
implements SocketFactory {
HTTPConnectSocketFactory() {
}
public Socket createSocket(String string, int n, Applet applet) throws IOException {
return this.createSocket(string, n, applet.getParameter("PROXYHOST1"), applet.getParameter("PROXYPORT1"));
}
public Socket createSocket(String string, int n, String[] stringArray) throws IOException {
return this.createSocket(string, n, this.readArg(stringArray, "PROXYHOST1"), this.readArg(stringArray, "PROXYPORT1"));
}
public Socket createSocket(String string, int n, String string2, String string3) throws IOException {
int n2 = 0;
if (string3 != null) {
try {
n2 = Integer.parseInt(string3);
}
catch (NumberFormatException numberFormatException) {
// empty catch block
}
}
if (string2 == null || n2 == 0) {
System.out.println("Incomplete parameter list for HTTPConnectSocket");
return new Socket(string, n);
}
System.out.println("HTTP CONNECT via proxy " + string2 + " port " + n2);
HTTPConnectSocket hTTPConnectSocket = new HTTPConnectSocket(string, n, string2, n2);
return hTTPConnectSocket;
}
private String readArg(String[] stringArray, String string) {
for (int i = 0; i < stringArray.length; i += 2) {
if (!stringArray[i].equalsIgnoreCase(string)) continue;
try {
return stringArray[i + 1];
}
catch (Exception exception) {
return null;
}
}
return null;
}
}