《太阁立志传4》 所有武将卡的取得
dOSKEY lEE
想必大家都玩过《太阁立志传4》这个游戏。里面有600个角色可以选择。有很高的灵活
度。如果光靠自己收集完整几乎是不可能的。由于几个同学对收集卡片很感兴趣。所以,近
日对此游戏进行了一些研究,想用修改的手段取得武将卡片。下面是我操作的流程。
游戏是从藏经阁287中找来的。游戏安装后是289MB,不是很大。在游戏过程中发现可以
取得各种武将卡片。在游戏开始后存档。发现集卡册里多出来两张主角卡(“丰臣秀吉”和
“前田利家”)。另外,在游戏目录里多出来一个新文件,另一个文件被修改。多出来的文
件是SAVEDAT0.DAT,被修改的文件是SAVEDATA.DAT。将SAVEDAT0.DAT文件删除后,发现游戏
里面的存档没有了。集卡册里面的数据还在。可以确定SAVDAT0.DAT是存档文件,而
SAVEDATA.DAT是保存集卡册的文件。
SAVEDATA.DAT文件大小是1024个字节,刚好1KB。用WINHEX打开文件,发现如下数据:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 54 41 49 4B 4F 55 34 57 49 4E 20 20 20 20 20 00 TAIKOU4WIN .
00000010 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ……………
……
000000A0 00 00 00 00 00 00 00 00 00 00 00 F9 00 00 00 00 ………..?…
……
00000290 00 00 00 00 00 00 00 00 00 00 00 A8 00 90 00 00 ………..??.
000002A0 00 00 00 00 00 00 0E 90 53 0B 70 01 00 00 00 45 …….怱.p….E
000002B0 40 82 28 81 00 00 00 00 00 00 00 00 00 00 00 00 @??………..
……
其余都为0。最前面的TAIKOU4WIN一定是文件头,第一行不去管它。然后在10h处发现一个01,
还有0ABh处有一个F9,一定是游戏修改过这个地方。然后将10h处的01改为00,重新进入游
戏后发现集卡册里面少了主角“丰臣秀吉”。将0ABh处的F9改为00,发现少了主角“前田利
家”。可以确定这一段内容就是保存主角卡的位置。我试着看能不能直接将卡片改出来,将
11h处改为02,还在这段范围内改了其他的位置,发现并不能修改出新的角色。说明武将的
代码是经过较复杂的算法取得的。只有另寻它法。记录2B7h到2BBh的一段数据,开启
SOFTICE,在SOFTICE中搜索这段数据:
s 400000 l ffffffff 0e,90,53,0b,70,01
找到后,在内存窗口中发现整个文件都读取到内存中。在内存中发现同样的数据起始地址是
604528h。主角“丰臣秀吉”代码的偏移地址是604538h。在此处设置内存读断点:
bpm 604538 r
开启集卡册,中断在489816h处,附近是如下代码:
:00489806 56 push esi
:00489807 E864651200 call 005AFD70
:0048980C 68FF000000 push 000000FF
:00489811 E87A651200 call 005AFD90 ;此处是取得正确武将代码的函数
:00489816 8A9638456000 mov dl, byte ptr [esi+00604538] <=中断在此处,
从内存中读取数据到DL中,准备进行比较
:0048981C 83C408 add esp, 00000008
:0048981F FEC0 inc al ;计算出正确的武将代码
:00489821 33C9 xor ecx, ecx
:00489823 3AD0 cmp dl, al ;比较武将代码的正确性
:00489825 5E pop esi
:00489826 0F94C1 sete cl
:00489829 8BC1 mov eax, ecx
:0048982B 5D pop ebp
:0048982C C3 ret
将489823h处的AL值直接填充到相应的内存中便可以在集卡册中显示出相应的武将。一个一
个打出来很麻烦哦。600个!为了发扬我们PEDIYER的精神。我只需要改代码就可以了,既然
程序给我们计算出武将代码了,我只需要让程序把武将代码直接保存回内存中就可以了。在
SOFTICE中做了如下的修改:
a 489816
inc al
mov [esi+604538],al
add esp,8
xor ecx,ecx
cmp al,al
即:
+——————————–+———————+———————–+
| 原来的代码 | 修改后的代码 | 解释 |
+——————————–+———————+———————–+
| mov dl,byte ptr [esi+00604538] | inc al | 将AL加一,取得武将代码|
| add esp,00000008 | mov [esi+604538],al | 将武将代码保存到内存中|
| inc al | add esp,00000008 | 未变更的代码 |
| xor ecx,ecx | xor ecx,ecx | 未变更的代码 |
| cmp dl,al | cmp al,al | AL与AL比较,一定为真 |
+——————————–+———————+———————–+
其中要注意的是那两句未变更的代码。把自己没有修改,程序中又有的代码保留下来。
否则会发生不可预料的错误。然后回到游戏中,再点击集卡册,600个武将都出来了。还多
出来50个乱七八糟的东西!?没关系。等下再说。看看内存中的604528h处的数据,这儿保
存的就是600个武将的数据!赶快用ICEDUMP将数据DUMP出来:
/dump 604528 400 c:/a.bin
退出游戏,用WINHEX打开文件a.bin。将多出来的50个东西的代码清除掉。将268h到299h的
数据用0填充。
最后,将a.bin复制到游戏的目录下,改名为savedata.dat。然后进入游戏我们就可以享
受用600个武将随意游戏的乐趣了!另外,其他卡片的储存结构比较简单,都是按二进制位
来存放的,用FF填充29Ah到2B4h的数据就可以取得其他所有卡片了。回到游戏中看看收集度
100%的集卡册吧!:)
下面给出SAVEDATA.DAT的UUE文件,将下面的内容复制到一个新的文本文件,并将其扩
展名改为UUE,然后用WINRAR打开解包即可。
———————-开始处(不包括此行)——————-
filetime 764696804
begin 644 savedata.tr4
M5$%)2T]5-%=)3B`@("`@``%TZ%O/0K8JG1*$^&O?4/8ZK2&4"'SN8]9*OC&E
M&(S^<^9:S4&U*)P0@_9JW5+$.:L@DP=[[6+42;LPHQ>*_7+D6<Q`LR>:#X'U
M:-Q/PSBJ'Y$&>.Q@TT>Z+J(6B?QPXU?+/K(EF0R`]&?;3L(VJ1V0!'?J7]%&
MN2V@%(CZ;^%6R#VP))@+?_)FV4W`-*<<C@-VZ5W01;<LGA.&^6W@5,</KR.6
M"GWP9-A+OS*F&HT"=.A;ST.V*IT1A/ALWU/&.JTAE0A/[F/62KXQI1B,_W/F
M6LU!M"F<$(/V:]U2Q#FK(),'>^UBU$F/,*,7BOUQY5C,0+,HF@^!]6C<4,,W
MJA^1!GGL8–'NRZB%8G/<.17RSZR)9D-@/-GVT["-JD=D`1XZE_11K@MH12(
M^F_A5LD]L"27#'_R9ME-P#6G'(X#=>E>T$6W+)/3AOEMX%3(.Z/CE@I]/638
M2[/RIAJ-`G3H7,]#MBJ=$87W;-]3QCJN(94(?.]CUDJ],:49C/]SYEK-0K0I
MFQ"$]FO=4L0YK""3!WKM8M5)O#"C%XK^<>58S$"S*)H/@?5IW%##-ZH>D@9Y
M[)[LNHA6)_'#D5/L^LB:9#8#S9]I/P3:I'9$$>.I?T4:Y+:`4B/IOXE;)
M/;`EEPQ^/F;93L`UIQR.`W;I7=!%N"R?$X;Y;>%4R#NO(I8+??%DV$N_,Z8:
MC0%UZ%S/0[8JGA&%]VS>4/<ZKB&5"7SO8]9*O3*D&8S_<^9;S4*T*9L0@_9K
MW5+%.:P@DP=Z[F'52;PPHQB*_G'E6<Q`LR>:#X+U:0``````````````````
M````````````````````````````````````````````````____________
M________________________````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
B````````````````````````````````````````````````
`
end
———————-结束处(不包括此行)——————-