• 【分享】全局字符串转换为局部变量存储防止软件被静态分析暴露敏感字符串


    源码下载地址:http://download.csdn.net/detail/asmcvc/4368397

    全局字符串转换为局部变量存储防止软件被静态分析暴露敏感字符串,支持UNICODE字符集和多字节字符集,支持中文,没有做加密处理。

    运行效果截图:

    输入要转换的全局字符串,例如:C:\\file\\我的文件.txt,输出:

    //C:\\file\\我的文件.txt
    #ifdef _UNICODE
    TCHAR szC:\\file\\我的文件.txt[] = { 'C', ':', '\\', 'f', 'i', 'l', 'e', '\\', 0x6211, 0x7684, 0x6587, 0x4EF6, '.', 't', 'x', 't', '\0' };
    #else
    CHAR szC:\\file\\我的文件.txt[] = { 'C', ':', '\\', 'f', 'i', 'l', 'e', '\\', 0xCE, 0xD2, 0xB5, 0xC4, 0xCE, 0xC4, 0xBC, 0xFE, '.', 't', 'x', 't', '\0' };
    #endif

    如果字符串不包含中文,例如:file not found,输出

    //file not found
    TCHAR szfile not found[] = { 'f', 'i', 'l', 'e', ' ', 'n', 'o', 't', ' ', 'f', 'o', 'u', 'n', 'd', '\0' };

    以上结果把变量名稍作修改即可使用,源代码如下:

    // strtestDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "strtest.h"
    #include "strtestDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CstrtestDlg 对话框
    
    
    CstrtestDlg::CstrtestDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CstrtestDlg::IDD, pParent)
        , m_strIN(_T(""))
        , m_strOut(_T(""))
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CstrtestDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialog::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, m_strIN);
        DDX_Text(pDX, IDC_EDIT2, m_strOut);
    }
    
    BEGIN_MESSAGE_MAP(CstrtestDlg, CDialog)
        //}}AFX_MSG_MAP
        ON_BN_CLICKED(IDOK, &CstrtestDlg::OnBnClickedOk)
    END_MESSAGE_MAP()
    
    
    // CstrtestDlg 消息处理程序
    
    BOOL CstrtestDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);            // 设置大图标
        SetIcon(m_hIcon, FALSE);        // 设置小图标
    
        // TODO: 在此添加额外的初始化代码
        m_strOut = _T("本程序将全局字符串转换为局部变量存储,防止软件被静态分析暴露敏感字符串,没有做加密处理。\r\n\r\n例如输入:C:\\\\file\\\\我的文件.txt\r\n");
        UpdateData(FALSE);
        
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    } 
    
    
    //换行要用\r\n
    void CopyToClipboard(LPCTSTR szText,int nCbSize/*=-1*/)
    {
        if ( szText==NULL ){
            return;
        }
    
        if ( nCbSize==-1 ){
            nCbSize = lstrlen(szText)*sizeof(TCHAR);
        }
    
        HGLOBAL hClip = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,nCbSize+1);
        if ( hClip==NULL ){
            return;
        }
    
        char *pBuff = (char*)GlobalLock(hClip);
        if( pBuff==NULL ){
            GlobalFree(hClip);
            return;
        }
    
        memcpy(pBuff,szText,nCbSize);
        pBuff[nCbSize] = 0;
        GlobalUnlock(hClip);
    
        if ( OpenClipboard(NULL) ){
            EmptyClipboard();
            SetClipboardData( CF_TEXT,hClip);
            CloseClipboard();
        }
    
        GlobalFree(hClip);
    }
    
    
    void CstrtestDlg::OnBnClickedOk()
    {
        UpdateData();
        CString strHeader = _T("CHAR sz") + m_strIN + _T("[] = { ");
        CString strText;
        CStringA strInputA;
        CStringW strInputW;
        CStringA strTempA;
        CStringW strTempW;
        WCHAR chTempW = 0;
        CHAR chTempA = 0;
    
        strInputA = m_strIN;
        strInputW = m_strIN;
    
        BOOL bContainChinese = FALSE;
    
        //先获取UNICODE模式
        for ( int i=0; i<strInputW.GetLength(); ++i ){
            chTempW = strInputW.GetAt(i);
            if ( chTempW==L'\\' ){
                //转义字符,向后再取一个
                ++i;
                strTempW = strInputW.GetAt(i);
                strText += L"\'\\" + strTempW + L"\', ";
            }else if ( chTempW<0 || chTempW>127 ){
                //看成中文字符
                bContainChinese = TRUE;
                strTempW.Format(L"0x%X, ",chTempW);
                strText += strTempW;
            }else{
                //其他正常字符
                strTempW = chTempW;
                strText += L"\'" + strTempW + L"\', ";
            }
    
            if ( i==strInputW.GetLength()-1 ){
                strText += L"\'\\0\' };";
            }
        }
        m_strOut = L"T" + strHeader + strText + L"\r\n";
    
        //有中文字符的情况下,生成的TCHAR字符串和CHAR字符串是不一样的
        if ( bContainChinese==TRUE){
            strText.Empty();
    
            for ( int i=0; i<strInputA.GetLength(); ++i ){
                chTempA = strInputA.GetAt(i);
                if ( chTempA=='\\' ){
                    //转义字符,向后再取一个
                    ++i;
                    strTempA = strInputA.GetAt(i);
                    strText += "\'\\" + strTempA + "\', ";
                }else if ( chTempA<0 || chTempA>127 ){
                    //看成中文字符
                    strTempA.Format("0x%X, ",(unsigned char)chTempA);
                    strText += strTempA;
                }else{
                    //其他正常字符
                    strTempA = chTempA;
                    strText += "\'" + strTempA + "\', ";
                }
    
                if ( i==strInputA.GetLength()-1 ){
                    strText += "\'\\0\' };";
                }
            }//end for
    
            m_strOut = _T("#ifdef _UNICODE\r\n") + m_strOut + _T("#else\r\n") + strHeader + strText + _T("\r\n#endif\r\n");
        }
    
        //把原字符串作为注释
        m_strOut = _T("\r\n//") + m_strIN + _T("\r\n") + m_strOut;
    
        CopyToClipboard(m_strOut,m_strOut.GetLength());
        UpdateData(FALSE);
    }
  • 相关阅读:
    bzoj5137 [Usaco2017 Dec]Standing Out from the Herd
    bzoj2434 [Noi2011]阿狸的打字机
    【20181024T2】小C的序列【GCD性质+链表】
    【20181024T3】小C的宿舍【分治】
    【20181024T1】小C的数组【二分+dp】
    【20181023T2】行星通道计划【二维BIT】
    【20181023T1】战争【反向并查集】
    【20181020T1】蛋糕
    【20181019T2】硬币【矩阵快速幂优化DP】
    【20181019T3】比特战争【最小生成树思想】
  • 原文地址:https://www.cnblogs.com/daxingxing/p/2546329.html
Copyright © 2020-2023  润新知