2020-8-5 09:25 /

int main(int argc, char* argv[])
{
        if (argc != 2)
        {
                MessageBox(0, L"extNNN_spt.exe <input spt file>", L"AyamiKaze", 0);
                return -1;
        }
        char* FileName = argv[1];
        auto fp = fopen(FileName, "rb");
        fseek(fp, 0, SEEK_END);
        DWORD FileSize = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        DWORD DataSize = ((FileSize + 3) / 4);
        BYTE* FileBuff = (BYTE*)malloc(FileSize);
        if (!FileBuff)
                return E("Not buff, check if your alloc memory setting.");
        fread(FileBuff, FileSize, 1, fp);
        fclose(fp);

        //Not for all games here.
        for (int i = 0; i < FileSize; i++)
                FileBuff[i] ^= 0xFF;

        // Get valune name from offical code
        DWORD szOfHeaderTable = *(DWORD*)FileBuff;
        DWORD m_messageKosuu1 = *(DWORD*)(FileBuff + 0x10);
        DWORD m_messagePointer1 = *(DWORD*)(FileBuff + 0x14);
        DWORD m_messageKosuu2 = *(DWORD*)(FileBuff + 0x18);
        DWORD m_messagePointer2 = *(DWORD*)(FileBuff + 0x1C);
        DWORD m_storyKosuu = *(DWORD*)(FileBuff + 0x28);
        DWORD m_int32Pointer = *(DWORD*)(FileBuff + 0x48);

        DWORD m_subCallPointer = 0;
        DWORD m_selectPointer = 0;
        DWORD m_commandCallPointer = 0;
        DWORD m_scriptCallPointer = 0;
        /*
        newer version need it.
        if (szOfHeaderTable >= 0x20)
        {
                m_subCallPointer = *(DWORD*)(FileBuff + 0x50);
                m_selectPointer = *(DWORD*)(FileBuff + 0x54);
                m_commandCallPointer = *(DWORD*)(FileBuff + 0x58);
                m_scriptCallPointer = *(DWORD*)(FileBuff + 0x5C);
        }
        */
        string fn(FileName);
        fn += ".txt";
        ofstream LOG(fn);
        int hit = 0;
        for (DWORD ecx = 0; ecx < DataSize; )
        {
                DWORD ebx = *(DWORD*)(FileBuff + ecx * 4);
                DWORD identify = *(DWORD*)(FileBuff + ecx * 4 + 4);
                DWORD code = *(DWORD*)(FileBuff + ecx * 4 + 8);
                DWORD count = *(DWORD*)(FileBuff + ecx * 4 + 12);
                DWORD pos = *(DWORD*)(FileBuff + ecx * 4 + 16);

                if ((code == CODE_SYSTEMCOMMAND_PRINT) || (code == CODE_SYSTEMCOMMAND_LPRINT) ||
                        (code == CODE_SYSTEMCOMMAND_APPEND))
                {
                        LOG << (FileBuff + *(DWORD*)(FileBuff + (m_messagePointer1 + count) * 4) * 4) << endl;
                        hit++;
                }
                if (identify == IDENTIFY_SYSTEMCOMMAND)
                {
                        if (code == CODE_SYSTEMCOMMAND_SELECT)
                        {
                                for (int i = 0; i < count; i++)
                                {
                                        LOG << (FileBuff + *(DWORD*)(FileBuff + (m_messagePointer2 + pos + i) * 4) * 4) << endl;
                                }
                        }
                }

                ecx += ebx;
        }
        if (hit != m_messageKosuu1)
        {
                cout << "Find Sripts:0x" << hex << hit << endl;
                cout << "Should Scripts:0x" << hex << m_messageKosuu1 << endl;
                return E("hit != m_messageKosuu1");
        }
        return End();
}
Tags: SystemNNN