Pastebin launched a little side project called HostCabi.net, check it out ;-)Don't like ads? PRO users don't see any ads ;-)
Guest

winscard.cpp

By: a guest on Jan 17th, 2013  |  syntax: C++  |  size: 11.79 KB  |  hits: 1,630  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //  winscard.cpp Put the following files in the same folder:
  2. //      Crypto.cpp, Crypto.h, Decoder-ECM.cpp, Decoder.h, Global.h
  3. //      Keys.cpp, Keys.h, Keyset.cpp, Keyset.h
  4. //  You should modify "Size" in Decoder-ECM.cpp line 42 to "Size -3"
  5. //
  6.  
  7. #include <Windows.h>
  8. #include <time.h>
  9. #define htons htons_
  10. #define ntohs ntohs_
  11. #include "Crypto.cpp"
  12. #include "Decoder-ECM.cpp"
  13. #include "Keys.cpp"
  14. #include "Keyset.cpp"
  15.  
  16. #ifdef _WIN64
  17. #pragma comment(linker,"/EXPORT:SCardCancel=SCardCancel_")
  18. #pragma comment(linker,"/EXPORT:SCardConnectA=SCardConnectA_")
  19. #pragma comment(linker,"/EXPORT:SCardConnectW=SCardConnectW_")
  20. #pragma comment(linker,"/EXPORT:SCardDisconnect=SCardDisconnect_")
  21. #pragma comment(linker,"/EXPORT:SCardEstablishContext=SCardEstablishContext_")
  22. #pragma comment(linker,"/EXPORT:SCardFreeMemory=SCardFreeMemory_")
  23. #pragma comment(linker,"/EXPORT:SCardGetStatusChangeA=SCardGetStatusChangeA_")
  24. #pragma comment(linker,"/EXPORT:SCardGetStatusChangeW=SCardGetStatusChangeW_")
  25. #pragma comment(linker,"/EXPORT:SCardIsValidContext=SCardIsValidContext_")
  26. #pragma comment(linker,"/EXPORT:SCardListReadersA=SCardListReadersA_")
  27. #pragma comment(linker,"/EXPORT:SCardListReadersW=SCardListReadersW_")
  28. #pragma comment(linker,"/EXPORT:SCardReconnect=SCardReconnect_")
  29. #pragma comment(linker,"/EXPORT:SCardReleaseContext=SCardReleaseContext_")
  30. #pragma comment(linker,"/EXPORT:SCardStatusA=SCardStatusA_")
  31. #pragma comment(linker,"/EXPORT:SCardStatusW=SCardStatusW_")
  32. #pragma comment(linker,"/EXPORT:SCardTransmit=SCardTransmit_")
  33. #pragma comment(linker,"/EXPORT:SCardAccessStartedEvent=SCardAccessStartedEvent_")
  34. #pragma comment(linker,"/EXPORT:SCardReleaseStartedEvent=SCardReleaseStartedEvent_")
  35. #pragma comment(linker,"/EXPORT:g_rgSCardT1Pci=g_rgSCardT1Pci_")
  36. #else
  37. #pragma comment(linker,"/EXPORT:SCardCancel=_SCardCancel_@4")
  38. #pragma comment(linker,"/EXPORT:SCardConnectA=_SCardConnectA_@24")
  39. #pragma comment(linker,"/EXPORT:SCardConnectW=_SCardConnectW_@24")
  40. #pragma comment(linker,"/EXPORT:SCardDisconnect=_SCardDisconnect_@8")
  41. #pragma comment(linker,"/EXPORT:SCardEstablishContext=_SCardEstablishContext_@16")
  42. #pragma comment(linker,"/EXPORT:SCardFreeMemory=_SCardFreeMemory_@8")
  43. #pragma comment(linker,"/EXPORT:SCardGetStatusChangeA=_SCardGetStatusChangeA_@16")
  44. #pragma comment(linker,"/EXPORT:SCardGetStatusChangeW=_SCardGetStatusChangeW_@16")
  45. #pragma comment(linker,"/EXPORT:SCardIsValidContext=_SCardIsValidContext_@4")
  46. #pragma comment(linker,"/EXPORT:SCardListReadersA=_SCardListReadersA_@16")
  47. #pragma comment(linker,"/EXPORT:SCardListReadersW=_SCardListReadersW_@16")
  48. #pragma comment(linker,"/EXPORT:SCardReconnect=_SCardReconnect_@20")
  49. #pragma comment(linker,"/EXPORT:SCardReleaseContext=_SCardReleaseContext_@4")
  50. #pragma comment(linker,"/EXPORT:SCardStatusA=_SCardStatusA_@28")
  51. #pragma comment(linker,"/EXPORT:SCardStatusW=_SCardStatusW_@28")
  52. #pragma comment(linker,"/EXPORT:SCardTransmit=_SCardTransmit_@28")
  53. #pragma comment(linker,"/EXPORT:SCardAccessStartedEvent=_SCardAccessStartedEvent_@0")
  54. #pragma comment(linker,"/EXPORT:SCardReleaseStartedEvent=_SCardReleaseStartedEvent_@0")
  55. #pragma comment(linker,"/EXPORT:g_rgSCardT1Pci=_g_rgSCardT1Pci_")
  56. #endif
  57.  
  58. static const INT DummyHandle = 0x35313239;
  59. //static const CHAR READER_NAME_A[] = "Pseudo SmartCardReader\0";
  60. //static const WCHAR READER_NAME_W[] = L"Pseudo SmartCardReader\0";
  61. static const CHAR READER_NAME_A[] = "\アッカリ~ン/\0";
  62. static const WCHAR READER_NAME_W[] = L"\アッカリ~ン/\0";
  63. static HANDLE g_SCardStartedEvent_ = NULL;
  64. static BYTE pbIDBuffer[] = {0x00,0x07,0x78,0x1d,0x18,0xd3,0x60,0xc9,0x90,0x00};
  65. static const CHAR File[] = "winscard.id";
  66.  
  67. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  68. {
  69.         HANDLE Handle;
  70.         DWORD Size;
  71.         u16 id01,id23,id45,id67;
  72.         Handle = CreateFileA(File, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
  73.         if(Handle == (HANDLE)-1) // winscard.id file not found
  74.         {
  75.                 srand(time(NULL) & 0xffff);
  76.                 srand(rand());
  77.                 id01 = 0x0007;
  78.                 id23 = rand();
  79.                 id45 = rand();
  80.                 id67 = id01 ^ id23 ^ id45;
  81.                 pbIDBuffer[0] = id01 >> 8;
  82.                 pbIDBuffer[1] = id01 & 0xff;
  83.                 pbIDBuffer[2] = id23 >> 8;
  84.                 pbIDBuffer[3] = id23 & 0xff;
  85.                 pbIDBuffer[4] = id45 >> 8;
  86.                 pbIDBuffer[5] = id45 & 0xff;
  87.                 pbIDBuffer[6] = id67 >> 8;
  88.                 pbIDBuffer[7] = id67 & 0xff;
  89.                 Handle=CreateFileA(File, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
  90.                 WriteFile(Handle, pbIDBuffer, 8, &Size, NULL);
  91.         }
  92.         else
  93.         {
  94.                 ReadFile(Handle, pbIDBuffer, 8, &Size, NULL);
  95.         }
  96.         CloseHandle(Handle);
  97.         if (fdwReason == DLL_PROCESS_ATTACH)
  98.         {
  99.                 DisableThreadLibraryCalls(hinstDLL);
  100.                 g_SCardStartedEvent_ = CreateEvent(NULL, TRUE, TRUE, NULL);
  101.                 BCAS::Keys::RegisterAll();
  102.         }
  103.         else if (fdwReason == DLL_PROCESS_DETACH)
  104.         {
  105.                 if (g_SCardStartedEvent_) CloseHandle(g_SCardStartedEvent_);
  106.         }
  107.         return TRUE;
  108. }
  109.  
  110. extern "C"{
  111.  
  112. LONG WINAPI SCardCancel_(SCARDCONTEXT)
  113. {
  114.         return SCARD_S_SUCCESS;
  115. }
  116.  
  117. LONG WINAPI SCardConnectA_(SCARDCONTEXT,LPCTSTR,DWORD,DWORD,LPSCARDHANDLE phCard,LPDWORD pdwActiveProtocol)
  118. {
  119.         *phCard = (SCARDHANDLE)DummyHandle;
  120.         *pdwActiveProtocol = SCARD_PROTOCOL_T1;
  121.         return SCARD_S_SUCCESS;
  122. }
  123.  
  124. LONG WINAPI SCardConnectW_(SCARDCONTEXT,LPCTSTR,DWORD,DWORD,LPSCARDHANDLE phCard,LPDWORD pdwActiveProtocol)
  125. {
  126.         *phCard = (SCARDHANDLE)DummyHandle;
  127.         *pdwActiveProtocol = SCARD_PROTOCOL_T1;
  128.         return SCARD_S_SUCCESS;
  129. }
  130.  
  131. LONG WINAPI SCardDisconnect_(SCARDHANDLE,DWORD)
  132. {
  133.         return SCARD_S_SUCCESS;
  134. }
  135.  
  136. LONG WINAPI SCardEstablishContext_(DWORD,LPCVOID,LPCVOID,LPSCARDCONTEXT phContext)
  137. {
  138.         *phContext = (SCARDCONTEXT)DummyHandle;
  139.         return SCARD_S_SUCCESS;
  140. }
  141.  
  142. LONG WINAPI SCardFreeMemory_(SCARDCONTEXT,LPCVOID)
  143. {
  144.         return SCARD_S_SUCCESS;
  145. }
  146.  
  147. LONG WINAPI SCardGetStatusChangeA_(SCARDCONTEXT,DWORD dwTimeout,LPSCARD_READERSTATEA rgReaderStates,DWORD cReaders)
  148. {
  149.         if (dwTimeout == 0 && cReaders == 1 && rgReaderStates->dwCurrentState == SCARD_STATE_UNAWARE)
  150.         {
  151.                 rgReaderStates->dwEventState = SCARD_STATE_PRESENT;
  152.                 return SCARD_S_SUCCESS;
  153.         }
  154.         return SCARD_E_INVALID_PARAMETER;
  155. }
  156.  
  157. LONG WINAPI SCardGetStatusChangeW_(SCARDCONTEXT,DWORD dwTimeout,LPSCARD_READERSTATEW rgReaderStates,DWORD cReaders)
  158. {
  159.         if (dwTimeout == 0 && cReaders == 1 && rgReaderStates->dwCurrentState == SCARD_STATE_UNAWARE)
  160.         {
  161.                 rgReaderStates->dwEventState = SCARD_STATE_PRESENT;
  162.                 return SCARD_S_SUCCESS;
  163.         }
  164.         return SCARD_E_INVALID_PARAMETER;
  165. }
  166.  
  167. LONG WINAPI SCardIsValidContext_(SCARDCONTEXT hContext)
  168. {
  169.         return SCARD_S_SUCCESS;
  170. }
  171.  
  172. LONG WINAPI SCardListReadersA_(SCARDCONTEXT,LPCTSTR,LPSTR mszReaders,LPDWORD pcchReaders)
  173. {
  174.         if (mszReaders)
  175.                 if (*pcchReaders == SCARD_AUTOALLOCATE)*(LPCSTR*)mszReaders = READER_NAME_A;
  176.                 else memcpy(mszReaders, READER_NAME_A, sizeof(READER_NAME_A));
  177.         *pcchReaders = sizeof(READER_NAME_A) / sizeof(READER_NAME_A[0]);
  178.         return SCARD_S_SUCCESS;
  179. }
  180.  
  181. LONG WINAPI SCardListReadersW_(SCARDCONTEXT,LPCTSTR,LPWSTR mszReaders,LPDWORD pcchReaders)
  182. {
  183.         if (mszReaders)
  184.                 if (*pcchReaders == SCARD_AUTOALLOCATE)*(LPCWSTR*)mszReaders = READER_NAME_W;
  185.                 else memcpy(mszReaders, READER_NAME_W, sizeof(READER_NAME_W));
  186.         *pcchReaders = sizeof(READER_NAME_W) / sizeof(READER_NAME_W[0]);
  187.         return SCARD_S_SUCCESS;
  188. }
  189.  
  190. LONG WINAPI SCardReconnect_(SCARDHANDLE,DWORD,DWORD,DWORD,LPDWORD pdwActiveProtocol)
  191. {
  192.         *pdwActiveProtocol = SCARD_PROTOCOL_T1;
  193.         return SCARD_S_SUCCESS;
  194. }
  195.  
  196. LONG WINAPI SCardReleaseContext_(SCARDCONTEXT)
  197. {
  198.         return SCARD_S_SUCCESS;
  199. }
  200.  
  201. LONG WINAPI SCardStatusA_(SCARDHANDLE hCard,LPSTR mszReaderNames,LPDWORD pcchReaderLen,LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen)
  202. {
  203.         if (pcchReaderLen) {
  204.                 if (!mszReaderNames || *pcchReaderLen != SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
  205.                 for (*pcchReaderLen = 2; READER_NAME_A[*pcchReaderLen-2] || READER_NAME_A[*pcchReaderLen-1]; ++*pcchReaderLen);
  206.                 memcpy(mszReaderNames, READER_NAME_A, sizeof(READER_NAME_A));
  207.         }
  208.         *pdwState = SCARD_PRESENT;
  209.         *pdwProtocol = SCARD_PROTOCOL_T1;
  210.         if (pcbAtrLen) {
  211.                 if (*pcbAtrLen == SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
  212.                 *pcbAtrLen = 0;
  213.         }
  214.         return SCARD_S_SUCCESS;
  215. }
  216.  
  217. LONG WINAPI SCardStatusW_(SCARDHANDLE hCard,LPWSTR mszReaderNames,LPDWORD pcchReaderLen,LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen)
  218. {
  219.         if (pcchReaderLen) {
  220.                 if (!mszReaderNames || *pcchReaderLen != SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
  221.                 for (*pcchReaderLen = 2; READER_NAME_W[*pcchReaderLen-2] || READER_NAME_W[*pcchReaderLen-1]; ++*pcchReaderLen);
  222.                 memcpy(mszReaderNames, READER_NAME_W, sizeof(READER_NAME_W));
  223.         }
  224.         *pdwState = SCARD_PRESENT;
  225.         *pdwProtocol = SCARD_PROTOCOL_T1;
  226.         if (pcbAtrLen) {
  227.                 if (*pcbAtrLen == SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
  228.                 *pcbAtrLen = 0;
  229.         }
  230.         return SCARD_S_SUCCESS;
  231. }
  232.  
  233. LONG WINAPI SCardTransmit_(SCARDHANDLE,LPCSCARD_IO_REQUEST,LPCBYTE pbSendBuffer,DWORD cbSendLength,LPSCARD_IO_REQUEST,LPBYTE pbRecvBuffer,LPDWORD pcbRecvLength)
  234. {
  235.         HANDLE Handle;
  236.         DWORD Size;
  237.         u16 id01,id23,id45,id67;
  238.         switch(pbSendBuffer[1])
  239.         {
  240.         case 0x30:{ // 90 30 00 00 00
  241.                 BYTE r[] = { // INT 初期設定条件
  242.                         0x00,0x39,0x00,0x00,0x21,0x00,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x50,
  243.                         0x36,0x31,0x04,0x66,0x4b,0x17,0xea,0x5c, 0x32,0xdf,0x9c,0xf5,0xc4,0xc3,0x6c,0x1b,
  244.                         0xec,0x99,0x39,0x21,0x68,0x9d,0x4b,0xb7, 0xb7,0x4e,0x40,0x84,0x0d,0x2e,0x7d,0x98,
  245.                         0xfe,0x27,0x19,0x99,0x19,0x69,0x09,0x11, 0x01,0x02,0x01,0x90,0x00};
  246.                 memcpy(pbRecvBuffer,r,sizeof r);
  247.                 memcpy(pbRecvBuffer+8,pbIDBuffer,6);
  248.                 *pcbRecvLength = sizeof r;
  249.                 break;}
  250.         case 0x32:{ // 90 32 00 00 00
  251.                 BYTE r[] = { // IDI カードID 情報取得
  252.                         0x00,0x0f,0x00,0x00,0x21,0x00,0x01,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  253.                         0x00,0x90,0x00};
  254.                 memcpy(pbRecvBuffer,r,sizeof r);
  255.                 memcpy(pbRecvBuffer+9,pbIDBuffer,8);
  256.                 *pcbRecvLength=sizeof r;
  257.                 break;}
  258.         case 0x34:{
  259.                 BYTE r[] = { // ECM 受信
  260.                         0x00,0x15,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  261.                         0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x90, 0x00};
  262.                 BCAS::Decoder::DecodeECM(pbSendBuffer+5,pbSendBuffer[4],r+6,NULL);
  263.                 memcpy(pbRecvBuffer,r,sizeof r);
  264.                 *pcbRecvLength = sizeof r;
  265.                 break;}
  266.         case 0x3C:{ // ここから http://toro.2ch.net/test/read.cgi/avi/1337776912/6
  267.                 BYTE r[] = { // CHK 契約確認
  268.                         0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  269.                         0x00,0x00,0x90,0x00};
  270.                 memcpy(pbRecvBuffer,r,sizeof r);
  271.                 *pcbRecvLength = sizeof r;
  272.                 break;}
  273.         case 0x80:{
  274.                 BYTE r[] = { // WUI 省電力通電制御情報要求
  275.                         0x00,0x10,0x00,0x00,0xA1,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  276.                         0x00,0x00,0x90,0x00};
  277.                 memcpy(pbRecvBuffer,r,sizeof r);
  278.                 *pcbRecvLength = sizeof r;
  279.                 break;} // ここまで
  280.         case 0xB0:{ // 00 B0 00 20 00 00 08
  281.                 BYTE r[] = { // read ID (Tcard only)
  282.                         0xff,0xf8,0x87,0xe2,0xe7,0x2c,0x9f,0x36, 0x90,0x00};
  283.                 Handle = CreateFileA(File, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
  284.                 {
  285.                         ReadFile(Handle, pbIDBuffer, 8, &Size, NULL);
  286.                 }
  287.                 CloseHandle(Handle);
  288.                 memcpy(pbRecvBuffer,pbIDBuffer,10);
  289.                 *(ULONGLONG *)pbRecvBuffer ^= 0xffffffffffffffff;
  290.                 *pcbRecvLength = sizeof r;
  291.                 break;}
  292.         case 0xD6:{ // 00 D6 00 20 00 00 08
  293.                 BYTE r[] = { // update ID (Tcard only)
  294.                         0x90,0x00};
  295.                 memcpy(pbRecvBuffer,r,sizeof r);
  296.                 memcpy(pbIDBuffer,pbSendBuffer+7,8);
  297.                 *(ULONGLONG *)pbIDBuffer ^= 0xffffffffffffffff;
  298.                 Handle = CreateFileA(File, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
  299.                 WriteFile(Handle, pbIDBuffer, 8, &Size, NULL);
  300.                 CloseHandle(Handle);
  301.                 *pcbRecvLength = sizeof r;
  302.                 break;}
  303.         default:{
  304.                 BYTE r[] = {
  305.                         0x00,0x04,0x00,0x00,0xa1,0xfe,0x90,0x00};
  306.                 memcpy(pbRecvBuffer,r,sizeof r);
  307.                 *pcbRecvLength = sizeof r;
  308.                 break;}
  309.         }
  310.         return SCARD_S_SUCCESS;
  311. }
  312.  
  313. HANDLE WINAPI SCardAccessStartedEvent_(void) {return g_SCardStartedEvent_;}
  314. void WINAPI SCardReleaseStartedEvent_(void) {}
  315. SCARD_IO_REQUEST g_rgSCardT1Pci_ = {SCARD_PROTOCOL_T1, 8};
  316.  
  317. }