[C++] İki Aşamalı Pack Güvenliği (İlk aşama)

Kaiser

⋞ 〈 ☪ 〉 ⋟
Site yetkilisi
Admin
Premium Üye
Geliştirici
Yardımsever Üye
Mesaj
3.695
Çözümler
345
Beğeni
3.585
Puan
1.849
Ticaret Puanı
0
Merhaba, zaman zaman böyle bir olayın varlığını duyuyordum. Aklıma böyle bir çözüm üretmek geldi. Yaptığım testlerde şimdiye kadar herhangi bir sorun yaşamadım.

Olaydan kısaca bahsetmek gerekirse; oyun açıkken bazı pack dosyaları açılıp düzenlenebiliyor. Bu durum bazı istisnai durumlarda sorun teşkil edebilir.
Çoğu zaman cache sebebiyle yapılan değişiklikler client resetlenmediği sürece oyuna yansımayabiliyor fakat yinede bu durumu engellemenin zararı olmaz diye düşündüm.
Ek olarak; günümüzde zaten foxfs vb. yöntemler kullanılmaktadır, dolayısıyla bunu oyununuz için ek güvenlik olarak da düşünebilirsiniz.

Kodlar tamamen geliştirmeye ve özelleştirmeye açık bir yapıdadır, istediğiniz doğrultuda ilerletebilirsiniz.
Bu yöntemin autopatcher ile beraber daha sağlıklı çalışacağını belirtmeliyim. Yani burada sizlere de iş düşüyor, benim burada paylaştığım kodlar bu sistemin ilk aşamasıdır. Bu kodlara bağlı olarak autopatcherda yapacağınız gerekli düzenlemeler ise ikinci aşama olacak.

Çalışma mantığından örnek vermek gerekirse; x adlı pack dosyası düzenlendiği anda oyun tamamen kapanacak, ve tekrar açılırken autopatcher(dosya bütünlüğü özelliği vb. mevcutsa) bu düzenlenmiş pack dosyanın yerine orjinalini indirecek ve orjinal dosyadan giriş yapılmasını sağlayacak.
Tekrar aynı şekilde pack dosyalarına müdahele söz konusu olursa bu işlemler otomatik tekrarlanacak. (Bu benim önerdiğim fikirdir, isteyenler istediği şekilde kullanabilir.)

Şimdi konuya geçelim..
Düzenlemeden önceki halini gösteren kısa bir video:



EterPack/EterPackManager.h açın ve #include listesine ekleyin:
C++:
#include "../UserInterface/Locale_inc.h"

Şu fonksiyonu bulun:
C++:
const char * GetRootPackFileName();

Altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
        void StorePackFile(std::string szFileName);
        bool CheckPackFile();
        struct PackFileInfo
        {
            std::string filename;
            size_t size;
        };
        std::vector<PackFileInfo> fileInfoVec;
#endif

EterPackManager.cpp açın ve #include listesine ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
#include <fstream>
#endif

Şu kısmı bulun ( CEterPackManager::RegisterPack fonksiyonu içinde) :
C++:
            if (pEterPack->Create(m_FileDict, c_szName, c_szDirectory, bReadOnly, c_pbIV))
            {
                m_PackMap.insert(TEterPackMap::value_type(c_szName, pEterPack));
            }

m_PackMap.insert satırının altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
                std::string pFile = std::string(c_szName) + ".eix";
                StorePackFile(pFile);
#endif

Daha sonra RegisterPack fonksiyonunun altına ekleyin:

C++:
#ifdef ENABLE_PACK_SECURITY
void CEterPackManager::StorePackFile(std::string szFileName)
{
    std::ifstream fileStream(szFileName, std::ios::binary | std::ios::ate);

    if (fileStream.is_open())
    {
        size_t fileInf_t = fileStream.tellg();
        fileStream.close();

        PackFileInfo info;
        info.filename = szFileName;
        info.size = fileInf_t;
        fileInfoVec.push_back(info);
#ifdef _DEBUG
        TraceError("OKUNDU : %s", szFileName.c_str());
#endif
    }
    else
    {
#ifdef _DEBUG
        TraceError("HATA! - OKUNAMADI : %s", szFileName.c_str());
#endif
        /****************************************
        Dusuk bir ihtimal de olsa eger bu hata alindiysa calismiyor ve bu haliyle calismayacak demektir. Calismamasi oyunu etkilemeyecektir.
        Lutfen yapilan islemleri, kodlari ve pack uyumlulugunu gozden gecirin.
        Hatayi almaya devam ederseniz veya sebebini bulamadiysaniz kodları tamamen kaldirin.
        *****************************************/
        TraceError("EterPackManager::StorePackFile - ERROR! (0x003)");
        TraceError("");
        TraceError("<< Lutfen bu hatayi yoneticiye bildirin. >>");
        // return;
    }
}
bool CEterPackManager::CheckPackFile()
{
    for (const auto& storedFile : fileInfoVec)
    {
        size_t currentSize = GetFileSize(storedFile.filename.c_str());
        if (currentSize != storedFile.size)
        {
            TraceError("Kritik islem tespit edildi!");
            return false;
        }
    }
    return true;
}
#endif

Son olarak UserInterface/PythonApplication.cpp içinde şu kısmı bulun:
C++:
void CPythonApplication::RenderGame()
{

Parantezin altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
    bool t = CEterPackManager::Instance().CheckPackFile();
    if (!t)
    {
        CEterPackManager::Instance().fileInfoVec.clear();
        Abort();
    }
#endif

Düzenleme sonrasını gösteren video ise aşağıdadır:


Meraklısına; Kodlar client açılırken sadece bir defa çalışır ve oyun(client) açık olduğu sürece sadece pack dosyalarının takibini yapar. Yani ışınlanma,karakter atma gibi durumlarda tekrar tekrar çalışmaz.
 
O değil`de grafikler halis mi ?
 
burda nasıl bir kontrolden bahsediliyor neyi kontrol ediyor.
eix epk kontrol ediyorsa gerek yok bence bu sisteme
 
burda nasıl bir kontrolden bahsediliyor neyi kontrol ediyor.
eix epk kontrol ediyorsa gerek yok bence bu sisteme
1709441936285.png
 
Geri
Üst