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
+73
View File
@@ -0,0 +1,73 @@
/*
* Decompiled with CFR 0.152.
*/
import java.util.Hashtable;
import java.util.Vector;
class CapsContainer {
protected Hashtable infoMap = new Hashtable(64, 0.25f);
protected Vector orderedList = new Vector(32, 8);
public void add(CapabilityInfo capabilityInfo) {
Integer n = new Integer(capabilityInfo.getCode());
this.infoMap.put(n, capabilityInfo);
}
public void add(int n, String string, String string2, String string3) {
Integer n2 = new Integer(n);
this.infoMap.put(n2, new CapabilityInfo(n, string, string2, string3));
}
public boolean isKnown(int n) {
return this.infoMap.containsKey(new Integer(n));
}
public CapabilityInfo getInfo(int n) {
return (CapabilityInfo)this.infoMap.get(new Integer(n));
}
public String getDescription(int n) {
CapabilityInfo capabilityInfo = (CapabilityInfo)this.infoMap.get(new Integer(n));
if (capabilityInfo == null) {
return null;
}
return capabilityInfo.getDescription();
}
public boolean enable(CapabilityInfo capabilityInfo) {
Integer n = new Integer(capabilityInfo.getCode());
CapabilityInfo capabilityInfo2 = (CapabilityInfo)this.infoMap.get(n);
if (capabilityInfo2 == null) {
return false;
}
boolean bl = capabilityInfo2.enableIfEquals(capabilityInfo);
if (bl) {
this.orderedList.addElement(n);
}
return bl;
}
public boolean isEnabled(int n) {
CapabilityInfo capabilityInfo = (CapabilityInfo)this.infoMap.get(new Integer(n));
if (capabilityInfo == null) {
return false;
}
return capabilityInfo.isEnabled();
}
public int numEnabled() {
return this.orderedList.size();
}
public int getByOrder(int n) {
int n2;
try {
n2 = (Integer)this.orderedList.elementAt(n);
}
catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException) {
n2 = 0;
}
return n2;
}
}