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

源码下载地址: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);
}

 

转载于:https://www.cnblogs.com/daxingxing/archive/2012/06/12/2546329.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值