Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // winscard.cpp Put the following files in the same folder:
- // Crypto.cpp, Crypto.h, Decoder-ECM.cpp, Decoder.h, Global.h
- // Keys.cpp, Keys.h, Keyset.cpp, Keyset.h
- // You should modify "Size" in Decoder-ECM.cpp line 42 to "Size -3"
- //
- #include <Windows.h>
- #include <time.h>
- #define htons htons_
- #define ntohs ntohs_
- #include "Crypto.cpp"
- #include "Decoder-ECM.cpp"
- #include "Keys.cpp"
- #include "Keyset.cpp"
- #ifdef _WIN64
- #pragma comment(linker,"/EXPORT:SCardCancel=SCardCancel_")
- #pragma comment(linker,"/EXPORT:SCardConnectA=SCardConnectA_")
- #pragma comment(linker,"/EXPORT:SCardConnectW=SCardConnectW_")
- #pragma comment(linker,"/EXPORT:SCardDisconnect=SCardDisconnect_")
- #pragma comment(linker,"/EXPORT:SCardEstablishContext=SCardEstablishContext_")
- #pragma comment(linker,"/EXPORT:SCardFreeMemory=SCardFreeMemory_")
- #pragma comment(linker,"/EXPORT:SCardGetStatusChangeA=SCardGetStatusChangeA_")
- #pragma comment(linker,"/EXPORT:SCardGetStatusChangeW=SCardGetStatusChangeW_")
- #pragma comment(linker,"/EXPORT:SCardIsValidContext=SCardIsValidContext_")
- #pragma comment(linker,"/EXPORT:SCardListReadersA=SCardListReadersA_")
- #pragma comment(linker,"/EXPORT:SCardListReadersW=SCardListReadersW_")
- #pragma comment(linker,"/EXPORT:SCardReconnect=SCardReconnect_")
- #pragma comment(linker,"/EXPORT:SCardReleaseContext=SCardReleaseContext_")
- #pragma comment(linker,"/EXPORT:SCardStatusA=SCardStatusA_")
- #pragma comment(linker,"/EXPORT:SCardStatusW=SCardStatusW_")
- #pragma comment(linker,"/EXPORT:SCardTransmit=SCardTransmit_")
- #pragma comment(linker,"/EXPORT:SCardAccessStartedEvent=SCardAccessStartedEvent_")
- #pragma comment(linker,"/EXPORT:SCardReleaseStartedEvent=SCardReleaseStartedEvent_")
- #pragma comment(linker,"/EXPORT:g_rgSCardT1Pci=g_rgSCardT1Pci_")
- #else
- #pragma comment(linker,"/EXPORT:SCardCancel=_SCardCancel_@4")
- #pragma comment(linker,"/EXPORT:SCardConnectA=_SCardConnectA_@24")
- #pragma comment(linker,"/EXPORT:SCardConnectW=_SCardConnectW_@24")
- #pragma comment(linker,"/EXPORT:SCardDisconnect=_SCardDisconnect_@8")
- #pragma comment(linker,"/EXPORT:SCardEstablishContext=_SCardEstablishContext_@16")
- #pragma comment(linker,"/EXPORT:SCardFreeMemory=_SCardFreeMemory_@8")
- #pragma comment(linker,"/EXPORT:SCardGetStatusChangeA=_SCardGetStatusChangeA_@16")
- #pragma comment(linker,"/EXPORT:SCardGetStatusChangeW=_SCardGetStatusChangeW_@16")
- #pragma comment(linker,"/EXPORT:SCardIsValidContext=_SCardIsValidContext_@4")
- #pragma comment(linker,"/EXPORT:SCardListReadersA=_SCardListReadersA_@16")
- #pragma comment(linker,"/EXPORT:SCardListReadersW=_SCardListReadersW_@16")
- #pragma comment(linker,"/EXPORT:SCardReconnect=_SCardReconnect_@20")
- #pragma comment(linker,"/EXPORT:SCardReleaseContext=_SCardReleaseContext_@4")
- #pragma comment(linker,"/EXPORT:SCardStatusA=_SCardStatusA_@28")
- #pragma comment(linker,"/EXPORT:SCardStatusW=_SCardStatusW_@28")
- #pragma comment(linker,"/EXPORT:SCardTransmit=_SCardTransmit_@28")
- #pragma comment(linker,"/EXPORT:SCardAccessStartedEvent=_SCardAccessStartedEvent_@0")
- #pragma comment(linker,"/EXPORT:SCardReleaseStartedEvent=_SCardReleaseStartedEvent_@0")
- #pragma comment(linker,"/EXPORT:g_rgSCardT1Pci=_g_rgSCardT1Pci_")
- #endif
- static const INT DummyHandle = 0x35313239;
- //static const CHAR READER_NAME_A[] = "Pseudo SmartCardReader\0";
- //static const WCHAR READER_NAME_W[] = L"Pseudo SmartCardReader\0";
- static const CHAR READER_NAME_A[] = "\アッカリ~ン/\0";
- static const WCHAR READER_NAME_W[] = L"\アッカリ~ン/\0";
- static HANDLE g_SCardStartedEvent_ = NULL;
- static BYTE pbIDBuffer[] = {0x00,0x07,0x78,0x1d,0x18,0xd3,0x60,0xc9,0x90,0x00};
- static const CHAR File[] = "winscard.id";
- BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
- {
- HANDLE Handle;
- DWORD Size;
- u16 id01,id23,id45,id67;
- Handle = CreateFileA(File, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
- if(Handle == (HANDLE)-1) // winscard.id file not found
- {
- srand(time(NULL) & 0xffff);
- srand(rand());
- id01 = 0x0007;
- id23 = rand();
- id45 = rand();
- id67 = id01 ^ id23 ^ id45;
- pbIDBuffer[0] = id01 >> 8;
- pbIDBuffer[1] = id01 & 0xff;
- pbIDBuffer[2] = id23 >> 8;
- pbIDBuffer[3] = id23 & 0xff;
- pbIDBuffer[4] = id45 >> 8;
- pbIDBuffer[5] = id45 & 0xff;
- pbIDBuffer[6] = id67 >> 8;
- pbIDBuffer[7] = id67 & 0xff;
- Handle=CreateFileA(File, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
- WriteFile(Handle, pbIDBuffer, 8, &Size, NULL);
- }
- else
- {
- ReadFile(Handle, pbIDBuffer, 8, &Size, NULL);
- }
- CloseHandle(Handle);
- if (fdwReason == DLL_PROCESS_ATTACH)
- {
- DisableThreadLibraryCalls(hinstDLL);
- g_SCardStartedEvent_ = CreateEvent(NULL, TRUE, TRUE, NULL);
- BCAS::Keys::RegisterAll();
- }
- else if (fdwReason == DLL_PROCESS_DETACH)
- {
- if (g_SCardStartedEvent_) CloseHandle(g_SCardStartedEvent_);
- }
- return TRUE;
- }
- extern "C"{
- LONG WINAPI SCardCancel_(SCARDCONTEXT)
- {
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardConnectA_(SCARDCONTEXT,LPCTSTR,DWORD,DWORD,LPSCARDHANDLE phCard,LPDWORD pdwActiveProtocol)
- {
- *phCard = (SCARDHANDLE)DummyHandle;
- *pdwActiveProtocol = SCARD_PROTOCOL_T1;
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardConnectW_(SCARDCONTEXT,LPCTSTR,DWORD,DWORD,LPSCARDHANDLE phCard,LPDWORD pdwActiveProtocol)
- {
- *phCard = (SCARDHANDLE)DummyHandle;
- *pdwActiveProtocol = SCARD_PROTOCOL_T1;
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardDisconnect_(SCARDHANDLE,DWORD)
- {
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardEstablishContext_(DWORD,LPCVOID,LPCVOID,LPSCARDCONTEXT phContext)
- {
- *phContext = (SCARDCONTEXT)DummyHandle;
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardFreeMemory_(SCARDCONTEXT,LPCVOID)
- {
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardGetStatusChangeA_(SCARDCONTEXT,DWORD dwTimeout,LPSCARD_READERSTATEA rgReaderStates,DWORD cReaders)
- {
- if (dwTimeout == 0 && cReaders == 1 && rgReaderStates->dwCurrentState == SCARD_STATE_UNAWARE)
- {
- rgReaderStates->dwEventState = SCARD_STATE_PRESENT;
- return SCARD_S_SUCCESS;
- }
- return SCARD_E_INVALID_PARAMETER;
- }
- LONG WINAPI SCardGetStatusChangeW_(SCARDCONTEXT,DWORD dwTimeout,LPSCARD_READERSTATEW rgReaderStates,DWORD cReaders)
- {
- if (dwTimeout == 0 && cReaders == 1 && rgReaderStates->dwCurrentState == SCARD_STATE_UNAWARE)
- {
- rgReaderStates->dwEventState = SCARD_STATE_PRESENT;
- return SCARD_S_SUCCESS;
- }
- return SCARD_E_INVALID_PARAMETER;
- }
- LONG WINAPI SCardIsValidContext_(SCARDCONTEXT hContext)
- {
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardListReadersA_(SCARDCONTEXT,LPCTSTR,LPSTR mszReaders,LPDWORD pcchReaders)
- {
- if (mszReaders)
- if (*pcchReaders == SCARD_AUTOALLOCATE)*(LPCSTR*)mszReaders = READER_NAME_A;
- else memcpy(mszReaders, READER_NAME_A, sizeof(READER_NAME_A));
- *pcchReaders = sizeof(READER_NAME_A) / sizeof(READER_NAME_A[0]);
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardListReadersW_(SCARDCONTEXT,LPCTSTR,LPWSTR mszReaders,LPDWORD pcchReaders)
- {
- if (mszReaders)
- if (*pcchReaders == SCARD_AUTOALLOCATE)*(LPCWSTR*)mszReaders = READER_NAME_W;
- else memcpy(mszReaders, READER_NAME_W, sizeof(READER_NAME_W));
- *pcchReaders = sizeof(READER_NAME_W) / sizeof(READER_NAME_W[0]);
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardReconnect_(SCARDHANDLE,DWORD,DWORD,DWORD,LPDWORD pdwActiveProtocol)
- {
- *pdwActiveProtocol = SCARD_PROTOCOL_T1;
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardReleaseContext_(SCARDCONTEXT)
- {
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardStatusA_(SCARDHANDLE hCard,LPSTR mszReaderNames,LPDWORD pcchReaderLen,LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen)
- {
- if (pcchReaderLen) {
- if (!mszReaderNames || *pcchReaderLen != SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
- for (*pcchReaderLen = 2; READER_NAME_A[*pcchReaderLen-2] || READER_NAME_A[*pcchReaderLen-1]; ++*pcchReaderLen);
- memcpy(mszReaderNames, READER_NAME_A, sizeof(READER_NAME_A));
- }
- *pdwState = SCARD_PRESENT;
- *pdwProtocol = SCARD_PROTOCOL_T1;
- if (pcbAtrLen) {
- if (*pcbAtrLen == SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
- *pcbAtrLen = 0;
- }
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardStatusW_(SCARDHANDLE hCard,LPWSTR mszReaderNames,LPDWORD pcchReaderLen,LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen)
- {
- if (pcchReaderLen) {
- if (!mszReaderNames || *pcchReaderLen != SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
- for (*pcchReaderLen = 2; READER_NAME_W[*pcchReaderLen-2] || READER_NAME_W[*pcchReaderLen-1]; ++*pcchReaderLen);
- memcpy(mszReaderNames, READER_NAME_W, sizeof(READER_NAME_W));
- }
- *pdwState = SCARD_PRESENT;
- *pdwProtocol = SCARD_PROTOCOL_T1;
- if (pcbAtrLen) {
- if (*pcbAtrLen == SCARD_AUTOALLOCATE) return SCARD_E_INVALID_PARAMETER;
- *pcbAtrLen = 0;
- }
- return SCARD_S_SUCCESS;
- }
- LONG WINAPI SCardTransmit_(SCARDHANDLE,LPCSCARD_IO_REQUEST,LPCBYTE pbSendBuffer,DWORD cbSendLength,LPSCARD_IO_REQUEST,LPBYTE pbRecvBuffer,LPDWORD pcbRecvLength)
- {
- HANDLE Handle;
- DWORD Size;
- u16 id01,id23,id45,id67;
- switch(pbSendBuffer[1])
- {
- case 0x30:{ // 90 30 00 00 00
- BYTE r[] = { // INT 初期設定条件
- 0x00,0x39,0x00,0x00,0x21,0x00,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x50,
- 0x36,0x31,0x04,0x66,0x4b,0x17,0xea,0x5c, 0x32,0xdf,0x9c,0xf5,0xc4,0xc3,0x6c,0x1b,
- 0xec,0x99,0x39,0x21,0x68,0x9d,0x4b,0xb7, 0xb7,0x4e,0x40,0x84,0x0d,0x2e,0x7d,0x98,
- 0xfe,0x27,0x19,0x99,0x19,0x69,0x09,0x11, 0x01,0x02,0x01,0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- memcpy(pbRecvBuffer+8,pbIDBuffer,6);
- *pcbRecvLength = sizeof r;
- break;}
- case 0x32:{ // 90 32 00 00 00
- BYTE r[] = { // IDI カードID 情報取得
- 0x00,0x0f,0x00,0x00,0x21,0x00,0x01,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- memcpy(pbRecvBuffer+9,pbIDBuffer,8);
- *pcbRecvLength=sizeof r;
- break;}
- case 0x34:{
- BYTE r[] = { // ECM 受信
- 0x00,0x15,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x90, 0x00};
- BCAS::Decoder::DecodeECM(pbSendBuffer+5,pbSendBuffer[4],r+6,NULL);
- memcpy(pbRecvBuffer,r,sizeof r);
- *pcbRecvLength = sizeof r;
- break;}
- case 0x3C:{ // ここから http://toro.2ch.net/test/read.cgi/avi/1337776912/6
- BYTE r[] = { // CHK 契約確認
- 0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- *pcbRecvLength = sizeof r;
- break;}
- case 0x80:{
- BYTE r[] = { // WUI 省電力通電制御情報要求
- 0x00,0x10,0x00,0x00,0xA1,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- *pcbRecvLength = sizeof r;
- break;} // ここまで
- case 0xB0:{ // 00 B0 00 20 00 00 08
- BYTE r[] = { // read ID (Tcard only)
- 0xff,0xf8,0x87,0xe2,0xe7,0x2c,0x9f,0x36, 0x90,0x00};
- Handle = CreateFileA(File, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
- {
- ReadFile(Handle, pbIDBuffer, 8, &Size, NULL);
- }
- CloseHandle(Handle);
- memcpy(pbRecvBuffer,pbIDBuffer,10);
- *(ULONGLONG *)pbRecvBuffer ^= 0xffffffffffffffff;
- *pcbRecvLength = sizeof r;
- break;}
- case 0xD6:{ // 00 D6 00 20 00 00 08
- BYTE r[] = { // update ID (Tcard only)
- 0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- memcpy(pbIDBuffer,pbSendBuffer+7,8);
- *(ULONGLONG *)pbIDBuffer ^= 0xffffffffffffffff;
- Handle = CreateFileA(File, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
- WriteFile(Handle, pbIDBuffer, 8, &Size, NULL);
- CloseHandle(Handle);
- *pcbRecvLength = sizeof r;
- break;}
- default:{
- BYTE r[] = {
- 0x00,0x04,0x00,0x00,0xa1,0xfe,0x90,0x00};
- memcpy(pbRecvBuffer,r,sizeof r);
- *pcbRecvLength = sizeof r;
- break;}
- }
- return SCARD_S_SUCCESS;
- }
- HANDLE WINAPI SCardAccessStartedEvent_(void) {return g_SCardStartedEvent_;}
- void WINAPI SCardReleaseStartedEvent_(void) {}
- SCARD_IO_REQUEST g_rgSCardT1Pci_ = {SCARD_PROTOCOL_T1, 8};
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement