السلام عليكم ورحمة الله وبركاته ،،
نكمل موضوعنا بخصوص إغلاق الثغرات
1- إغلاق ثغرة التدبيل بشكل نهائي في كل من التفعيلاتالأحبالالجرع
قم بفتح ملف char_item.cpp وأضف فيه الآتي :
والأن قم بالبحث عن (3 مرات) :
أضف بعدها :
قم بالبحث عن (مرتين) :
أضف بعدها :
قم بالبحث عن :
أضف بعدها :
والأن قم بفتح ملف char.h وأبحث عن :
أضف فوقها :
قم بفتح ملف i*nput_login.cpp
وقم بالبحث عن :
أضف بعدها :
تمت
2- إصلاح علاوة إستعادة نقاط الحياةالأسلوب
قم بفتح ملف char_battle.cpp
قم بالبحث عن :
استبدلها بـ :
3- إصلاح ثغرة الأسم الطويل من السورس
قم بفتح ملف i*nput_login.cpp وقم بالبحث عن :
أضف بعدها :
4- إصلاح ثغرة حقن تخص DBManager
قم بفتح ملف db.cpp وقم بإستبدال دالتي :
بالآتي :
5- إصلاح Game Core بسبب أمر GetQuestFlag
قم بفتح ملف char.cpp وقم بالبحث عن :
أضف فوقها :
6- إغلاق ثغرة تغيير الإمبراطورية أثناء الوجود في مجموعة
قم بفتح ملف questlua_pc.cpp وقم بالبحث عن :
أضف فوقها :
7- منع قتل اللاعبين أثناء فتحهم لمتاجر خاصة
قم بفتح ملف battle.cpp وقم بالبحث عن :
أضف بعدها :
قم بفتح ملف char_battle.cpp
قم بالبحث عن :
أضف بعدها :
8- إصلاح Game Core بسبب المجموعة
قم بفتح ملف party.cpp وقم بالبحث عن دالة :
استبدلها كاملةً بـ :
9- إغلاق ثغرة إلتقاط العتاد في المجموعة
قم بالبحث عن :
أضف بعدها :
10- إغلاق ثغرة إرتداء نفس البند مرتين
قم بفتح ملف char_item.cpp
قم بالبحث عن دالة :
بنهاية الدالة قبل return true;
أضف الآتي :
طبعا بإمكانك إزالة جميع شروط #ifdef وجعلها أساسية لملفاتك لكن قمت بوضعها إحتياطاً - وإن أردت تعطيلها فقط بوضع علامتي // قبل الdefine#
11- إصلاح خطأ دالة pc.select_vid (قد تتسبب في مشاكل ربما منها Game Core)
قم فتح ملف questlua_pc.cpp وقم بالبحث عن :
استبدلها بـ :
نكتفي بهذا القدر ،،
كل الود ،،
والسلام خير ختام ~
نكمل موضوعنا بخصوص إغلاق الثغرات
1- إغلاق ثغرة التدبيل بشكل نهائي في كل من التفعيلاتالأحبالالجرع
قم بفتح ملف char_item.cpp وأضف فيه الآتي :
bool CHARACTER::CheckTimeUsed(LPITEM item)
{
switch (item->GetVnum())
{
case 50821: case 50822: case 50823: case 50824: case 50825: case 50826: case 50827: case 50828: case 20171: case 20172:
case 27866: case 27868: case 27870: case 27873: case 39026: case 50093: case 50094:
case 50123: case 50801: case 50802: case 50817: case 50818: case 50819: case 50820:
case 39010: case 39017: case 39018: case 39019: case 39020: case 39024: case 39025:
case 39031: case 50813: case 50814: case 71014: case 71015: case 71016: case 71017:
case 71027: case 71028: case 71029: case 71030: case 71034: case 71044: case 71045:
case 71101: case 71102: case 71153: case 71154: case 71155: case 71156: case 72025:
case 72026: case 72027: case 72031: case 72032: case 72033: case 72034: case 72035:
case 72036: case 72037: case 72038: case 72039: case 72040: case 72041: case 72042:
case 72046: case 72047: case 72048: case 72312: case 72313: case 72501: case 72502:
case 76003: case 76017: case 76018: case 27126: case 27127: case 27128: case 27129:
case 27130: case 27131: case 27132: case 27133:
int pGetTime[] = {5};
int pGetFlag = GetQuestFlag("item.last_time");
if (pGetFlag)
{
if (get_global_time() < pGetFlag + pGetTime[0])
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you have to wait %u seconds before use %s again."), pGetTime[0], item->GetName());
return false;
}
}
break;
}
return true;
}
والأن قم بالبحث عن (3 مرات) :
case USE_ABILITY_UP:
{
أضف بعدها :
if ((CheckTimeUsed(item) == false))
{
return false;
}
قم بالبحث عن (مرتين) :
case USE_AFFECT :
{
أضف بعدها :
if ((CheckTimeUsed(item) == false))
{
return false;
}
قم بالبحث عن :
case ITEM_BLEND:
أضف بعدها :
if ((CheckTimeUsed(item) == false))
{
return false;
}
والأن قم بفتح ملف char.h وأبحث عن :
void SetName(const std::string& name) { m_stName = name; }أضف فوقها :
bool CheckTimeUsed(LPITEM item);
قم بفتح ملف i*nput_login.cpp
وقم بالبحث عن :
ch->StartCheckSpeedHackEvent();
أضف بعدها :
ch->SetQuestFlag("item.last_time", get_global_time());تمت
2- إصلاح علاوة إستعادة نقاط الحياةالأسلوب
قم بفتح ملف char_battle.cpp
قم بالبحث عن :
if (pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) && number(0, 4) > 0) // 80% 확률
{
int i = ((iCurHP>=0)?MIN(dam, iCurHP):dam) * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100; //@fixme107
if (i)
{
CreateFly(FLY_HP_SMALL, pAttacker);
pAttacker->PointChange(POINT_HP, i);
}
}
// 칠 때마다 SP회복
if (pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) && number(0, 4) > 0) // 80% 확률
{
int i = ((iCurHP>=0)?MIN(dam, iCurHP):dam) * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100; //@fixme107
if (i)
{
CreateFly(FLY_SP_SMALL, pAttacker);
pAttacker->PointChange(POINT_SP, i);
}
}
استبدلها بـ :
int iAbsoHP_ptr = pAttacker->GetPoint(POINT_HIT_HP_RECOVERY);
if (iAbsoHP_ptr)
{
if (number(1, 100) <= iAbsoHP_ptr)
{
int iHPAbso = MIN(dam, iCurHP) * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100;
if ((pAttacker->GetHP() > 0) && (pAttacker->GetHP() + iHPAbso < pAttacker->GetMaxHP()) && (GetHP() > 0) && (iHPAbso > 0))
{
CreateFly(FLY_HP_SMALL, pAttacker);
pAttacker->PointChange(POINT_HP, iHPAbso);
}
}
}
// ?¥ ¶§¸¶´? SP?¸?¹
int iAbsoSP_ptr = pAttacker->GetPoint(POINT_HIT_SP_RECOVERY);
if (iAbsoSP_ptr)
{
if (number(1, 100) <= iAbsoSP_ptr)
{
int iSPAbso = MIN(dam, iCurSP) * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100;
if ((pAttacker->GetSP() > 0) && (pAttacker->GetSP() + iSPAbso < pAttacker->GetMaxSP()) && (GetSP() > 0) && (iSPAbso > 0))
{
CreateFly(FLY_SP_SMALL, pAttacker);
pAttacker->PointChange(POINT_SP, iSPAbso);
}
}
}
3- إصلاح ثغرة الأسم الطويل من السورس
قم بفتح ملف i*nput_login.cpp وقم بالبحث عن :
packFailure.header = HEADER_GC_CHARACTER_CREATE_FAILURE;
أضف بعدها :
if (strlen(pinfo->name) > 12)
{
d->Packet(&packFailure, sizeof(packFailure));
return;
}
4- إصلاح ثغرة حقن تخص DBManager
قم بفتح ملف db.cpp وقم بإستبدال دالتي :
void DBManager::Query(const char * c_pszFormat, ...)
{
الكود هنا ..
}
SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...)
{
الكود هنا
}
بالآتي :
void DBManager::Query(const char * c_pszFormat, ...)
{
char szQuery[4096];
va_list args;
va_start(args, c_pszFormat);
vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args);
va_end(args);
std::string sQuery(szQuery);
m_sql.AsyncQuery(sQuery.substr(0, sQuery.find_first_of(";") == std::string::npos ? sQuery.length() : sQuery.find_first_of(";")).c_str());
}
SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...)
{
char szQuery[4096];
va_list args;
va_start(args, c_pszFormat);
vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args);
va_end(args);
std::string sQuery(szQuery);
return m_sql_direct.DirectQuery(sQuery.substr(0, sQuery.find_first_of(";") == std::string::npos ? sQuery.length() : sQuery.find_first_of(";")).c_str());
}
5- إصلاح Game Core بسبب أمر GetQuestFlag
قم بفتح ملف char.cpp وقم بالبحث عن :
return pPC->GetFlag(flag);
أضف فوقها :
if(!pPC)
{
sys_err("Nullpointer in CHARACTER::GetQuestFlag %lu", GetPlayerID());
return 0;
}
6- إغلاق ثغرة تغيير الإمبراطورية أثناء الوجود في مجموعة
قم بفتح ملف questlua_pc.cpp وقم بالبحث عن :
lua_pushnumber(L, ch->ChangeEmpire((unsigned char)lua_tonumber(L, 1)));
أضف فوقها :
if(ch->GetParty())
{
lua_pushnumber(L, 4);
return 0;
}
7- منع قتل اللاعبين أثناء فتحهم لمتاجر خاصة
قم بفتح ملف battle.cpp وقم بالبحث عن :
if (victim->IsDead())
return false;
أضف بعدها :
if (victim->GetMyShop())
return false;
قم بفتح ملف char_battle.cpp
قم بالبحث عن :
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)
{
أضف بعدها :
if (pkVictim->GetMyShop())
return false;
8- إصلاح Game Core بسبب المجموعة
قم بفتح ملف party.cpp وقم بالبحث عن دالة :
void CParty::UpdateOfflineState(DWORD dwPID)
{
محتوى الدالة هنا ..
}
استبدلها كاملةً بـ :
void CParty::UpdateOfflineState(DWORD dwPID)
{
//const TMember& r = m_memberMap[dwPID];
TPacketGCPartyAdd p;
p.header = HEADER_GC_PARTY_ADD;
p.pid = dwPID;
memset(p.name, 0, CHARACTER_NAME_MAX_LEN + 1);
for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it)
{
if (it->second.pCharacter && it->second.pCharacter->GetDesc())
{
if (it->second.pCharacter->GetDungeon())
it->second.pCharacter->GetDungeon()->ExitAllToStartPosition();
else
it->second.pCharacter->GetDesc()->Packet(&p, sizeof(p));
}
}
}
9- إغلاق ثغرة إلتقاط العتاد في المجموعة
قم بالبحث عن :
if (!owner)
return false;
أضف بعدها :
if (owner)
{
if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
{
BYTE bCount = item->GetCount();
for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
{
LPITEM item2 = owner->GetInventoryItem(i);
if (!item2)
continue;
if (item2->GetVnum() == item->GetVnum())
{
int j;
for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
if (item2->GetSocket(j) != item->GetSocket(j))
break;
if (j != ITEM_SOCKET_MAX_NUM)
continue;
BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
bCount -= bCount2;
item2->SetCount(item2->GetCount() + bCount2);
if (bCount == 0)
{
owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Player: %s Has %s"), GetName(), item2->GetName());
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Player: %s Has %s"), owner->GetName(), item2->GetName());
M2_DESTROY_ITEM(item);
if (item2->GetType() == ITEM_QUEST)
quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
return true;
}
}
}
item->SetCount(bCount);
}
}
10- إغلاق ثغرة إرتداء نفس البند مرتين
قم بفتح ملف char_item.cpp
قم بالبحث عن دالة :
bool CHARACTER::CanEquipNow(const LPITEM item, const TItemPos& srcCell, const TItemPos& destCell)
بنهاية الدالة قبل return true;
أضف الآتي :
#define ENABLE_ITEM_RING_FIX /* تعريف الإصلاح */
#ifdef ENABLE_ITEM_RING_FIX
if (item->GetType() == ITEM_RING)
{
LPITEM ring1 = GetWear(WEAR_RING1);
LPITEM ring2 = GetWear(WEAR_RING2);
if (ring1 && (ring1->GetVnum() == item->GetVnum()))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 유니크 아이템 두 개를 동시에 장착할 수 없습니다."));
return false;
}
if (ring2 && (ring2->GetVnum() == item->GetVnum()))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 유니크 아이템 두 개를 동시에 장착할 수 없습니다."));
return false;
}
}
#endif
#define ENABLE_COSTUEM_WEAPON_FIXES // تفعيل الإصلاح
#ifdef ENABLE_COSTUEM_WEAPON_FIXES
#ifdef ENABLE_WEAPON_COSTUME_SYSTEM /* إن كان لديك أزياء الأسلحة */
#ifdef ENABLE_NEW_ARROW_SYSTEM /* إن كان لديك جعبة الأسهم */
if (item->GetType() == ITEM_WEAPON && item->GetSubType() != WEAPON_ARROW && item->GetSubType() != WEAPON_UNLIMITED_ARROW)
#else
if (item->GetType() == ITEM_WEAPON && item->GetSubType() != WEAPON_ARROW)
#endif
{
LPITEM pkItem = GetWear(WEAR_COSTUME_WEAPON);
if (pkItem)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("For can do this unwear the costume weapon."));
return false;
}
}
else if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_WEAPON)
{
LPITEM pkItem = GetWear(WEAR_WEAPON);
if (!pkItem)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't wear a costume weapon without have a weapon weared."));
return false;
}
else if (item->GetValue(3) != pkItem->GetSubType())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't wear a costume weapon who has different type of your weapon."));
return false;
}
else if (pkItem->GetType() == ITEM_ROD || pkItem->GetType() == ITEM_PICK)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("kazma_veya_olta_takili"));
return false;
}
}
if (item->GetType() == ITEM_ROD || item->GetType() == ITEM_PICK)
{
LPITEM pkItem = GetWear(WEAR_COSTUME_WEAPON);
if (pkItem)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("For can do this unwear the costume weapon."));
return false;
}
}
#endif
#endif
#define ENABLE_WEDDING_SUIT_FIX
#ifdef ENABLE_WEDDING_SUIT_FIX /* إغلاق ثغرة إرتداء أزياء فوق بدلات العرس */
if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_BODY)
{
LPITEM atakanxd = GetWear(WEAR_BODY);
if (atakanxd && (atakanxd->GetVnum() >= 11901 && atakanxd->GetVnum() <= 11914))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you can't wear costume body on wedding suit."));
return false;
}
}
if (item->GetVnum() >= 11901 && item->GetVnum() <= 11914)
{
LPITEM atakan = GetWear(WEAR_COSTUME_BODY);
if (atakan && (atakan->GetType() == ITEM_COSTUME && atakan->GetSubType() == COSTUME_BODY))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you can't wear wedding suit on costume body."));
return false;
}
}
#endif
طبعا بإمكانك إزالة جميع شروط #ifdef وجعلها أساسية لملفاتك لكن قمت بوضعها إحتياطاً - وإن أردت تعطيلها فقط بوضع علامتي // قبل الdefine#
11- إصلاح خطأ دالة pc.select_vid (قد تتسبب في مشاكل ربما منها Game Core)
قم فتح ملف questlua_pc.cpp وقم بالبحث عن :
lua_pushnumber(L, (DWORD)ch->GetVID());
استبدلها بـ :
lua_pushnumber(L, ch ? (DWORD)ch->GetVID() : 0); // return 0 if no player exist
نكتفي بهذا القدر ،،
كل الود ،،
والسلام خير ختام ~