Exemple #1
0
        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);
            }
        }
Exemple #2
0
        /// <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}");
            }
        }
Exemple #3
0
        /// <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);
            }
        }