Oto Pack Dışından Oyuna Girişi Engelleme

Whistle

Admin
Kurucu
Süper Üye
Geliştirici
Yardımsever Üye
Mesaj
12.283
Çözümler
583
Beğeni
9.563
Puan
8.781
Ticaret Puanı
3
Oyunumuzu sürekli güncel tutmak ve hilelere karşı bir nebze olsun savunma kalkanı oluşturmak için oto pack kullanırız. Oto pack sayesinde oyunculara son güncellemeleri zoraki olarak gönderebilirsiniz. Otopack yapımıyla ilgili daha detaylı bilgiyi bu sayfadan edinebilirsiniz.

Tabii ki sadece oto pack yapmakla iş bitmiyor. Sunucu güvenliği için uygulanması gereken bir sürü adımlarda bulunuyor. Daha önce oluşturduğum şu Sunucu Güvenliği İçin Config Dosyasına Eklememiz Gerekenler rehber konusuna bakabilirsiniz.

Ne yazık ki oto pack devredışı bırakılarak normal istemciden oyuna giriş yapılabiliyor. Bu konumuzda ise bunu engellemeyi göstereceğim. Daha önceden çok soran kişi vardı. En sonunda da bir şirket sahibinden bu meseleyle ilgili bana soru geldiği için bu konuyu açmaya karar verdim.

Fazla konuyu uzatmadan anlatıma başlayalım. :)

1. Anlatım: Novaline Client kullananlar için.
Novaline client dosyasında zaten oto pack dışında girişi engellemek için eklenmiş bir kod var.
Client/UserInterface/UserInterface.cpp dosyasını açın ve aratın;
C++:
Genişlet Daralt Kopyala
    if (strstr(lpCmdLine, NEEDED_COMMAND_ARGUMENT) == 0) {
        MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
            goto Clean;
    }

Fakat bu kod varsayılan olarak devredışı olacaktır. Aktif etmek için NEEDED_COMMAND_ARGUMENT makrosunu locale_inc.h dosyasına ekliyoruz.
Örnek;
C++:
Genişlet Daralt Kopyala
#define    NEEDED_COMMAND_ARGUMENT "#!whistle*/5556#c2!!"

Daha sonra Client/UserInterface/UserInterface.rc dosyasını açın ve aratın;
C++:
Genişlet Daralt Kopyala
    IDS_ERR_MUST_LAUNCH_FROM_PATCHER "Please run patcher."

Şu şekilde değiştiriniz
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


Daha sonra client soureyi build ediniz.

Şimdi sıra geldi belirlediğimiz şifreyi oto packa tanımlamaya. Eğer oto pack düzenlemelerini bilmiyorsanız buraya bakabilirsiniz.
skin.xml dosyasını açın ve aratın;
XML:
Genişlet Daralt Kopyala
<control type="button" id="START" image="btn_start_1" x="818" y="612" enable_on_complete="true" />


Değiştiriniz;
XML:
Genişlet Daralt Kopyala
<control type="button" id="START" image="btn_start_1" x="818" y="612" exec_path="casro2client.bin" exec_args="#!whistle*/5556#c2!!" enable_on_complete="true" />
Not: path ve args kısmını kendinize göre düzenleyiniz.

Daha sonra oto packı tekrardan paketleyiniz.


2. Anlatım: Diğer
İlk önce Client/UserInteface/UserInterface.cpp dosyasını açın ve aratın;
C++:
Genişlet Daralt Kopyala
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

Altına ekleyin;
C++:
Genişlet Daralt Kopyala
#ifndef _DEBUG
    // oto packsiz giris engeli
    if (strstr(lpCmdLine, "#!whistle*/5556#c2!!") == 0)
    {
        MessageBox(NULL, "Casro2 Patcherdan giris yapiniz.", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
        return 0;
    }
#endif
(debug modu hariç diğerleri ile build ettiğinizde oto pack dışında girişi engeller.)

Şimdi sıra geldi belirlediğimiz şifreyi oto packa tanımlamaya. Eğer oto pack düzenlemelerini bilmiyorsanız buraya bakabilirsiniz.
skin.xml dosyasını açın ve aratın;
XML:
Genişlet Daralt Kopyala
<control type="button" id="START" image="btn_start_1" x="818" y="612" enable_on_complete="true" />


Değiştiriniz;
XML:
Genişlet Daralt Kopyala
<control type="button" id="START" image="btn_start_1" x="818" y="612" exec_path="casro2client.bin" exec_args="#!whistle*/5556#c2!!" enable_on_complete="true" />
Not: path ve args kısmını kendinize göre düzenleyiniz.

Daha sonra oto packı tekrardan paketleyiniz.

İşini iyi bilen kişiler bu engeli aşabilir. Yine de büyük oranda koruma sağlayacaktır.

Kanıt;
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.
 
Son düzenleme:
Paylaşım için teşekkürler , direk otopack çalıştırma olabilir mi?
yani bin dosyasını exeye çevirdiler exeye tıklayınca direk otopacki çalıştırsın yoksada indirme linki açsın gibi...
 
Sevgili @Whistle novaline clientte dediklerini aynen uygulayıp exe girişini engelledim. Otopacktanda skin.xml editleyip kapattıp ama otopacktanda oyuna girmiyor? Sence nerde hata yapıyorum?
 
Sevgili @Whistle novaline clientte dediklerini aynen uygulayıp exe girişini engelledim. Otopacktanda skin.xml editleyip kapattıp ama otopacktanda oyuna girmiyor? Sence nerde hata yapıyorum?
Konuda anlatılanları tekrardan uygulayın. Oyuna girmiyor derken hiç mi açılmıyor yoksa hata mı veriyor
 
Konuda anlatılanları tekrardan uygulayın. Oyuna girmiyor derken hiç mi açılmıyor yoksa hata mı veriyor
3 Defa uyguladım ancak sonuç aynı. Exeden giriş yaparken verilen hatayı veriyor. Metin2 yi başlatmak için yamayı kullan şeklinde. Ben şifrede başka özel karakterlerde kullandım onunla alakası olabilir mi ?
 
Olabilir, belki desteklenmeyen bir şey vardır. Konudaki ile aynısını kullanıp deneyebilir misin?
 
Merhaba. Bu şekilde yaptığımızda oyuncu patcher’ı winrar ile açıp skin.xmlden argümanı öğrenip clienti açamaz mı?
 
@Whistle Nova Client kullanmıyorum bu nedenle 2. olan Diğer anlatımdan yola çıkıyorum ancak tanımlama olmadığı için hata veriyor bu konuda destek olur musun ?


1765141639287.webp
 
@Whistle Nova Client kullanmıyorum bu nedenle 2. olan Diğer anlatımdan yola çıkıyorum ancak tanımlama olmadığı için hata veriyor bu konuda destek olur musun ?


27354 eklentisini görüntüle
UserInterface.cpp 'de const std::string& ApplicationStringTable_GetString {} bu kod bloğunu altına kodu ekleyin;
C++:
Genişlet Daralt Kopyala
const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
{
    return ApplicationStringTable_GetString(dwID, szKey).c_str();
}
 
UserInterface.cpp 'de const std::string& ApplicationStringTable_GetString {} bu kod bloğunu altına kodu ekleyin;
C++:
Genişlet Daralt Kopyala
const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
{
    return ApplicationStringTable_GetString(dwID, szKey).c_str();
}
Teşekkür ederim deneyip bilgi vericem baştacısın
 
UserInterface.cpp 'de const std::string& ApplicationStringTable_GetString {} bu kod bloğunu altına kodu ekleyin;
C++:
Genişlet Daralt Kopyala
const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
{
    return ApplicationStringTable_GetString(dwID, szKey).c_str();
}
Merhabalar, şimdi deneme fırsatım gece saat çok geçti deneyemedim. UserInterface.cpp içerisinde ilettiğiniz kodu aratıyorum ancak ne yazıkki mevcut değil. Nasıl ilerlemeliyim ?


1765192710560.webp
 
Hepsi eksik o zaman sizin clientte. Aşağıda verdiğim kodların hepsini bool CheckPythonLibraryFilenames() {} kod bloğundan sonra ekleyin

C++:
Genişlet Daralt Kopyala
struct ApplicationStringTable
{
    HINSTANCE m_hInstance;
    std::map<DWORD, std::string> m_kMap_dwID_stLocale;
} gs_kAppStrTable;

void ApplicationStringTable_Initialize(HINSTANCE hInstance)
{
    gs_kAppStrTable.m_hInstance=hInstance;
}

const std::string& ApplicationStringTable_GetString(DWORD dwID, LPCSTR szKey)
{
    char szBuffer[512];
    char szIniFileName[256];
    char szLocale[256];

    ::GetCurrentDirectory(sizeof(szIniFileName), szIniFileName);
    if(szIniFileName[lstrlen(szIniFileName)-1] != '\\')
        strcat(szIniFileName, "\\");
    strcat(szIniFileName, "metin2client.dat");

    strcpy(szLocale, LocaleService_GetLocalePath());
    if(strnicmp(szLocale, "locale/", strlen("locale/")) == 0)
        strcpy(szLocale, LocaleService_GetLocalePath() + strlen("locale/"));
    ::GetPrivateProfileString(szLocale, szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
    if(szBuffer[0] == '\0')
        LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
    if(szBuffer[0] == '\0')
        ::GetPrivateProfileString("en", szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
    if(szBuffer[0] == '\0')
        strcpy(szBuffer, szKey);

    std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
    rstLocale=szBuffer;

    return rstLocale;
}

const std::string& ApplicationStringTable_GetString(DWORD dwID)
{
    char szBuffer[512];

    LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
    std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
    rstLocale=szBuffer;

    return rstLocale;
}

const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
{
    return ApplicationStringTable_GetString(dwID, szKey).c_str();
}

const char* ApplicationStringTable_GetStringz(DWORD dwID)
{
    return ApplicationStringTable_GetString(dwID).c_str();
}
 
Geri
Üst