菜鸟福音!《仙剑奇侠传4》修改原理解析
来源:互联网
: G) t F5 i7 I" Q( ^
& R. t0 Y* j; a7 f仙剑4数据存储原理和地址规律9 M) E+ ^+ F# |. \3 r: \$ }) R/ R
9 y5 E; Y/ D) o* d& `% b
不想看原理的可以直接看最下面。 首先,系统下程序可用的内存地址是00400000-7FFFFFFF
, v( L Z( K( b6 Y. V y
7 W$ c/ M, f% z, P- E但这回仙4的大部分人物属性相关地址都保存在7F966880之后……而且到现在为止都是双字节,装备是4字节,所以最大值是65535,但在一些情况下最好别取这个值,后面再说。" C% D1 B( `3 v; b7 U# N# I4 `4 r
q5 x7 K' j! @2 N! j' e# _
仙4的人物属性数据分4块& F3 Q: Q$ ^$ ^9 m! S' v0 e6 {
# n8 f+ I4 K) C0 z- M2 n D5 I
战斗临时数据:仙4中战斗时所调用的地址,但是这个地址是会变的,地址范围也是很靠后,但应该在7F966880之前,这个等地卷解决。0 p b8 [, Q3 p2 L" x2 A- z
5 @0 ]7 h6 K& s/ r人物基础数据; { S" a3 U( f, ^% K3 a
# A; ]2 \! p/ }- s* {( j5 D: g人物现有MAX数据(就是在人物属性界面所看到的,但精气神保存的是最大值)9 G9 R3 f* a6 B
2 u& B" |8 b3 l" n人物现有数据(同上,但精气神保存的是现有值)9 K5 G' { N3 J* e% C" W
' [& K, `0 l7 L: U3 B# N; Y接下来重点说每个部分,这里按云天河的内存地址为例(这里数据采用了2次收录,数据有差异,但位置没变) 以下地址我试了2次,50%认为地址是不变的。 人物基础数据,人物最基础的几个属性,这里的属性是人物的原始值,就是没加装备前的。依我判断,这里的值加上装备的加成就生成了[人物现有MAX数据]中的攻击。修改这里最有效,但升级后是加成还是新算还待确认,但也可以直接锁定掉。前面还有一些数据,没仔细研究。8 y* y: G2 n. A
) G. D, N3 X! F0 W9 F3 `/ d2 _
7F966880 00 00 00 00 AA 06 00 00 05 00 00 00 6D 00 00 00
6 n0 v1 w6 ]4 e0 a/ g! |3 n7 R0 ^2 C" m
----------------------精----------?-----------气
: w2 H- h! c% r' I6 a. n
/ @, p. {) Q0 ^7F966890 F7 00 00 00 AF 00 00 00 CB 00 00 00 DC 00 00 00+ r9 h9 y1 P7 }- t: i
) H* n# Z" E# Y5 T6 A `7 D----------功----------防----------速-----------运
0 i6 |/ Q# D. \& T+ c D- n8 }6 y1 }4 P3 }4 j
由于这里的功是人物基础值,基础值+装备加成才会=真正的输出攻击力,所以推荐这里基础值不要设到65535,容易溢出。如果想最大攻击输出,那就FFFF减该人物拿着的武器攻击力的16位值,得出来的就可以添在这。
: }1 ~5 H! \3 h4 W. L3 C3 o# d5 N, Q3 k
7F9668A0 99 00 00 00 CD CC 4C 3E AE 47 E1 3D 00 00 00 00* M! i' K# C; v8 q: e- I3 a
: L" ~4 F. K9 ~! |8 z
----------灵----------4字节为一组的数据,暂时还不知道是什么
2 m( n1 o5 x8 g* m; T9 J9 V n. W' U% B& q. }) X
7F9668B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00) A. k8 Y1 u- T
6 c9 \! }( ]. |: j% ~; H6 l
7F9668C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00& \( N1 Z9 y' |) l8 T- `( l, y) z
" z0 Y4 C N5 o& X2 B7F9668D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 004 N7 M- C. _& n0 @1 m
& ?7 J& e6 o0 W* [7 [/ i( o9 j7F9668E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 O5 ~ ^. l( B5 m$ I0 F9 s3 i! j1 F3 K( q
7F9668F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 002 x0 d1 }3 A' R0 ~- O4 V$ d
* _& g; C' ?7 d3 d4 j% E2 i" Z7F966900 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 00
4 k. w7 ~- F$ T8 K; J4 ^) v
+ v4 U- X. X5 y8 b8 x% D% [-------------------------------------------待确认$ O0 M3 S8 c ]- c" @) z
/ \& E1 p( `. w7 ~7F966910 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 002 X7 D! p1 c* f0 ^
) V& c9 O6 [+ D: o g7 W& m7F966920 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
4 O2 L# m/ {4 p7 w: D% q9 q% R5 M6 }' E0 N) P2 {: J
7F966930 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
( j0 A; u& t" ]8 r- z* o
2 s: u1 \, \1 t: {7F966940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00+ \' O Q( Y: N4 k
/ s( z" c, c A t/ v, n# A ^+ f$ F) Q: d9 N' {$ C7 y
8 a( f# e) Q; B- @
$ w' N- n- c+ |9 d& N6 C
人物现有MAX数据,这里的值都是按照人物基础值+装备加成后的值,所以大部分都是动态生成的,比如功,防,在这里修改是没用的,因为这里只是显示在游戏中人物状态里的结果,当进入新的战斗后,战斗中的攻击会重新计算,而不是直接调用这里值。- h2 Q9 N* S X5 k
. Y0 R* Y; ?5 z6 F) ^! T7F966950 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00
7 w, p& f* z4 ^" V1 |" y0 s& Z/ f- b5 R" {- c
----------------------------------------------等级2 P& [! w( ?5 |1 l8 Z& P i& v
, ]! W9 i) R6 m
7F966960 99 8E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Q6 E( ?; H" m- ^! m( Z e
w% t; D: X" i% w
----------总经验值
- t, J2 E8 B9 }& N
# r1 A/ ^4 ?8 ?' F& d/ X0 ~, T7F966970 00 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F
3 q4 O" C3 R T) j( ?5 n& \$ l$ U4 X" B2 q6 j% g% H
7F966980 00 00 80 3F 00 00 00 00 00 00 80 3F 00 00 80 3F
- H# a! o' ^( v9 ?8 B
( W' J( ?% u4 L: E7F966990 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
: l5 n! G4 V7 D, m5 f6 J' e: o6 l
% T2 l% u3 u& M0 ?1 i7F9669A0 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00
% J5 ^' D; Y) ~! w+ L1 v7 M
5 _7 Z! n; Z6 l6 p) b0 Z/ R% i4 ]0 O这一大段可能是分割符的作用& D4 P' L5 y2 g, j3 e% a- z5 ]0 k5 V
" p/ c' C- S" X$ \7F9669B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
/ b4 ~% ?" J% y, G4 x
2 _& r8 m" h( M6 E* ^$ G$ z* f8 \* D7F9669C0 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
2 O; E' Z' _4 ?7 c8 u
2 }3 a+ y G$ ^5 P# K& O----------------------------------未知1 A0 |, b8 F. a/ {1 W. b
% E; j8 T0 ?* i1 \1 q7F9669D0 00 00 00 00 09 06 00 00 05 00 00 00 61 00 00 00) _, S5 X6 v2 M: `
/ d D$ h% M% g* F: n
----------------------精MAX------?----------气MAX
" P3 u+ ^- r, {; h3 N# h7 F
: O* e7 `$ T4 G! Q$ [1 \: I6 r* a7F9669E0 21 01 00 00 AF 00 00 00 B3 00 00 00 BF 00 00 00
3 U2 _ _/ [& E, F; |
D8 d- u* E- H. n0 P5 j/ I& J) k& S----------攻值--------防值---------速值--------运值
* I4 h1 ?# c7 D) a2 I! D
?7 I' r0 w" q. ^% } h! f7F9669F0 84 00 00 00 9A 99 99 3E CD CC CC 3D 00 00 00 00
. m# f+ w a' ^. h& D( q+ v
" H7 q: S$ X' c9 B/ v----------灵值--------这4个字节是武器,后4个字节就不知道了,而且这个武器我觉得,可能只是调用位置,而不是武器代码。
, l1 O' g; s. c: |) ^% d, O
5 ^' J# }1 I, y& L9 j比如CD CC 4C 3E铸云铁,9A 99 99 3E峰岭刃,但下面有个土属性戒指也是9A 99 99 3E。7 j" F- r9 T4 L5 a$ e4 E* y' C
. @, }) y9 T: a6 @/ C. p7F966A00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 007 K* w1 `; V6 d0 p
! A8 K% R4 w: Z# m0 k& f1 y
7F966A10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00: I* L; y/ ~) b& y: Y; j/ |! s
' \( w$ l8 z! \# ~. Z9 t8 E: g4 K
7F966A20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
. @4 n# F. ~3 Y/ [1 F
2 u) J5 ]! b+ I' i' M+ V7F966A30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# L T# P& l; ~ j9 c# N8 Y) B, M. |
----------------------------------水装备加成---火装备加成
# J0 P* ^% E! W* m
8 @. t; l* \, u& C& X: }0 Q( o这里是指环的装备地址,4字节,9A 99 99 3E是2个相同装备,9A 99 19 3E是1个,但到底还有什么规律呢?: n3 x1 ?. q) v k
; k' P: o; i# |$ n; a: s. \6 E7F966A40 00 00 00 00 00 00 00 00 9A 99 99 3E 00 00 00 00
$ T% U7 b- g% t5 i) l! B6 X# R) G
7 N' E9 e3 W: T ~$ Z----------雷装备加成---风装备加成---土装备加成--水属性值
' n( p( I) F+ M3 y0 ^: C$ {9 M* U% [! }* v
各属性值就是5灵的值,双字节,之间间隔2个字节,但直接改这里仍然对战斗中无影响
8 X* X' C, X0 B1 _ e' I4 F9 {# i9 I+ D$ [2 M/ ]
7F966A50 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00 009 E# j3 w3 w. n' n+ O J9 ]
) t6 N( y! Y \' i7 E2 W----------火属性值-----雷属性值----风属性值-----土属性值 4 b9 y" Q3 r5 i. _- O. t6 g
1 Q$ _# e+ R. k7 L$ ~
7F966A60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00$ F/ Q2 }) u0 N* e% ~
0 W( |) }- _9 T" }
7F966A70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, K( w C+ }) r8 n
3 _; F" G2 |& u$ c3 ~7F966A80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00# }7 W7 S$ T5 u- g) y8 F1 `( B
! p" o+ j7 V+ c/ [) C7F966A90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" u- M% a' \; W/ S+ O1 f0 h0 q* g
% X! b Z0 O1 Q2 {0 n
, o; @! Q" }. |8 s5 D
5 n6 w6 R* Q4 R8 }' `6 P4 e人物现有数据,是人物现有的状态,比如还剩多少血就在这里。也就是锁定这里的最大精就可以战斗结束后自动满精了。- ?+ g& `5 Y6 {& @7 M) U! y& n
0 v0 o( G) J% [$ g* H7F966AA0 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00
- V0 r! c- J, _; A" G3 n" W2 \- ~- Z0 F2 D; K7 x
----------------------------------------------现在等级' I* n$ m* f0 J0 Q# b$ k
# K) Q# |* b' ~3 g a7 ]8 o7F966AB0 99 8E 00 00 00 00 00 00 09 06 00 00 64 00 00 00) v* ?$ Y5 w+ M. x8 M! G+ [
* [# d. }7 J" n/ D5 T----------现有总经验---------------现有精------现有气2 G- n: V& d9 p+ |: Y
9 W% ` l- m8 t) B( O5 o4 G7 ]
7F966AC0 52 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F8 ^8 V5 Z2 L9 p" O
( L( u! ], A7 Q* n" H9 Z4 t----------现有神" h* c7 s9 A k, m+ w C7 _) n! `
1 E1 W2 g8 n' I- s: R0 Z+ \
战斗临时数据,是随机产生的,但应该有个范围,我抓了2次,分别在6FB2CB94,78BD2FdC附近。数据的结构和人物现有MAX数据里的一样,可以参考。
/ q+ H4 E% q! y6 z( v# w
/ U. L' i9 h+ i+ u E. `- Q* B+ b& T如果你在战斗临时数据中修改了人物的攻击力,之后受到加攻击或减攻击等法书的影响,那这个值将会从人物基础数据处+装备加成+法术中得出,再赋值给战斗临时数据。而且战斗临时数据在结束战斗后就消失,下场开始时再动态生成一个新的地址范围,所以锁定无用。
. I2 c% `! |1 Z6 H
# R |7 A0 \7 }$ c" q1 M " Y8 x. [6 S, c3 h
; n; `1 `8 Z/ z- E3 X$ c所以,仙4的人物数值可以这么来理解:0 ^. B% k* k, G0 X: Z2 N
a# w9 M2 x: G# Y# c
人物基础数据+装备加成=人物现有MAX数据里显示的
) l$ P. t) T& N
9 Q6 n8 h* s) q2 G8 z3 _6 H# S人物现有数据<->战斗临时数据是互导的关系,也就是战斗结束后HP为1004,会保存在人物现有数据中的7F966AB8,然后再次进入战斗模式时,会把这个值赋回给战斗临时数据中的HP地址。那么战斗中的数值是赋值给动态地址的,所以还没办法战斗中进行锁定。
* U1 y, p, V$ |9 W% M) J) w) a+ y* ^5 s7 {7 ^0 W
对于其他人物,他们之间的间隔为B14,也可以说一个人物的所有数据占用了B14,就是2836字节。! N6 ^2 `% V) ]7 a/ ?
8 C- b% \ ?7 p% c按照这个可以想到,如果你想建立一个已经离队的人物,你起码得自己建起2836字节的数据。
7 q9 e% z9 r" ~) n; i4 V! K
3 H8 }) F4 e- w那么,其他人的地址分别如下,如果想要韩菱纱的攻击,只要云天河的攻击地址7F966890+B14=7F9673A4,就是韩菱纱的基础攻击地址。! v s. }/ R4 i' b
' `2 |+ ^5 a# A) @4 o7 X8 K
韩菱纱 7F967394
9 L, ^, G: e' ^3 p: | h* @7 z1 O$ e! W$ O9 W% v, l, t1 a9 ?
柳梦璃 7F967EA8
- C# x, I C' b) x! s+ H- m9 n; p- b
慕容紫英 7F9689BC; H+ m, U$ [- |2 q$ p+ v/ W6 ]
1 D* @+ j0 m2 o现在还没确认的就是这个排列是否固定,我现在玩得人物少一个慕容紫英。
2 x. d# E+ o: F8 O" m0 m4 u
$ t1 [6 B+ W+ O: y9 k; i3 w
+ C; w' r" O8 ~0 @. s
: b/ _& x5 q* i& ~: X& r0 B以下都为双字节,数值最大65535,但避免溢出,不推荐设成那么大的值。不用锁定,但暂时还不知道升级后是不是又重新算了。
: b: E# X8 z V$ q4 O1 w3 q" _/ }( s- L3 t D9 I, t: E
7F966890 云天河的攻
' k0 V9 T1 v, ?! e( {! F7 g" E* ]# e ^0 i4 j4 z
7F966894 云天河的防
# d: ^3 g- S- E+ ?: `7 ^8 }# @
6 R9 y; E" V& k# q0 p7 Z7F966898 云天河的速" [1 y# @# o4 N( y$ v) |9 K8 T
5 ]1 u" a/ a; m( w; x. L& L3 K
7F96689C 云天河的运& K! F' j+ e& j
1 U& j- k2 x) i1 s
7F9668A0 云天河的灵
1 o! h7 }. ~/ ^- I! R9 Q% g
7 [; }! m9 V9 O# w8 Q/ u1 v7F9673A4 韩菱纱的攻
" H1 Q2 L* @: X2 n- \) Z; d( X# y- Y5 _6 K! d2 ~' y) N! X
7F9673A8 韩菱纱的防
$ _" F! u% F3 s p7 j- `3 k, W( h/ }) Z5 k" |! l
7F9673BC 韩菱纱的速8 ^- ~0 C% h2 V w
& G0 _9 Q6 b1 \( G* a" j4 C7F9673B0 韩菱纱的运1 b) z3 ~. ~( U
( `0 w0 z( u+ f' ?3 [
7F9673B4 韩菱纱的灵
; h8 y9 a6 D" q) @8 t# |- J4 Y1 ?! E2 U/ `
7F967EB8 柳梦璃的攻
5 I. ^0 ^& @; Y9 a6 r! t7 B# i) ]/ f# B& n$ D8 R9 m
7F967EBC 柳梦璃的防+ C( z+ u; j, a' n1 [! y
3 @% h: R6 i8 R! F7F967EC0 柳梦璃的速: V5 U0 E L8 Z
! x1 W5 S( l. ]. d/ D
7F967EC4 柳梦璃的运
2 }% P$ I% `* l' a$ n' s% t# l% ~8 ^8 }1 O( d2 c" @. y8 ~- Q; V, g c
7F967EC8 柳梦璃的灵
9 \7 a2 D+ s+ W+ G9 o) x
/ w! D0 A1 g, ]1 {# l7F9689CC 慕容紫英的攻
' ~6 M+ I$ H T+ Q0 p, U
6 J: r, p3 ]$ Z }$ u* Q& F Z7F9689D0 慕容紫英的防
" {8 h# |- {3 @7 _
/ N& f( \( Y5 E% H1 t6 I, E7F9689D4 慕容紫英的速
1 f- C/ A$ S, M; J3 S' q+ ?! u1 f7 U' ^% V0 i6 p
7F9689D8 慕容紫英的运5 U! D! F! n3 K5 r! v) Z
- A9 ~* b9 W9 x: [- ^ o4 ?9 m
7F9689DC 慕容紫英的灵. p" F. h8 J9 y1 [/ }
8 D+ h9 l. a0 f% ^0 v8 O
0 @& y, E5 e9 N
/ @* r, D3 O+ J ~( S
还不肯定这个4个人物范围是固定排列还是剩谁就排在前面。
4 w1 f( m7 T. c8 N+ F* i! ?# H1 E' O1 U7 W
4 s0 F6 m( a: C W' I9 ]
0 t n: @9 z! g* a如果要真正能够锁定精,气,神,则需要找到战斗临时数据地址生成的规律,锁定了就可以。对了,如果HP锁定后被一击必杀打中(比如淮南王的夺魂)……不死亡(可以想到必杀的方程式不是,怪物攻击输出的值(显示用)=人物的剩余血量,状态=死亡(直接死亡);可能是怪物攻击输出的值=人物的剩余血量,人物的剩余血量=人物的剩余血量-怪物攻击输出的值,再 if 人物的剩余血量=0 then 状态=死亡)
4 M& m$ C$ h+ [# E, i, f7 r' l8 n5 {3 u- `) O
& U# {6 j$ H! G* y2 r, }! T6 O- O: Z( C! _5 }, D m( [. Y+ N* V
地卷待解决的问题, a" p! u2 s6 ?* C5 J
( q" ~- T$ e! u$ S. S5 Q1 ^' G1。对于64位系统而言,是否地址会随着变更?
5 m8 t2 b: R2 F) ~% {. P: K* F2 b R+ b
2。在32位对于XP和VISTA的内存地址是否会变更?(可能性小)( x% Q! [% _* f8 K3 F# H
$ `- m4 W3 @; O8 `, K$ z1 B9 A
3。战斗时的内存地址范围是多少,只见是否有个规律?& Y2 `! `+ W! {: ]0 t
q0 u/ L' i& o/ |% c7 o& U4。在7F966880修改的数值,人物升级后是在7F966880得值上修改加成还是被替换掉?
$ n9 ?4 u: _* K- u3 c @, Y( q' }5 H" k8 Q, P- n( P) N
5。游戏的地址是不是固定的?