This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
🧭 Overview
OpenTTY is a feature-rich MIDlet application that provides a Unix-like shell environment for Java ME (J2ME) devices. It implements a comprehensive command-line interface with file system management, process control, networking capabilities, and UI components.
🏗️ MIDlet Loading Process
🔄 Initialization Sequence
public void startApp() {
// 1. Set system attributes
attributes.put("PATCH", "Release code-name");
attributes.put("VERSION", getAppProperty("MIDlet-Version"));
// ... more attributes
// 2. Initialize system properties
String[] KEYS = { "TYPE", "CONFIG", "PROFILE", "LOCALE" };
String[] SYS = { "platform", "configuration", "profiles", "locale" };
// 3. Set up Nano editor commands
Command[] NANO_CMDS = { BACK, CLEAR, RUNS, VIEW };
// 4. Execute initialization script
if (runScript(read("/etc/init"), 0) != 0) {
destroyApp(true); // If an error ocurred here, MIDlet crashes
}
// 5. Check user authentication
if (username.equals("") || MIDletControl.passwd().equals("")) {
new MIDletControl(null); // not authenticated, go to login form
} else {
run("/home/.initrc", new String[] { "/home/.initrc" }, 1000); // else run user init script
}
}
🎮 Command Processing System
⚙️ processCommand Method
The processCommand method is the core command interpreter that handles all user input and system commands.
📝 Method Signature
public int processCommand(String command, boolean ignore, int id)
🔄 Processing Flow
-
Command Parsing:
- Extracts main command and arguments
- Handles environment variable substitution via
env() - Supports background execution with
&suffix
-
Command Resolution:
- Checks shell aliases (
aliaseshashtable) - Looks up shell functions (
functionshashtable) - Searches classpath binaries (
/bin/directory) - Falls back to built-in commands
- Checks shell aliases (
-
Classpath System:
- When
classpath = true, automatically executes binaries from/bin/ - Bypasses for shell builtins (
sh,lua) and hidden commands - Enables extensibility through external scripts
- When
🔧 Argument Handling
getCommand(String input): Extracts the first word as commandgetArgument(String input): Returns everything after the commandsplitArgs(String content): Splits arguments respecting quotes
🗂️ Standard Tables & Data Structures
💾 Core Hashtables
public Hashtable attributes = new Hashtable(); // Environment variables
public Hashtable paths = new Hashtable(); // Virtual file system
public Hashtable trace = new Hashtable(); // Process structure
public Hashtable aliases = new Hashtable(); // Command aliases
public Hashtable shell = new Hashtable(); // Applications shells
public Hashtable functions = new Hashtable(); // User-defined functions
public Hashtable tmp = new Hashtable(); // Temporary storage (/tmp/)
📊 Process Table (trace)
- Key: Process ID (PID)
- Value: Hashtable containing:
"name": Process name"owner": User who started process"collector": Cleanup command"screen": Associated UI component- Process-specific data
🔄 Process Management System
📈 Process Lifecycle
🚀 Starting Processes
public int start(String app, String pid, String collector, int id)
- Generates process hashtable via
genprocess() - Special handling for system processes (
sh,x11-wm) - Assigns unique PID or uses reserved IDs for system processes
🏷️ Process Types
- System Processes: PID "1" (shell), "2" (X11 window manager), "3" (Audio Codec)
- User Processes: Random 4-digit PIDs (1000-9999)
- Background Processes: Created with
bgcommand - Network Processes: Socket servers, listeners
⚠️ Process Control
public int kill(String pid, boolean print, int id) // Kill by pid
public int stop(String app, int id) // Kill all process with name equals app
ℹ️ Process Information
getprocess(String pid): Retrieve process datagetobject(String pid, String item): Access process attributesgetpid(String name): Find PID by process name (return null if not found)getowner(String pid): Get process owner
⌨️ Input/Output System
📥 Standard Input (stdin)
public TextField stdin = new TextField("Command", "", 256, TextField.ANY);
- Type:
TextFieldcomponent - Purpose: User command input
- Integration: Bound to
EXECUTEcommand
📤 Standard Output (stdout)
public StringItem stdout = new StringItem("", "");
- Type:
StringItemcomponent - Purpose: Command output display
- Buffer Management: Controlled by
TTY_MAX_LEN
🎯 Output Handling
public void echoCommand(String message, StringItem console)
- Appends to console with newline separation
- Respects
TTY_MAX_LENfor buffer limits - Updates
attributes.put("OUTPUT", message)for scripting
🎛️ MIDletControl Class
🎯 Multi-purpose Controller
The MIDletControl class handles various UI modes and background operations through different constructors.
🚀 Operation Modes
public static final int
HISTORY = 1, // Command history browser
EXPLORER = 2, // File system browser
MONITOR = 3, // System monitor
PROCESS = 4, // Process manager
SIGNUP = 5, // User registration
REQUEST = 7, // Sudo password prompt
NC = 9, // Netcat client
PRSCAN = 10, // Port scanner
GOBUSTER = 11, // Directory brute forcer
BIND = 12, // Bind shell server
SCREEN = 13, // Custom screen builder
LIST = 14, // List selector
QUEST = 15, // Question/input dialog
WEDIT = 16, // Text editor
BG = 17, // Background process
ADDON = 18; // Add-on process
🔑 Key Features
📁 File System Browser (EXPLORER)
- Navigates virtual file system paths
- File operations: open, delete, run, properties
- Integration with physical file system via
/mnt/
📊 Process Manager (PROCESS)
- Lists all running processes with PIDs
- Process control: kill, view info, load screen
- Filtering capability
🌐 Network Tools
- Netcat Client: Raw socket communication
- Port Scanner: TCP port discovery
- GoBuster: Web directory brute forcing
- Bind Server: Command server with socket binding
🛠️ Command Categories
⚙️ System Management
ps,top,trace- Process monitoringstart,stop,kill- Process controlgc- Memory management
📁 File Operations
ls,dir,cd- Navigationcat,nano,view- File viewing/editingrm,cp,mkdir- File manipulation
🌐 Networking
ping,pong- Connectivity testingcurl,wget- HTTP requestsnc,prscan- Socket tools
👥 User Management
whoami,id- User informationsudo,su- Privilege escalationpasswd- Password management
📜 Scripting & Automation
if,for,case- Control structuresfunction- User-defined functionsimport- Package loadingeval- Dynamic execution
📦 Package System
📥 Import Mechanism
private int importScript(String script, int id)
🏗️ Package Structure
- Configuration: Properties-style format
- API Versioning: Compatibility checking
- Dependencies:
includedirective for other packages - Process Definition: Background services
- Command Registration: Shell command extensions
- File Deployment: Resource file installation
📚 Read the Wiki page of OpenTTY Applications (Native)
This comprehensive system makes OpenTTY a powerful platform for mobile device automation and scripting in constrained J2ME environments.