我是比較鐵桿的英雄無(wú)敵3的fans,在網(wǎng)上看到這樣的文章:
http://game.china.com/zh_cn/play/10002765/20021113/11362720.html就是讓我方英雄學(xué)會(huì)所有技能,真的蠻爽的
學(xué)會(huì)28項(xiàng)技能修改法
首先,把你的英雄的士兵調(diào)到前面幾格來(lái),接著用FPE來(lái)搜索。例如你的士兵數(shù):第一格3,第二格14,第三格4,那么就用 3,0,14,0,4,0 來(lái)搜索,就可以找到地址。顯示為:
士兵種類- 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-士兵數(shù)量
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格是代表一種屬性,物品, 狀態(tài)等等。前面28格是士兵的種類,接下來(lái)28格是士兵的數(shù)量。例如: 英雄可帶7種士兵,你要每種都是天使,那么把
03 00 00 00 前面的FF FF FF FF 改為0D 00 00 00。 如果你要數(shù)量100, 那么把
03 00 00 00 改為64 00 00 00。 士兵的種類是這樣分的:00 00 00 00 是槍兵,
01 00 00 00 是 進(jìn)化一級(jí)的槍兵,02 00 00 00 是弓箭手,03 00 00 00 是神箭手。
如此類推。
從03那一格開(kāi)始數(shù),28格后就是英雄的技能等級(jí),接著的28格是英雄的技能,
也就是從01到28代表的是英雄的技能等級(jí),技能等級(jí)最多只能是3。
01 箭術(shù)等級(jí) 02 尋路術(shù)等級(jí) 03 后勤學(xué)等級(jí)
04 偵察術(shù)等級(jí) 05 外交術(shù)等級(jí) 06 航海術(shù)等級(jí)
07 領(lǐng)導(dǎo)術(shù)等級(jí) 08 智慧術(shù)等級(jí) 09 神秘術(shù)等級(jí)
10 幸運(yùn)術(shù)等級(jí) 11 彈道術(shù)等級(jí) 12 鷹眼術(shù)等級(jí)
13 招魂術(shù)等級(jí) 14 理財(cái)術(shù)等級(jí) 15 火系魔法等級(jí)
16 氣系魔法等級(jí) 17 水系魔法等級(jí) 18 土系魔法等級(jí)
19 學(xué)術(shù)等級(jí) 20 戰(zhàn)術(shù)等級(jí) 21 炮術(shù)等級(jí)
22 學(xué)習(xí)能力等級(jí) 23 進(jìn)攻術(shù)等級(jí) 24 防御術(shù)等級(jí)
但是每次使用FPE真的很麻煩,我又是很懶的人。FPE可以做到的事情,我也可以做到。
其實(shí)游戲修改不過(guò)是使用
ReadProcessMemory和
WriteProcessMemory花了半天不斷的試驗(yàn),終于寫(xiě)出一個(gè)可以用于英雄無(wú)敵3.1版的修改器,沒(méi)有寫(xiě)界面(I'm lazy-:)),運(yùn)行之后就是讓我方英雄學(xué)會(huì)所有技能。
#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;//不學(xué)招魂術(shù)
for(int i=0;i<=155;++i) //一共156個(gè)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;
}
附加:
讓我方英雄所有英雄學(xué)會(huì)除了招魂術(shù)的以外的27種技能的小程序
以前英雄世界也有一個(gè)這樣的程序,但是版本太老,不能用了。
使用版本:中文版3.1,其他版本沒(méi)有測(cè)試
使用方法:進(jìn)入游戲后,運(yùn)行程序
Download: http://www.shnenglu.com/Files/sandy/h3c.zip