Code:
#include "stdafx.h"
md5wrapper md5;
char* WaytoCustomz = "Data\\LeGrandCustom\\";
char* CustomzFolder = "LeGrandCustom\\";
int Flag = 2;
// -------------------------------------------------------------------------------------------------------------------------------------------------
void SetNop(DWORD dwOffset,int Size)
{
for(int n=0;n<Size;n++)
*(BYTE*)(dwOffset+n) = 0x90;
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
void HookThis(DWORD dwMyFuncOffset,DWORD dwJmpOffset)
{
*(DWORD*)(dwJmpOffset+1) = dwMyFuncOffset-(dwJmpOffset+5);
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
void LoadThisFuckingModelByITEMID(int ItemID,char* ModelName,char* FolderFrom,char* WayFrom)
{
_asm
{
PUSH -1
PUSH ModelName
PUSH WayFrom
PUSH ItemID
mov eax,BMDModelLoad
CALL eax
PUSH 1
PUSH 0x2600
PUSH 0x2901
PUSH FolderFrom ; |Arg2 = 0090175C ASCII "Item\"
PUSH ItemID ; |Arg1 = 00001FF1
mov eax,OpenTexture
CALL eax
}
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
__declspec(naked) void PatchMainForLoadModels()
{
LoadThisFuckingModelByITEMID(ITEM_IN_MAIN(14,181),"BlueJewel",CustomzFolder,WaytoCustomz);
LoadThisFuckingModelByITEMID(ITEM_IN_MAIN(14,182),"BlackJewel",CustomzFolder,WaytoCustomz);
LoadThisFuckingModelByITEMID(ITEM_IN_MAIN(14,183),"RedJewel",CustomzFolder,WaytoCustomz);
LoadThisFuckingModelByITEMID(ITEM_IN_MAIN(14,184),"GreenJewel",CustomzFolder,WaytoCustomz);
_asm
{
PUSH -1 ; /Arg4 = FFFFFFFF
PUSH 0x0093693C ; |Arg3 = 00900014 ASCII "suho"
PUSH 0x00936944 ; |Arg2 = 0090001C ASCII "Data\Item\"
PUSH 0x1F96 ; |Arg1 = 00001F84
mov eax,BMDModelLoad
CALL eax ; \Main_Ins.005F1BC3
ADD ESP,0x10
mov eax,ReturnOffset
JMP eax
}
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
__declspec(naked) void JewelsSwitcher()
{
DWORD Variable;
_asm
{
mov edx,DWORD PTR SS:[EBP-0x14]
MOVSX EAX,WORD PTR DS:[EDX]
mov Variable,eax
}
if(Variable != 7181 && Variable != 7182 && Variable != 7184 && Variable != 7210 && Variable != 7211 && Variable != 7212 && Variable != 7349 && Variable != 7350 && Variable != 7351 && Variable != 7352)
{
_asm
{
mov eax,JewelsSwitcher_True
jmp eax
}
}
else
{
_asm
{
mov eax,JewelsSwitcher_False
jmp eax
}
}
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
void Init()
{
DWORD OldProtect;
if(VirtualProtect(LPVOID(0x401000),VirtualAddressOffset,PAGE_EXECUTE_READWRITE,&OldProtect))
{
FixLangAndFont();
DataJMP ModelJMP;
SetNop(LoadModel_Offset,25);
ModelJMP.Command=0xE9;
ModelJMP.PointerToFunc=(DWORD)&PatchMainForLoadModels;
memcpy((int*)LoadModel_Offset,&ModelJMP,sizeof(ModelJMP));
HookThis((DWORD)&PatchMainForLoadModels,LoadModel_Offset);
//Patch Jewels
DataJMP JewelsJMP;
SetNop(PatchJewelsOffset,86);
JewelsJMP.Command=0xE9;
JewelsJMP.PointerToFunc=(DWORD)&JewelsSwitcher;
memcpy((int*)PatchJewelsOffset,&JewelsJMP,sizeof(DataJMP));
HookThis((DWORD)&JewelsSwitcher,PatchJewelsOffset);
BYTE JMPProto1[] = { 0xE9, 0x44, 0x30, 0x29, 0x00 };
memcpy((int*)0x00660F83,JMPProto1,sizeof(JMPProto1));
BYTE CallProto1[] = { 0xFF, 0x15, 0xFC, 0x3F, 0x8F };
memcpy((int*)0x008F3FCC,CallProto1,sizeof(CallProto1));
BYTE JMPProto2[] = { 0xE9, 0xB1, 0xCF, 0xD6, 0xFF, 0x90 };
memcpy((int*)0x008F3FD2,JMPProto2,sizeof(JMPProto2));
_asm
{
MOV DWORD PTR DS:[0x008F3FFC],OFFSET ProtocolCore;
}
}
else
{
MessageBoxA(NULL,"Unable to load Insomina MU DLL.\n Contact Administrator.","Insomina MU starter",MB_OK);
ExitProcess(0);
}
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Init();
break;
}
return TRUE;
}
// -------------------------------------------------------------------------------------------------------------------------------------------------
void ProtocolCore(BYTE protoNum,LPBYTE aRecv,int aLen,int aIndex)
{
BYTE ProtocolType = aRecv[0];
switch(ProtocolType)
{
case 0xC1:
switch(BYTE(protoNum))
{
case 0xF8:
if(aRecv[1] == 0x05)
{
if(aRecv[3] == 0xB2)
{
if(aRecv[4] == 0x01)
{
BYTE GensFix[] = { 0x68,0x80,0x7D }; //90 7D
memcpy((int*)0x00658348,GensFix,sizeof(GensFix));
BYTE GensFix2[] = { 0x68,0x80,0x7D }; //8F 7D
memcpy((int*)0x0065833A,GensFix2,sizeof(GensFix2));
return;
}
if(aRecv[4] == 0x02)
{
BYTE GensFix[] = { 0x68,0x90,0x7D }; //90 7D
memcpy((int*)0x00658348,GensFix,sizeof(GensFix));
BYTE GensFix2[] = { 0x68,0x8F,0x7D }; //8F 7D
memcpy((int*)0x0065833A,GensFix2,sizeof(GensFix2));
return;
}
}
}
break;
}
}
DataRecv(protoNum,aRecv,aLen,aIndex);
}
void FixLangAndFont()
{
BYTE LangFix[7] ={0xB9, 0x89, 0x00, 0x00, 0x00, 0x90, 0x51};//Charset with NOP
BYTE LangFix_NoNOP[6] ={0xB9, 0x89, 0x00, 0x00, 0x00, 0x51};//Charset without NOP
BYTE LangFix2[5] ={0x68, 0x90, 0x01, 0x00, 0x00};//FontSize
memcpy((int*)FixLangAndFont_1_1,LangFix,sizeof(LangFix));
memcpy((int*)FixLangAndFont_1_2,LangFix2,sizeof(LangFix2));
//
memcpy((int*)FixLangAndFont_2_1,LangFix_NoNOP,sizeof(LangFix_NoNOP));
memcpy((int*)FixLangAndFont_2_2,LangFix2,sizeof(LangFix2));
//
memcpy((int*)FixLangAndFont_3_1,LangFix,sizeof(LangFix));
memcpy((int*)FixLangAndFont_3_2,LangFix2,sizeof(LangFix2));
//
memcpy((int*)FixLangAndFont_4_1,LangFix,sizeof(LangFix));
memcpy((int*)FixLangAndFont_4_2,LangFix2,sizeof(LangFix2));
//
memcpy((int*)FixLangAndFont_5_1,LangFix_NoNOP,sizeof(LangFix_NoNOP));
memcpy((int*)FixLangAndFont_5_2,LangFix2,sizeof(LangFix2));
}
Client side h.