module_dll = LoadLibrary("Antihack.dll"); will it be better
module_dll = LoadLibrary("Antihack.dll"); will it be better
Easier yes, better no. Your antihack will offline a small child with a debugger.
I would also add. I'm not teaching you to program.
I'll give you a piece of code to work on.
If you hang a batch file in the game client without protection, it is easy to bypass this batch file.
You have to think about the code and modify it, secure it.
Use VM protection, add hang protection, add license protection,...
I won't write all the code for you and I won't share the code I created for protection. In other words, I won't do all the work for you.
Last edited by leorond; 01-12-22 at 11:21 AM.
Please tell me which server (with sources) is suitable for this client? And another question is, can I use the zTeam season 6 server files (for example these https://forum.ragezone.com/f197/rele...100-a-1156924/) ?
I have not tested which servers are compatible with these source codes.
I edited season 4 for these resources.
It will be best if you use source codes that have already been tested with the game client.
Luis Fernando Más Ortiz
LouisEmulator
I want to thank the creator. Good work but no further development.
Such a shame
Has anyone created the SKILL_ATTRIBUTE season 6 structure where the Rage Fighter is entered?
I don't want to deal with it.
I won't write all the code for you and I won't share the code I created for protection. In other words, I won't do all the work for you.
typedef struct
{
char Name[32]; //32
BYTE Level; //
WORD Damage; //
WORD Mana; //
WORD AbilityGuage; //
BYTE Distance; //
DWORD Delay; //
DWORD Energy; //所需能量(所需计算=20+(Reqeng*Level)*0.04)
WORD Charisma; //Req_Level
BYTE MasteryType; //Property_1
BYTE SkillUseType; //技能用户类型。
BYTE SkillBrand; //使用该技能必须施放的技能编号。
BYTE KillCount; //KillCount
BYTE RequireDutyClass[MAX_DUTY_CLASS]; //
BYTE RequireClass[MAX_CLASS]; //
BYTE TypeSkill; //80
WORD Magic_Icon; // 76
WORD m_byItemSkill; //84
WORD m_byMasterSkillValAtt; //88
WORD Strength; //
WORD Dexterity; //
BYTE m_Stnk[6];
} SKILL_ATTRIBUTE;
你个小老外 我以为有多吊。还不是个小垃圾
Nice, I had to do it myself anyway.
Open Skill Eng.bmd in Magic Hand editor for Skill season 6.
Write the Rage Fighter skill and save as skill_eng.bmd.
The structure is like this.
Then remove the CRC or find out the checksum for better security and it's OK.PHP Code:typedef struct
{
char Name[32];
BYTE Level;
WORD Damage;
WORD Mana;
WORD AbilityGuage;
BYTE Distance;
int Delay;
int Energy;
WORD Charisma;
BYTE MasteryType;
BYTE SkillUseType;
BYTE SkillBrand;
BYTE KillCount;
BYTE RequireDutyClass[MAX_DUTY_CLASS];
BYTE RequireClass[MAX_CLASS];
WORD Magic_Icon;
BYTE TypeSkill;
int Strength;
int Dexterity;
} SKILL_ATTRIBUTE;
I am also attaching the skill_eng.bmd file here with fully functional Rage fighter attacks.
skill_eng.bmd
The MagicHand editor must be used for editing.
For example this one
MagicHand editor
You can turn off CRC like this
Or betterPHP Code:if ( dwCheckSum != GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // With CRC
if ( dwCheckSum == GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18)) // Without CRC
Or even slightly better for the above skill_eng.bmdPHP Code:void OpenSkillScript(char *FileName)
{
FILE *fp = fopen(FileName,"rb");
if(fp != NULL)
{
int Size = sizeof(SKILL_ATTRIBUTE);
BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
fread(Buffer,Size*MAX_SKILLS,1,fp);
BYTE *pSeek = Buffer;
for(int i=0;i<MAX_SKILLS;i++)
{
BuxConvert(pSeek,Size);
memcpy(&SkillAttribute[i],pSeek,Size);
pSeek += Size;
}
delete [] Buffer;
}
else
{
char Text[256];
sprintf(Text,"%s - File not exist.",FileName);
g_ErrorReport.Write( Text);
MessageBox(g_hWnd,Text,NULL,MB_OK);
SendMessage(g_hWnd,WM_DESTROY,0,0);
}
}
I would add the most correct option to my answer.PHP Code:void OpenSkillScript(char *FileName)
{
FILE *fp = fopen(FileName,"rb");
if(fp != NULL)
{
int Size = sizeof(SKILL_ATTRIBUTE);
// 읽기
BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
fread(Buffer,Size*MAX_SKILLS,1,fp);
// crc 체크
DWORD dwCheckSum;
fread(&dwCheckSum,sizeof ( DWORD),1,fp);
fclose(fp);
//DWORD dwCheckSum2 = GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18);
DWORD dwCheckSum2 = 7798882;
if ( dwCheckSum != dwCheckSum2)
{
char Text[256];
sprintf(Text,"%s - File corrupted.",FileName);
g_ErrorReport.Write( Text);
MessageBox(g_hWnd,Text,NULL,MB_OK);
SendMessage(g_hWnd,WM_DESTROY,0,0);
}
else
{
BYTE *pSeek = Buffer;
for(int i=0;i<MAX_SKILLS;i++)
{
BuxConvert(pSeek,Size);
memcpy(&SkillAttribute[i],pSeek,Size);
pSeek += Size;
}
}
delete [] Buffer;
}
else
{
char Text[256];
sprintf(Text,"%s - File not exist.",FileName);
g_ErrorReport.Write( Text);
MessageBox(g_hWnd,Text,NULL,MB_OK);
SendMessage(g_hWnd,WM_DESTROY,0,0);
}
}
Set MAX_SKILLS to the number of lines in the Skill_eng.bmd file + 1.
When using the correct number of lines for the correct BMD file, the CRC will successfully evaluate to key 0x5A18.
PHP Code:void OpenSkillScript(char *FileName)
{
FILE *fp = fopen(FileName,"rb");
if(fp != NULL)
{
int Size = sizeof(SKILL_ATTRIBUTE);
// read
BYTE *Buffer = new BYTE [Size*MAX_SKILLS];
fread(Buffer,Size*MAX_SKILLS,1,fp);
// crc check
DWORD dwCheckSum;
fread(&dwCheckSum,sizeof ( DWORD),1,fp);
fclose(fp);
DWORD dwCheckSum2 = GenerateCheckSum2( Buffer, Size*MAX_SKILLS, 0x5A18);
if ( dwCheckSum != dwCheckSum2)
{
char Text[256];
sprintf(Text,"%s - File corrupted.",FileName);
g_ErrorReport.Write( Text);
MessageBox(g_hWnd,Text,NULL,MB_OK);
SendMessage(g_hWnd,WM_DESTROY,0,0);
}
else
{
BYTE *pSeek = Buffer;
for(int i=0;i<MAX_SKILLS;i++)
{
BuxConvert(pSeek,Size);
memcpy(&SkillAttribute[i],pSeek,Size);
pSeek += Size;
}
}
delete [] Buffer;
}
else
{
char Text[256];
sprintf(Text,"%s - File not exist.",FileName);
g_ErrorReport.Write( Text);
MessageBox(g_hWnd,Text,NULL,MB_OK);
SendMessage(g_hWnd,WM_DESTROY,0,0);
}
}
Last edited by leorond; 3 Weeks Ago at 10:55 AM.
If you don't have the correct file, I recommend using the function
This function creates an empty Skill_eng.bmd file with the key 0x5A18.PHP Code:void SaveSkillScript(char *FileName)
After that, just write all the spells into it and you have a fully functional CRC.
Old minimap,
![]()