我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章: http://game.china.com/zh_cn/play/10002765/20021113/11362720.html
就是让我方英雄学会所有技能,真的蛮爽的
学会28项技能修改法
首先,把你的英雄的士兵调到前面几格来,接着用FPE来搜索。例如你的士兵数:第一格3,第二格14,第三格4,那么就用 3,0,14,0,4,0 来搜索,就可以找到地址。显示为:
士兵种类- FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 03 00 00 00-士兵数量
0E 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 01 02 03 04 05 06 07 08 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF或00作为一格,每4格是代表一种属性,物品, 状态等等。前面28格是士兵的种类,接下来28格是士兵的数量。例如: 英雄可带7种士兵,你要每种都是天使,那么把
03 00 00 00 前面的FF FF FF FF 改为0D 00 00 00。 如果你要数量100, 那么把
03 00 00 00 改为64 00 00 00。 士兵的种类是这样分的:00 00 00 00 是枪兵,
01 00 00 00 是 进化一级的枪兵,02 00 00 00 是弓箭手,03 00 00 00 是神箭手。
如此类推。
从03那一格开始数,28格后就是英雄的技能等级,接着的28格是英雄的技能,
也就是从01到28代表的是英雄的技能等级,技能等级最多只能是3。
01 箭术等级 02 寻路术等级 03 后勤学等级
04 侦察术等级 05 外交术等级 06 航海术等级
07 领导术等级 08 智慧术等级 09 神秘术等级
10 幸运术等级 11 弹道术等级 12 鹰眼术等级
13 招魂术等级 14 理财术等级 15 火系魔法等级
16 气系魔法等级 17 水系魔法等级 18 土系魔法等级
19 学术等级 20 战术等级 21 炮术等级
22 学习能力等级 23 进攻术等级 24 防御术等级
但是每次使用FPE真的很麻烦,我又是很懒的人。FPE可以做到的事情,我也可以做到。
其实游戏修改不过是使用 ReadProcessMemory和 WriteProcessMemory
花了半天不断的试验,终于写出一个可以用于英雄无敌3.1版的修改器,没有写界面(I'm lazy-:)),运行之后就是让我方英雄学会所有技能。
就是让我方英雄学会所有技能,真的蛮爽的
学会28项技能修改法
首先,把你的英雄的士兵调到前面几格来,接着用FPE来搜索。例如你的士兵数:第一格3,第二格14,第三格4,那么就用 3,0,14,0,4,0 来搜索,就可以找到地址。显示为:
士兵种类- FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 03 00 00 00-士兵数量
0E 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 01 02 03 04 05 06 07 08 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF或00作为一格,每4格是代表一种属性,物品, 状态等等。前面28格是士兵的种类,接下来28格是士兵的数量。例如: 英雄可带7种士兵,你要每种都是天使,那么把
03 00 00 00 前面的FF FF FF FF 改为0D 00 00 00。 如果你要数量100, 那么把
03 00 00 00 改为64 00 00 00。 士兵的种类是这样分的:00 00 00 00 是枪兵,
01 00 00 00 是 进化一级的枪兵,02 00 00 00 是弓箭手,03 00 00 00 是神箭手。
如此类推。
从03那一格开始数,28格后就是英雄的技能等级,接着的28格是英雄的技能,
也就是从01到28代表的是英雄的技能等级,技能等级最多只能是3。
01 箭术等级 02 寻路术等级 03 后勤学等级
04 侦察术等级 05 外交术等级 06 航海术等级
07 领导术等级 08 智慧术等级 09 神秘术等级
10 幸运术等级 11 弹道术等级 12 鹰眼术等级
13 招魂术等级 14 理财术等级 15 火系魔法等级
16 气系魔法等级 17 水系魔法等级 18 土系魔法等级
19 学术等级 20 战术等级 21 炮术等级
22 学习能力等级 23 进攻术等级 24 防御术等级
但是每次使用FPE真的很麻烦,我又是很懒的人。FPE可以做到的事情,我也可以做到。
其实游戏修改不过是使用 ReadProcessMemory和 WriteProcessMemory
花了半天不断的试验,终于写出一个可以用于英雄无敌3.1版的修改器,没有写界面(I'm lazy-:)),运行之后就是让我方英雄学会所有技能。
#include
<
windows.h
>
#include < tlhelp32.h >
#include < cstdio >
const char MODULE_NAME[] = " Heroes3.exe " ;
void printError( TCHAR * msg )
{
DWORD eNum;
TCHAR sysMsg[ 256 ];
TCHAR * p;
eNum = GetLastError( );
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
sysMsg, 256 , NULL );
// Trim the end of the line and terminate it with a null
p = sysMsg;
while ( ( * p > 31 ) || ( * p == 9 ) )
++ p;
do { * p -- = 0 ; } while ( ( p >= sysMsg ) &&
( ( * p == ' . ' ) || ( * p < 33 ) ) );
// Display the message
printf( " WARNING: %s failed with error %d (%s)\n " , msg, eNum, sysMsg );
}
DWORD findProcessId( const char * module)
{
DWORD result = - 1 ;
HANDLE hProcessSnap;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if ( hProcessSnap == INVALID_HANDLE_VALUE )
{
printError( " CreateToolhelp32Snapshot (of processes) " );
return result;
}
PROCESSENTRY32 pe32;
// Set the size of the structure before using it.
pe32.dwSize = sizeof ( PROCESSENTRY32 );
// Retrieve information about the first process,
// and exit if unsuccessful
if ( ! Process32First( hProcessSnap, & pe32 ) )
{
printError( " Process32First " ); // Show cause of failure
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return result;
}
// Now walk the snapshot of processes, and
// display information about each process in turn
do
{
if (stricmp(pe32.szExeFile,module) == 0 )
{
printf( " find process: %s\n " , module );
result = pe32.th32ProcessID;
break ;
}
} while ( Process32Next( hProcessSnap, & pe32 ) );
CloseHandle( hProcessSnap );
return result;
}
int main( int argc, char * argv[])
{
DWORD h3pid = - 1 ;
h3pid = findProcessId(MODULE_NAME);
if (h3pid == - 1 )
{
printf( " can't find %s in memory,please make sure the program started!\n " ,MODULE_NAME);
return 1 ;
}
HANDLE h3 = OpenProcess( PROCESS_ALL_ACCESS, FALSE, h3pid );
if ( h3 == NULL )
{
printError( " OpenProcess " );
return 1 ;
}
unsigned long sideOffset = 0x824994 ;
unsigned char side = 0xff ;
if ( ! ReadProcessMemory(h3,(LPCVOID)sideOffset, & side, 1 , 0 )) //查找我方的颜色
{
printError( " ReadProcessMemory " );
return 1 ;
}
if (side != 0xff )
{
printf( " find current side:%d\n " ,( int )side);
}
else
{
printf( " can't find current side\n " );
side = 0 ;
}
unsigned long heroBaseAddress = 0x15216ab ; // hero name start
unsigned char name[ 20 ] = { 0 };
unsigned long temp = heroBaseAddress - 1 ;
char b[ 28 ]; //28种技能
int size = sizeof (b);
memset(b, 3 ,size);
b[ 12 ] = 0 ;//不学招魂术
for ( int i = 0 ;i <= 155 ; ++ i) //一共156个Hero
{
if ( ! ReadProcessMemory(h3,(LPCVOID)temp,name, sizeof (name), 0 ))
{
printError( " ReadProcessMemory " );
return 1 ;
}
if (name[ 0 ] == side)
{
printf( " find:%s\t " ,name + 1 );
if ( ! WriteProcessMemory(h3,(LPVOID)(temp + 0xA7 ),b,size, 0 ))
{
printError( " WriteProcessMemory " );
return 1 ;
}
else
{
printf( " update skill sucess!\n " );
}
}
temp += 0x492 ;
}
CloseHandle(h3);
return 0 ;
}
#include < tlhelp32.h >
#include < cstdio >
const char MODULE_NAME[] = " Heroes3.exe " ;
void printError( TCHAR * msg )
{
DWORD eNum;
TCHAR sysMsg[ 256 ];
TCHAR * p;
eNum = GetLastError( );
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
sysMsg, 256 , NULL );
// Trim the end of the line and terminate it with a null
p = sysMsg;
while ( ( * p > 31 ) || ( * p == 9 ) )
++ p;
do { * p -- = 0 ; } while ( ( p >= sysMsg ) &&
( ( * p == ' . ' ) || ( * p < 33 ) ) );
// Display the message
printf( " WARNING: %s failed with error %d (%s)\n " , msg, eNum, sysMsg );
}
DWORD findProcessId( const char * module)
{
DWORD result = - 1 ;
HANDLE hProcessSnap;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if ( hProcessSnap == INVALID_HANDLE_VALUE )
{
printError( " CreateToolhelp32Snapshot (of processes) " );
return result;
}
PROCESSENTRY32 pe32;
// Set the size of the structure before using it.
pe32.dwSize = sizeof ( PROCESSENTRY32 );
// Retrieve information about the first process,
// and exit if unsuccessful
if ( ! Process32First( hProcessSnap, & pe32 ) )
{
printError( " Process32First " ); // Show cause of failure
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return result;
}
// Now walk the snapshot of processes, and
// display information about each process in turn
do
{
if (stricmp(pe32.szExeFile,module) == 0 )
{
printf( " find process: %s\n " , module );
result = pe32.th32ProcessID;
break ;
}
} while ( Process32Next( hProcessSnap, & pe32 ) );
CloseHandle( hProcessSnap );
return result;
}
int main( int argc, char * argv[])
{
DWORD h3pid = - 1 ;
h3pid = findProcessId(MODULE_NAME);
if (h3pid == - 1 )
{
printf( " can't find %s in memory,please make sure the program started!\n " ,MODULE_NAME);
return 1 ;
}
HANDLE h3 = OpenProcess( PROCESS_ALL_ACCESS, FALSE, h3pid );
if ( h3 == NULL )
{
printError( " OpenProcess " );
return 1 ;
}
unsigned long sideOffset = 0x824994 ;
unsigned char side = 0xff ;
if ( ! ReadProcessMemory(h3,(LPCVOID)sideOffset, & side, 1 , 0 )) //查找我方的颜色
{
printError( " ReadProcessMemory " );
return 1 ;
}
if (side != 0xff )
{
printf( " find current side:%d\n " ,( int )side);
}
else
{
printf( " can't find current side\n " );
side = 0 ;
}
unsigned long heroBaseAddress = 0x15216ab ; // hero name start
unsigned char name[ 20 ] = { 0 };
unsigned long temp = heroBaseAddress - 1 ;
char b[ 28 ]; //28种技能
int size = sizeof (b);
memset(b, 3 ,size);
b[ 12 ] = 0 ;//不学招魂术
for ( int i = 0 ;i <= 155 ; ++ i) //一共156个Hero
{
if ( ! ReadProcessMemory(h3,(LPCVOID)temp,name, sizeof (name), 0 ))
{
printError( " ReadProcessMemory " );
return 1 ;
}
if (name[ 0 ] == side)
{
printf( " find:%s\t " ,name + 1 );
if ( ! WriteProcessMemory(h3,(LPVOID)(temp + 0xA7 ),b,size, 0 ))
{
printError( " WriteProcessMemory " );
return 1 ;
}
else
{
printf( " update skill sucess!\n " );
}
}
temp += 0x492 ;
}
CloseHandle(h3);
return 0 ;
}
附加:
让我方英雄所有英雄学会除了招魂术的以外的27种技能的小程序
以前英雄世界也有一个这样的程序,但是版本太老,不能用了。
使用版本:中文版3.1,其他版本没有测试
使用方法:进入游戏后,运行程序
Download: http://www.cppblog.com/Files/sandy/h3c.zip