123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- // AutoRun.cpp : Defines the class behaviors for the application.
- //
- #include "stdafx.h"
- #include "AutoRun.h"
- #include "AutoRunDlg.h"
- #include <initguid.h>
- #include <afxsock.h>//<Winsock2.h>
- #include <wincrypt.h>
- #include <tlhelp32.h>
- #include "DBConfig.h"
- #include "Lzari.h"
- #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
- #define KEYLENGTH 0x00800000
- #define ENCRYPT_ALGORITHM CALG_RC4
- #define ENCRYPT_BLOCK_SIZE 8
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- CDatabase g_db;
- extern CDatabase *g_curdb;
- CString g_mainpath;
- CString g_server;
- CString g_server2;
- CString g_localip;
- CAutoRunDlg *g_pMainWnd = NULL;
- BOOL g_bSendOK = 0;
- SENDHEAD g_sendhead;
- CStringArray g_serverarray;
- #pragma comment(lib, "Shlwapi.lib")
- BOOL isInnerIP(DWORD a_ip)
- {
- BOOL bValid = 0;
- if ((a_ip >> 24 == 0xa) || (a_ip >> 16 == 0xc0a8) || (a_ip >> 22 == 0x2b0))
- {
- bValid = 1;
- }
- return bValid;
- }
- void MyGetIPByName(CString &name)
- {
- CString strIP = name;
- name.Empty();
- DWORD dwServerIP = 0;
- HOSTENT *host = gethostbyname(strIP);
- struct in_addr addr;
- if (host != NULL)
- {
- for (int i = 0; host->h_addr_list[i] != NULL; i++)
- {
- memset(&addr, 0, sizeof(addr));
- memcpy(&addr.S_un.S_addr, host->h_addr_list[i], host->h_length);
- dwServerIP = ntohl(addr.S_un.S_addr);
- BYTE* pIP = (BYTE*)&dwServerIP;
- name.Format(_T("%d.%d.%d.%d"), pIP[3], pIP[2], pIP[1], pIP[0]);
- g_serverarray.Add(name);
- }
- }
- while (g_serverarray.GetSize() > 1)
- {
- CString name;
- BOOL bFind = 0;
- for (int i = 0; i < g_serverarray.GetSize(); i++)
- {
- DWORD dwServerIP = inet_addr(g_serverarray.ElementAt(i));
- dwServerIP = htonl(dwServerIP);
- if (isInnerIP(dwServerIP) == 0)
- {
- g_serverarray.RemoveAt(i);
- bFind = 1;
- break;
- }
- }
- if (bFind == 0)
- {
- break;
- }
- }
- if (g_serverarray.GetSize())
- name = g_serverarray.ElementAt(0);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CAutoRunApp
- BEGIN_MESSAGE_MAP(CAutoRunApp, CWinApp)
- //{{AFX_MSG_MAP(CAutoRunApp)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- // DO NOT EDIT what you see in these blocks of generated code!
- //}}AFX_MSG
- ON_COMMAND(ID_HELP, CWinApp::OnHelp)
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CAutoRunApp construction
- CAutoRunApp::CAutoRunApp()
- {
- // TODO: add construction code here,
- // Place all significant initialization in InitInstance
- }
- /////////////////////////////////////////////////////////////////////////////
- // The one and only CAutoRunApp object
- CAutoRunApp theApp;
- /////////////////////////////////////////////////////////////////////////////
- // CAutoRunApp initialization
- DWORD FindAppProcessID(CString path)
- {
- try
- {
- HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
- PROCESSENTRY32 Info;
- Info.dwSize = sizeof(PROCESSENTRY32);
- path.MakeLower();
- if (::Process32First(handle, &Info))
- {
- do
- {
- CString ss = Info.szExeFile;
- ss.MakeLower();
- // if(ss.Find (path)!=-1 || (!ss.CompareNoCase(path)) )
- if (ss == path)
- {
- ::CloseHandle(handle);
- return Info.th32ProcessID;
- }
- } while (::Process32Next(handle, &Info));
- ::CloseHandle(handle);
- }
- return -1;
- }
- catch (...)
- {
- }
- }
- BOOL CAutoRunApp::InitInstance()
- {
- HANDLE hObject = CreateMutex(NULL, FALSE, _T("xdCAutoRunAppXiao"));
- if (GetLastError() == ERROR_ALREADY_EXISTS)
- {
- return false;
- }
- int nResult = Transport_Init();
- if (TRANSPORT_OK != nResult)
- {
- return false;
- }
- Global::GetIniInfo();
- char server[50];
- DWORD leng = 50;
- ::GetComputerName(server, &leng);
- g_server2 = server;
- MyGetIPByName(g_server2);
- if (g_server2.GetLength() < 3)
- return false;
- // if(g_server2.Left (3)!="192" && g_server2.Left (3)!="127")
- // return false;
- // Standard initialization
- // If you are not using these features and wish to reduce the size
- // of your final executable, you should remove from the following
- // the specific initialization routines you do not need.
- CAutoRunDlg dlg;
- m_pMainWnd = &dlg;
- int nResponse = dlg.DoModal();
- if (nResponse == IDOK)
- {
- // TODO: Place code here to handle when the dialog is
- // dismissed with OK
- }
- else if (nResponse == IDCANCEL)
- {
- // TODO: Place code here to handle when the dialog is
- // dismissed with Cancel
- }
- // Since the dialog has been closed, return FALSE so that we exit the
- // application, rather than start the application's message pump.
- return FALSE;
- }
- int CAutoRunApp::ExitInstance()
- {
- return CWinApp::ExitInstance();
- }
- BOOL EncryptFile2(BYTE *buffer, DWORD leng, PCHAR szPassword)
- {
- try
- {
- HCRYPTPROV hCryptProv;
- HCRYPTKEY hKey;
- HCRYPTHASH hHash;
- PBYTE pbBuffer;
- DWORD dwBlockLen;
- DWORD dwBufferLen;
- DWORD dwCount;
- //以下获得一个CSP句柄
- if (CryptAcquireContext(
- &hCryptProv,
- NULL, //NULL表示使用默认密钥容器,默认密钥容器名为用户登陆名
- NULL,
- PROV_RSA_FULL,
- 0))
- {
- printf("A cryptographic provider has been acquired. \n");
- }
- else//密钥容器不存在
- {
- if (CryptAcquireContext(
- &hCryptProv,
- NULL,
- NULL,
- PROV_RSA_FULL,
- CRYPT_NEWKEYSET))//创建密钥容器
- {
- //创建密钥容器成功,并得到CSP句柄
- printf("A new key container has been created.\n");
- }
- else
- {
- return 0;
- }
- }
- //--------------------------------------------------------------------
- // 创建一个会话密钥(session key)
- // 会话密钥也叫对称密钥,用于对称加密算法。
- // (注: 一个Session是指从调用函数CryptAcquireContext到调用函数
- // CryptReleaseContext 期间的阶段。)
- //--------------------------------------------------------------------
- // Create a hash object.
- if (CryptCreateHash(
- hCryptProv,
- CALG_MD5,
- 0,
- 0,
- &hHash))
- {
- printf("A hash object has been created. \n");
- }
- else
- {
- return 0;
- }
- //--------------------------------------------------------------------
- // 用输入的密码产生一个散列
- if (CryptHashData(
- hHash,
- (BYTE *)szPassword,
- strlen(szPassword),
- 0))
- {
- printf("The password has been added to the hash. \n");
- }
- else
- {
- return 0;
- }
- //--------------------------------------------------------------------
- // 通过散列生成会话密钥(session key)
- if (CryptDeriveKey(
- hCryptProv,
- ENCRYPT_ALGORITHM,
- hHash,
- KEYLENGTH,
- &hKey))
- {
- printf("An encryption key is derived from the password hash. \n");
- }
- else
- {
- return 0;
- }
- //--------------------------------------------------------------------
- // Destroy the hash object.
- CryptDestroyHash(hHash);
- hHash = NULL;
- //--------------------------------------------------------------------
- // The session key is now ready.
- //--------------------------------------------------------------------
- // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的,所以被加密的
- // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的
- // 数据长度。
- dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
- //--------------------------------------------------------------------
- // Determine the block size. If a block cipher is used,
- // it must have room for an extra block.
- if (ENCRYPT_BLOCK_SIZE > 1)
- dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
- else
- dwBufferLen = dwBlockLen;
- dwCount = dwBufferLen;
- //--------------------------------------------------------------------
- // In a do loop, encrypt the source file and write to the source file.
- int count;
- // if(leng%dwBlockLen==0)
- count = leng / dwBufferLen;
- // else
- // count=leng/dwBlockLen+1;
- for (int i = 0; i < count; i++)
- {
- pbBuffer = buffer + i*dwBufferLen;
- // 加密数据
- if (!CryptEncrypt(
- hKey, //密钥
- 0, //如果数据同时进行散列和加密,这里传入一个散列对象
- 0, //如果是最后一个被加密的块,输入TRUE.如果不是输入FALSE.
- //这里通过判断是否到文件尾来决定是否为最后一块。
- 0, //保留
- pbBuffer, //输入被加密数据,输出加密后的数据
- &dwCount, //输入被加密数据实际长度,输出加密后数据长度
- dwBufferLen)) //pbBuffer的大小。
- {
- return 0;
- }
- }
- if (leng%dwBlockLen)
- {
- pbBuffer = buffer + i*dwBufferLen;
- dwCount = leng - i*dwBufferLen;
- if (!CryptEncrypt(
- hKey, //密钥
- 0, //如果数据同时进行散列和加密,这里传入一个散列对象
- TRUE, //如果是最后一个被加密的块,输入TRUE.如果不是输入FALSE.
- //这里通过判断是否到文件尾来决定是否为最后一块。
- 0, //保留
- pbBuffer, //输入被加密数据,输出加密后的数据
- &dwCount, //输入被加密数据实际长度,输出加密后数据长度
- dwBufferLen)) //pbBuffer的大小。
- {
- return 0;
- }
- }
- //--------------------------------------------------------------------
- // Destroy session key.
- if (hKey)
- CryptDestroyKey(hKey);
- //--------------------------------------------------------------------
- // Destroy hash object.
- if (hHash)
- CryptDestroyHash(hHash);
- //--------------------------------------------------------------------
- // Release provider handle.
- if (hCryptProv)
- CryptReleaseContext(hCryptProv, 0);
- return(TRUE);
- }
- catch (...)
- {
- }
- }
- extern CArray<CStringArray, CStringArray>g_List1array;
- extern DWORD g_nLeng;
- extern BYTE *g_pData;
- extern CString g_str;
- void DataToArray(CArray<CStringArray, CStringArray>*List1array)
- {
- List1array->RemoveAll();
- if (g_nLeng == 0)return;
- if (g_sendhead.code[0])
- {
- BYTE *lpszOut = NULL;
- int nOutSize = 0;
- LZARI Lzari;
- Lzari.UnCompress(g_pData, g_nLeng, lpszOut, nOutSize);
- CMemFile memfile;
- memfile.Attach(lpszOut, nOutSize);
- Lzari.Release();
- CArchive ar(&memfile, CArchive::load);
- List1array->SetSize(g_sendhead.count[0]);
- for (int ii = 0; ii < List1array->GetSize(); ii++)
- {
- List1array->ElementAt(ii).Serialize(ar);
- }
- ar.Close();
- memfile.Detach();
- }
- else
- {
- CMemFile memfile;
- memfile.Attach(g_pData, g_nLeng);
- CArchive ar(&memfile, CArchive::load);
- List1array->SetSize(g_sendhead.count[0]);
- for (int ii = 0; ii < List1array->GetSize(); ii++)
- {
- List1array->ElementAt(ii).Serialize(ar);
- }
- ar.Close();
- memfile.Detach();
- }
- }
- void DataToArray(CArray<CStringArray, CStringArray>*List1array, CArray<CStringArray, CStringArray>*List2array)
- {
- CArray<CStringArray, CStringArray>*parray[2] = { List1array, List2array };
- DWORD bytereads = 0;
- for (int i = 0; i < 2; i++)
- {
- parray[i]->RemoveAll(); if (g_sendhead.length[i] == 0)continue;
- if (g_sendhead.code[i])
- {
- BYTE *lpszOut = NULL;
- int nOutSize = 0;
- LZARI Lzari;
- Lzari.UnCompress(g_pData + bytereads, g_sendhead.length[i], lpszOut, nOutSize);
- CMemFile memfile;
- memfile.Attach(lpszOut, nOutSize);
- Lzari.Release();
- bytereads += g_sendhead.length[i];
- CArchive ar(&memfile, CArchive::load);
- parray[i]->SetSize(g_sendhead.count[i]);
- for (int ii = 0; ii < parray[i]->GetSize(); ii++)
- {
- parray[i]->ElementAt(ii).Serialize(ar);
- }
- ar.Close();
- memfile.Detach();
- }
- else
- {
- CMemFile memfile;
- memfile.Attach(g_pData + bytereads, g_sendhead.length[i]);
- bytereads += g_sendhead.length[i];
- CArchive ar(&memfile, CArchive::load);
- parray[i]->SetSize(g_sendhead.count[i]);
- for (int ii = 0; ii < parray[i]->GetSize(); ii++)
- {
- parray[i]->ElementAt(ii).Serialize(ar);
- }
- ar.Close();
- memfile.Detach();
- }
- }
- }
|