private void ConfirgureRegistryStart() { if (!WindowsLocking.CanLock()) { return; } const string startupLocation = "hkcu\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"; const string valueName = "fpalock"; string appLocation = $"{Application.ExecutablePath} forcelock"; if (!RegistryHelper.ValueExists(startupLocation, valueName)) { RegistryHelper.AddValue(startupLocation, valueName, appLocation); } }
/// <summary> /// Form Shown Event Handler /// </summary> /// <param name="sender">Sender</param> /// <param name="e">EventArgs</param> private void Form1_Shown(object sender, EventArgs e) { string[] arguments = Environment.GetCommandLineArgs(); int protectPid = -1; if (arguments.Length == 3 && arguments[1] == "protect") { protectPid = (int.TryParse(arguments[2], out int result)) ? result : -1; } if (protectPid == -1) { #if DEBUG LoadDebugWindow(); #endif //LoadToTraybar(); qrCodeGenerator = new QRGenerator(); qrCodeGenerator.SetData(AndroidServer.GetLocalIPAddress(), 9624); LoadKeyGeneration(); LoadAndroidServer(); LoadJavascriptServer(); int protectorPID = -1; if (arguments.Length == 3 && arguments[1] == "lock") { protectorPID = (int.TryParse(arguments[2], out int result)) ? result : -1; if (!WindowsLocking.CanLock()) { protectorPID = -1; } } systemLocking = new WindowsLocking(qrCodeGenerator, androidServer, protectorPID); if (protectorPID != -1) { androidServer.SendLockSignal(); } if (arguments.Length == 2 && arguments[2] == "forcelock" && WindowsLocking.CanLock()) { androidServer.SendLockSignal(); } } else { Hide(); ProcessLocker locker = new ProcessLocker(); locker.StartProtectProcess(protectPid, $"lock {System.Diagnostics.Process.GetCurrentProcess().Id}"); } }
/// <summary> /// Read messages from the device /// </summary> /// <param name="ar">Async Result</param> private void ReadCallback(IAsyncResult ar) { int bytesRead = 0; bool noRead = false; ReadObject readObject = (ReadObject)ar.AsyncState; try { bytesRead = readObject.client.EndReceive(ar); } catch (Exception ex) { ServerError?.Invoke(ex); return; } if (bytesRead > 0) { if (readObject.isFirstMessage) { string derPublicKey = keyGeneration.GetDerPublicKey(); SendString(readObject.client, derPublicKey); Form1.WriteLine("Public Key Sent"); readObject.isFirstMessage = false; } else { byte[] dataReceived = new byte[bytesRead]; Array.Copy(readObject.buffer, dataReceived, bytesRead); string textData = Encoding.UTF8.GetString(dataReceived); if (textData.StartsWith("set-session-key")) { Form1.WriteLine("Got set session key"); string encryptedSessionKey = textData.Substring(15); string sessionKey = Encoding.UTF8.GetString(keyGeneration.DecryptData(Convert.FromBase64String(encryptedSessionKey))); readObject.session.SetSessionKey(sessionKey); } else { Form1.WriteLine("Got session message"); byte[] sessionData = readObject.session.DecryptData(textData); string sessionTextData = Encoding.UTF8.GetString(sessionData); Form1.WriteLine($"Session Data: {sessionTextData}"); if (sessionTextData.StartsWith("res-")) { Form1.WriteLine("Got request setter"); readObject.requestString = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1); Form1.WriteLine($"Request string set to: {readObject.requestString}"); SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes("no-data")))); Form1.WriteLine("Continue message sent to client"); } else if (sessionTextData.StartsWith("no-")) { Form1.WriteLine($"Couldn't find credentials on the device: {sessionTextData}"); string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1); if (parameter == "setup") { LockStateChanged?.Invoke(LockState.Failed); } else if (parameter == "fp") { Form1.WriteLine("User failed to authenticate with fingerprint!"); if (readObject.requestString == "getkname-windowsLogon") { WindowsLocking.CancelRegistration(); } else if (readObject.requestString.StartsWith("pw-")) { Form1.WriteLine("Password get failed"); if (jsSrv != null) { jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(3), JavascriptServer.CredentialTransferState.Failed); } } else if (readObject.requestString.StartsWith("storpw-")) { Form1.WriteLine("Password storage failed"); if (jsSrv != null) { jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(7), JavascriptServer.CredentialTransferState.Failed); } } else if (readObject.requestString.StartsWith("getkname-")) { Form1.WriteLine("Get key failed"); if (jsSrv != null) { jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(10), JavascriptServer.CredentialTransferState.Failed); } } } noRead = true; } else if (sessionTextData == "getuser") { if (jsSrv == null) { throw new InvalidOperationException("Can't store password while javascript server is down"); } object[] data = jsSrv.storePasswordQueue.GetQueueData(readObject.requestString.Substring(7)); if (data == null || data.Length != 2) { throw new NullReferenceException("Can't find credentials for the specified web site hash"); } readObject.credentials.username = (string)data[0]; readObject.credentials.password = (string)data[1]; SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(readObject.credentials.username)))); } else if (sessionTextData == "getpass") { SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(readObject.credentials.password)))); if (jsSrv != null) { jsSrv.storePasswordQueue.UpdateState(readObject.requestString.Substring(7), JavascriptServer.CredentialTransferState.Success); } DismissIfOpen?.Invoke(); noRead = true; } else if (sessionTextData.StartsWith("usresp-")) { string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1); readObject.credentials.username = parameter; Form1.WriteLine($"Got credentials: usr: {readObject.credentials.username} ; pwd: {readObject.credentials.password}"); if (jsSrv == null) { throw new NullReferenceException("Javascript Server was down when trying to get credentials data"); } jsSrv.getPasswordQueue.UpdateExtraData(readObject.requestString.Substring(3), readObject.credentials.username, readObject.credentials.password); jsSrv.getPasswordQueue.UpdateState(readObject.requestString.Substring(3), JavascriptServer.CredentialTransferState.Success); noRead = true; } else if (sessionTextData.StartsWith("pushkey-")) { string key = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1); if (readObject.requestString == "win") { if (WindowsLocking.IsLogonValid(key)) { LockStateChanged?.Invoke(LockState.Unlocked); } else { LockStateChanged?.Invoke(LockState.Failed); } } else if (readObject.requestString == "lock") { if (WindowsLocking.IsLogonValid(key)) { LockStateChanged?.Invoke(LockState.Locked); } else { LockStateChanged?.Invoke(LockState.Failed); } } else { if (jsSrv == null) { throw new NullReferenceException("Javascript server is down when trying to forward 2fa key"); } jsSrv.getKeyQueue.UpdateExtraData(readObject.requestString.Substring(10), key); jsSrv.getKeyQueue.UpdateState(readObject.requestString.Substring(10), JavascriptServer.CredentialTransferState.Success); } noRead = true; } else if (sessionTextData.StartsWith("pwresp-")) { string parameter = sessionTextData.Substring(sessionTextData.IndexOf('-') + 1); readObject.credentials.password = parameter; DismissIfOpen?.Invoke(); } else if (sessionTextData == "getkvalue") { string parameter = readObject.requestString.Substring(readObject.requestString.IndexOf('-') + 1); string pushKey; if (parameter == "windowsLogon") //Windows Lock Authentication { string lockingKey = WindowsLocking.RegisterLogon(); pushKey = lockingKey; } else { if (jsSrv == null) { throw new NullReferenceException("Javascript server was down when trying to send key to android device"); } if (jsSrv.storeKeyQueue.Contains(readObject.requestString.Substring(9))) { pushKey = (string)jsSrv.storeKeyQueue.GetQueueData(readObject.requestString.Substring(9))[0]; } else { pushKey = "fail"; } } if (pushKey == null) { pushKey = "fail"; } SendString(readObject.client, Convert.ToBase64String(readObject.session.EncryptData(Encoding.UTF8.GetBytes(pushKey)))); if (pushKey == "fail") { Form1.WriteLine("PushKey set to fail!"); jsSrv.storeKeyQueue.UpdateState(readObject.requestString.Substring(9), JavascriptServer.CredentialTransferState.Failed); } else { jsSrv.storeKeyQueue.UpdateState(readObject.requestString.Substring(9), JavascriptServer.CredentialTransferState.Success); } noRead = true; } } } } Array.Clear(readObject.buffer, 0, readObject.buffer.Length); if (!noRead) { readObject.client.BeginReceive(readObject.buffer, 0, readObject.buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), readObject); } }