Skip to main content
13 min read Intermediate Desktop

Thick Client Penetration Testing

Thick client pentesting is the testing of desktop and rich applications (for example Windows, Java, or .NET apps) to find security problems. It is not only about the server. We also look at how the app stores data on the machine, how it talks to the server, and whether someone could tamper with it or reverse engineer it.

Stay updated with the official OWASP guide: https://owasp.org/www-project-desktop-app-security-top-10/


Table of Contents

  1. What Is a Thick Client
  2. Thin Client vs Thick Client
  3. Two-Tier vs Three-Tier Applications
  4. Common Programming Languages
  5. Common Obfuscation and Deobfuscation
  6. Common Vulnerabilities
  7. Common Tools
  8. Testing Methodology
  9. Vulnerability Checklist
  10. Deep Dive Guides
  11. Resources
  12. Checklists and GitHub References
  13. Vulnerable Practice Applications
  14. Credits

What Is a Thick Client

A thick client is an application that is installed locally on a user's desktop or laptop. These apps are full-featured and can often run on their own without a constant internet connection, unlike web apps that need the browser and server at all times.

Examples of thick clients:

  1. Games such as Call of Duty and Uncharted
  2. Web browsers
  3. Music players
  4. Video and chat tools such as Teams, Zoom, and Slack

Because a large part of the app runs on hardware the user controls, the local attack surface is larger than a typical web app. You can inspect the binary, read local storage, watch memory, and change runtime behavior.


Thin Client vs Thick Client

S.NBasisThin ClientThick Client
1BasicA lightweight client that relies on the host or server for most resourcesRelies less on the server and provides rich local functionality
2Data storeData is stored on the serverData is stored locally
3NetworkNeeds a fast and stable network connectionCan work with a slow connection
4Offline useNo offline useOffline use is possible
5DeploymentEasier to deploy and updateDeployment and updates are harder
6Data validationValidation is done on the serverValidation is often done on the client
7Local resourcesUses fewer local resourcesUses more local resources
8Attack surfaceSmaller local attack surfaceLarger local attack surface (client logic, local storage, memory)

Two-Tier vs Three-Tier Applications

Two-Tier ApplicationsThree-Tier Applications
The client and the server or database are on the same machine or the same internal network. Traffic goes from the client to the server directly, without an intermediary such as an application server.The client connects over a network, and the business logic is handled by an application server. The client runs on the user's desktop, while the application server and database may be elsewhere. Communication usually uses HTTP/S, and sometimes other protocols such as FTP/S, TCP, or UDP.

Common Programming Languages

S.NLanguage
1.NET (WPF, WinForms)
2Java (Swing, JavaFX)
3C / C++
4Electron (JavaScript / TypeScript)
5Python (PyQt, Tkinter)
6Delphi / Object Pascal

Knowing the language matters because it decides how you read the code. Managed languages like .NET and Java decompile back to near-original source, which makes them easy to inspect but also a common target for obfuscation. Native languages like C and C++ compile to machine code, so you disassemble rather than decompile.

Note: Microsoft Silverlight is end-of-life (since October 2021) and is only relevant for legacy targets.


Common Obfuscation and Deobfuscation

Developers use obfuscation to make reverse engineering harder. It does not add real security by itself, but it slows analysis. The type of obfuscation depends on the language. Below are the common obfuscators you will meet and the tools to undo or work around them.

.NET

.NET assemblies decompile cleanly, so .NET apps are the most heavily obfuscated. Common signs are renamed symbols (a, b, c or unicode names), control flow flattening, string encryption, and anti-tamper or anti-debug checks.

ObfuscatorCommon signs
ConfuserEx / ConfuserRenamed symbols, control flow flattening, anti-tamper, packed resources
DotfuscatorRenaming, string encryption, control flow
.NET ReactorNative packing, string encryption, anti-debug
Babel, Eazfuscator, SmartAssemblyRenaming, string and resource encryption

Deobfuscation and analysis tools:

ToolUse
de4dotAutomatic deobfuscation for many .NET obfuscators
dnSpyExDecompile, debug at runtime, and edit assemblies
ILSpy / dotPeekDecompile to C#
ConfuserEx unpackers (specialized scripts)Undo specific ConfuserEx protections
dnlibScript custom deobfuscation of .NET metadata

Practical tip: even when static deobfuscation fails, you can run the app under dnSpyEx or Frida and read decrypted strings and keys at runtime, since the app must deobfuscate itself to run.

Java

Java bytecode also decompiles well, so JAR files are often obfuscated with renaming and string encryption.

ObfuscatorCommon signs
ProGuardShort renamed classes and methods
Allatori, Zelix KlassMaster, DashOString encryption, control flow, flow obfuscation

Deobfuscation and analysis tools:

ToolUse
JADXDecompile JAR and class files to Java
JD-GUIQuick Java decompiler
CFR, Procyon, FernflowerAlternative decompilers that handle tricky bytecode
Java DeobfuscatorAutomatic deobfuscation framework
Bytecode ViewerCombines several decompilers and a bytecode editor

Native (C and C++)

Native binaries do not decompile to source, so obfuscation here means packing, anti-analysis, and control flow tricks. First identify the packer, then unpack before real analysis.

ProtectionCommon signs
UPXHigh-entropy sections, few imports; unpack with upx -d
Themida, VMProtect, EnigmaVirtualized code, anti-debug, anti-VM
Custom packersHigh entropy, tiny import table, self-modifying code

Analysis tools:

ToolUse
Detect It Easy (DIE)Identify the packer and protections
x64dbg with ScyllaUnpack at runtime and rebuild the import table
Ghidra / IDA ProDisassemble and decompile the unpacked binary
PE-bearInspect and repair PE headers after unpacking

Electron and JavaScript

Electron apps ship their JavaScript inside an ASAR archive. It is often minified rather than truly obfuscated.

ToolUse
asarExtract app.asar to read the source (npx asar extract app.asar out)
js-beautifyReformat minified JavaScript
de4jsDeobfuscate common JavaScript obfuscators
Browser or Electron DevToolsDebug and read values at runtime

Python

Python thick clients are often packaged with PyInstaller or py2exe. You can usually recover the bytecode and then the source.

ToolUse
pyinstxtractorExtract PyInstaller executables back to .pyc files
uncompyle6 / decompyle3Decompile .pyc to Python source
pycdcAlternative bytecode decompiler

Reminder: obfuscation is not a control that protects secrets. If the app can run it, you can recover it, most reliably at runtime. Treat any secret or key found in obfuscated code as exposed.


Common Vulnerabilities

S.NVulnerability
1Hardcoded secrets in the source code
2Insecure communication (weak or missing TLS)
3Buffer overflow
4DLL hijacking
5Debug mode left enabled
6SQL injection
7Improper exception handling
8Command injection
9Information disclosure through stack trace errors
10Insecure Direct Object References (IDOR)
11Security misconfiguration
12Unvalidated redirects and forwards
13Broken authentication
14Insecure deserialization
15Missing function-level access control
16Remote Code Execution (RCE)
17Sensitive data or logs stored in cleartext
18Secrets left unencrypted in memory
19Missing binary protections (ASLR, DEP, CFG)
20Weak or missing anti-tamper and anti-debug controls

Common Tools

S.NToolCategoryPrimary Use
1Burp SuiteTraffic InterceptionProxy HTTP/S traffic; use the NoPE extension for non-HTTP thick clients
2FiddlerTraffic InterceptionCapture and modify HTTP/S traffic
3Echo MirageTraffic InterceptionInject into the process and intercept raw TCP or socket traffic, no certificate needed
4MITM RelayTraffic InterceptionRelay non-HTTP TCP or TLS traffic through an HTTP proxy such as Burp
5MalloryTraffic InterceptionLinux-based capture of TCP and UDP traffic
6WiresharkPacket AnalysisInspect raw packets and find cleartext data on the wire
7NmapNetwork ScanningPort and service enumeration of the backend
8testssl.shSSL/TLS TestingDetect weak TLS versions, ciphers, and certificate issues
9ProcmonProcess MonitoringFile, registry, and process activity; find DLL hijacking and insecure file access
10Process ExplorerProcess MonitoringHandles, loaded DLLs, and the process tree
11Process Hacker / System InformerProcess and MemoryLive memory browsing, strings, handles, and memory dumps
12Sysinternals SuiteSystem AnalysisBundle: Procmon, Process Explorer, TCPView, Sigcheck, Strings, AccessChk, and more
13TCPViewNetwork MonitoringLive view of the app's TCP and UDP connections
14CFF ExplorerPE / Static AnalysisInspect PE headers, imports, .NET metadata, and resources
15Detect It Easy (DIE)Static AnalysisIdentify language, packer, compiler, and protections
16StringsStatic AnalysisPull readable strings from binaries; find secrets and endpoints
17dnSpyEx.NET Decompile / DebugDecompile, edit, and debug .NET assemblies (maintained fork of dnSpy)
18dotPeek.NET DecompileDecompile .NET assemblies to C#
19ILSpy.NET DecompileOpen-source .NET decompiler
20de4dot.NET DeobfuscationDeobfuscate protected .NET assemblies
21JADX / JD-GUIJava DecompileDecompile Java or JAR thick clients
22JavaSnoopJava InstrumentationAttach to a running JVM and intercept methods
23WinDbgDebugging / MemoryDeep live debugging and dump analysis; search memory, inspect heap and stack
24x64dbg / x32dbgDebuggingModern user-mode debugger for reversing and patching (OllyDbg replacement)
25GhidraBinary REFree disassembler and decompiler for native binaries
26IDA Pro / IDA FreeBinary REIndustry-standard disassembler and decompiler
27Radare2 / CutterBinary REOpen-source disassembly and analysis framework
28FridaDynamic InstrumentationHook functions, tamper at runtime, scan memory, bypass client-side checks
29API MonitorAPI TracingWatch Windows API calls (crypto, file, registry, network)
30HxDHex EditorView and edit binaries and memory dumps
31RegshotRegistry AnalysisDiff the registry before and after running the app
32DB Browser for SQLiteLocal StorageRead local SQLite databases the app stores
33PESecurity / winchecksecBinary ProtectionsCheck ASLR, DEP, SafeSEH, CFG, and signing on the binary
34SigcheckIntegrityVerify digital signatures and file metadata
35VisualCodeGrepper (VCG)SASTAutomated source-code security scanning
36GUI inspection toolsGUI TestingSpy++, WinSpy++, Window Detective, and Snoop WPF for GUI object tampering

Testing Methodology

Testing usually moves through these phases:

  1. Information gathering: architecture, language, endpoints, and entry points.
  2. GUI testing: hidden or disabled controls, masked fields, and client-side logic.
  3. File system testing: permissions, config secrets, and local storage.
  4. Registry testing: permissions, stored secrets, and manipulation.
  5. Network and traffic testing: interception, TLS strength, and tampering.
  6. Binary and assembly protection testing: ASLR, DEP, CFG, and signing.
  7. Memory testing: secrets in memory, dumps, and runtime manipulation.
  8. Reverse engineering: decompile, deobfuscate, patch, and rebuild.
  9. Common vulnerability testing: injection, deserialization, and logic flaws.

Vulnerability Checklist

The full, checkable list lives in a separate file so you can track progress as you test:

It covers all twenty-two areas (information gathering, GUI, file system, registry, network, binary protections, memory, reverse engineering, auth, data storage, injection, DLL and process security, cryptography, logging, software updates, IPC, privilege escalation and persistence, protocol handlers and argument injection, framework-specific tests, local and embedded servers, licensing and business logic, and reporting) with clickable checkboxes.


Deep Dive Guides

Longer, beginner-friendly guides in this repo that go deeper on specific topics:

  • Memory Analysis with WinDbg: how memory works (stack, heap, registers), and how to search a running app or a dump for secrets, step by step.
  • Process Injection: the Windows basics behind injection and a walkthrough of each technique, with detection notes for defenders.

Resources

S.NCreditResource
1CyberArkThick Client Penetration Testing Methodology
2DarkRelayThick Client Penetration Testing
3PayatuThick Client Penetration Testing
4QualySecThick Client Pen Testing: A Comprehensive Guide
5Medium (Abhishek)Thick Client Security Testing: The Essential Guide
6Infosec WriteupsThick Client Pentest: Modern Approaches and Techniques (Part 1)
7Threat IntelligenceThick Client Application Penetration Test
8OptivThick Client Application Security Testing

Checklists and GitHub References

S.NCreditResource
1Hari-prasaanthThick Client Pentest Checklist
2m14r41PentestingEverything Repository
3RaKKeNThick Client Penetration Testing

Vulnerable Practice Applications

S.NCreditApplication
1srini0x00DVTA (Damn Vulnerable Thick Client App)
2kartikdurgTerrible Thick Client
3WarximVUCSA
4DarkRelayLabsVWA
5NetSPIBetaFast

Credits

S.NCredit
1Viraj Mota
2Optiv - Source Zero