【分享】全局字符串转换为局部变量存储防止软件被静态分析暴露敏感字符串
源码下载地址: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); }