本帖最后由 shane007 于 2023-9-6 11:03 编辑 ( r& i$ h) j" O+ ^
- G; }/ ?5 m; S+ `3 ]5 |
(nibiru.exe 772 KB (790,528 字节))
! a' Z0 u5 i2 ?+ K
' j& n1 y2 u( J+ e7 O! M2 u将sub_451390,sub_451599 这2个显示函数进行了hook.
1 i% A; _( B4 v2 {* o7 J8 _确认这2个显示函数都被调用了。
0 w& e. u( x' K: O. C: S9 n第1个可能显示的是调试字符串,第2个显示游戏字幕。) a! U0 N. Q1 ~7 j; \" m R% m
A0 [3 ~/ [) f |2 }+ I- O
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。. M2 U8 {; x2 S+ V" ?
; ^6 k' M- C# L5 p' e
//v12 这里出错
: X" F# Y# C: F6 |+ J" R //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);$ i& g- W5 R" O. c8 }2 P" p
# X2 L/ l0 _, c: S6 n2 I
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。; ?- Y8 L6 {& P0 ~5 h" R! z. D
这种方式显然是有问题的,会影响性能。
! K7 O+ K) @+ q7 N U在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
% w1 K! W) t* M$ U/ ^, N" d2 G8 {
- sub_451390_Font1_hk5 c1 F+ l* S& n! I
- sub_451390_Font1_hk
' [( R/ y& x" _2 n# p3 R" J - sub_451599_Font2_hk* T% _4 S2 @% M: ?, ]& `
- sub_451390_Font1_hk' H: e4 b1 T) t/ x* o# o# X
- sub_451599_Font2_hk
' l# U5 z$ K- s3 V( F - sub_451599_Font2_hk( s0 ^& k+ M. S7 c E% R# u
- sub_451599_Font2_hk
4 Y( a4 u- _: W - sub_451599_Font2_hk
* J( |8 Q- N: ] - sub_451599_Font2_hk6 k# o% A( ? j% {
- sub_451599_Font2_hk
. _, M; d( C# C$ X, e$ t, ~ - sub_451599_Font2_hk
2 a6 [+ q' y8 D1 x7 L& k - sub_451599_Font2_hk
- l' l8 V, U4 m' W - sub_451599_Font2_hk
复制代码 + `$ Y- S$ Y( n1 g$ C. s) Q7 ?
代码
: p( {9 Z' K0 k R- #include <windows.h>
( T: L, B" E7 g* C! b& z7 f - #include <stdio.h>
1 [( d M9 l" t+ y. s+ X8 j - 5 ?2 V$ {* }0 F) k& k Y2 ]# S) P5 b) C
- #include "patch.h"
8 x/ \9 B+ C( `7 N5 P0 a1 ]; s: W$ [8 ^ - #include "patchNibiru.h"3 O1 L/ j+ _. V2 E4 ^ E) e
- #include <GL/gl.h>
5 }( ~& Q: u( P8 ] - 5 d# r; V' ?# _( Y e
4 j8 k' R4 n# [- DWORD SUB_451810 = 0x00451810;
$ [* v1 N+ g% d4 a. U - DWORD SUB_451390 = 0x00451390;
6 v M+ G! Q4 v# P4 V2 F& W5 c& P - DWORD SUB_451599 = 0x00451599; [% H1 j6 S$ z- h; h% {1 j
- 4 {0 e& G1 z1 ^/ ~) \
- HDC currentHdc;. E3 K( x$ @" h: t, N: ?) D9 p9 \7 x
8 a4 _ R, Q: n! u% z& }- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
* i8 Q2 M/ {5 m# e& c - {
" J6 K7 \1 i/ K3 J# I/ ^. o - DWORD v10; // [esp-450h] [ebp-450h]4 |7 {6 {" B$ q7 H# V
- int v11; // [esp-44Ch] [ebp-44Ch]7 |! o9 c3 G" f; a4 g5 `
- int v12; // [esp-4Ch] [ebp-4Ch]( j, [8 h8 k6 i+ M6 p7 R
- int v13; // [esp-44h] [ebp-44h]5 {$ p3 n( h% |
- HFONT v14; // [esp-14h] [ebp-14h]
' n0 ?( `* W. [4 q - DWORD v15; // [esp-10h] [ebp-10h]
" a, F0 `& U7 o. b ` - int v16; // [esp-Ch] [ebp-Ch]
' q" i: d* x/ j6 [! S! f% x - int* i; // [esp-8h] [ebp-8h]# L% d/ F) } _# U
- : ]1 q( \2 I3 n: C0 m
- __asm pushad;. u+ q: B: O' d! J$ `# Y: Z
- FILE* trace = fopen("font_trace.txt", "at");
% e) B5 J" A* `9 Z3 Z - fprintf(trace, "%s\n", "sub_451599_Font2_hk");
- E0 `" k- S1 v. O% z$ Z7 w - fclose(trace);
) i4 }! n" m& _' n w0 M3 c - __asm popad;' n+ C- R3 L7 }+ w/ U
- 6 V( i J6 u+ A7 S9 M% Z) }
- //if (!a9); [0 ~) K/ |# a- _
- //{
, D5 l) v/ a- _) O f/ B - // AddFontResourceA(lpFileName);
- o0 d9 s: G4 Y- Q - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))# l+ r3 C0 y+ e: r1 @
- // ;
1 A: i3 M# Y$ j: X - // *(_BYTE*)i = 0;
3 X$ d9 _+ ~, L/ b2 _# x& a+ V( L - //}$ o% s# |& F0 X# B! h: V
- //if (a4 == 1)
, Y+ @. j I1 S( J: _2 O% a - //{+ e$ O) I5 y8 E$ S& y, a( I, y1 I
- // v16 = 100;
: {. D. j6 {" b6 y- j' M1 |; v - //}. t ]4 D$ U9 G# l m, k
- //else if (a4 == 4)! K6 [( c& C! V9 @0 X" `" R+ P' z
- //{
( j% d2 h6 o& F - // v16 = 700;
8 t, ~6 i/ }/ v - //}; x2 C: b8 P+ N4 e1 p
- //else
: V& J5 l) U) @" T, w/ R - //{
) _9 c: c% D- ]& g - // v16 = 400;
' K, ]" Z! O! m, l* J% o - //}, C1 ?. L# D# c, R) {. m2 h% n
- v10 = 1;
1 D! k+ D9 _) m - //switch (dword_4AA490)
2 h* g! |7 G2 n - //{0 b1 v8 ~! F0 `- a h
- //case 1250:
7 w' l) a! [) c! j& h - // v10 = 238;& [4 B9 Z$ o, L2 q8 a, i, g) E
- // break;
" H6 p% l0 v5 X - //case 1251:
6 y* o/ o" V8 n! E3 g8 S4 _ - // v10 = 204;
$ }5 }* ^ p* M7 K# H+ N, b- r - // break;
* z/ N9 E: b. O( D) a9 G - //case 1252:
! j* x. E! ?1 c% o - // v10 = 0;. D% F, ^ N8 G9 L3 I+ q4 E
- // break;3 X- ~5 U/ F, P; P3 `" { a
- //}% i" m" L8 |( L- S2 H7 v
- v15 = glGenLists(256);
. M- S& p4 j! @2 ]6 S$ s - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
& ^3 ^, _* ^+ a; Q& u) {9 s3 v" k - //if (!v14)5 l# C9 }8 f4 v1 {6 o7 ~4 E
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);/ L5 T9 E, \$ Z
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; % }4 }$ }' B1 b
- SelectObject(currentHdc, v14);) F$ {( [. T$ e; b' L! {
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);- q: \! |; z8 A0 ~7 z. P
& X6 f9 h" S8 Q$ G+ J8 D- //v12 这次出错+ V8 F; P# C1 T9 z0 Y
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);, w' j2 {# |' p) V" M6 i7 q/ ~
-
( E3 [$ r3 Q8 p+ Z) g8 | - //*(_DWORD*)a2 = v12;
6 I1 N! s* U' q/ J" [ - //*(_DWORD*)a3 = v13;
) b2 D- V+ s1 g2 ~. a, u1 m - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
9 r4 q3 S8 E! k - //if (!a9)
7 } D' b) Y V; s. X# N: B- ^ - // RemoveFontResourceA(lpFileName);
V# c* D1 ]# F8 u/ N3 F3 S4 ^ - return v15;
& R- v& Y# @6 G* J G - }4 X0 q7 M7 X1 N( l4 }$ |7 G
- 1 p# v6 y1 x- A" ?# e
- //使用到
) T4 [( i2 h) C& `2 p T - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)3 l9 d' @- a: }
- {
8 Y6 ?* b+ l- w" [& X1 d/ P& c - HFONT h; // [esp+4h] [ebp-8h]4 y8 C t3 X9 N4 e
- DWORD iCharSet; // [esp+8h] [ebp-4h]% _2 e% i+ I# W1 ~/ o2 H* S
- % t' u. R) j: H1 h! c
- ; K# P3 g; T |" h$ b
- __asm pushad;! t/ }3 ]5 C% V8 ], J
- FILE* trace = fopen("font_trace.txt", "at");6 C8 e& h8 @5 n$ h) C" h! i4 p
- fprintf(trace, "%s\n","sub_451390_Font1_hk");
: w4 N1 p9 ~8 M ` C& | - fclose(trace);
7 r* t8 W: V3 w0 B6 ~8 ]! V - __asm popad;7 a2 Z1 A2 S9 H& p2 m+ d
- ( Q' N8 `, i% u6 C4 m/ E
- currentHdc = hdc;, ~; J; v0 d3 Q0 f9 X
- iCharSet = 1;
! F' T/ r1 [* q7 V: [ - GLuint base = glGenLists(256);; [0 _4 c Z, L) w A
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");1 T0 v# q z \$ V0 w
- //if (!h)
2 | P% q' C) u! U - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
+ Z3 M) Q ?4 E' _ - SelectObject(hdc, h);% K& s1 Q- z9 r9 @
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);/ M" _! D; G- i. D, E O
- }
$ x1 n2 W# D, M$ W* g! G3 l - 3 T# C! }! X/ j1 j6 b& n* V6 |
- void __cdecl
2 k7 h/ x8 }6 A6 h! n# ] - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)& K; f! @3 q) o3 _( S. X
- {: ]: l9 D' \8 I2 C+ N
- __asm pushad; i" A3 T9 B T2 B1 D2 N
- FILE* trace = fopen("sub_trace.txt", "at");
' V. Z) i1 }8 s! _) ?" e2 H! P - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
- X( T, s& |* W. T5 S - fclose(trace);: ]2 d# A+ a) s. p! G- _
- __asm popad;2 y2 u. U/ v0 a& ^& ?& o
- 1 H8 S4 v. W0 Q
- //return a1;
0 C: @/ s9 w8 |- l - }
, E H: j: f8 D3 q) _ - 4 Q0 {% E1 Q- n4 x3 X
- bool7 x) k0 [1 h. w& l5 n9 ^7 O
- ApplyPatchNibiru()# u8 d; w9 D% i; W- F, ^$ S/ D2 x
- {
! x: E! p7 H* Y" V9 F - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);( o$ J, ^4 \8 H7 o+ b& l- B- d1 B0 V
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
8 K8 v' q; k+ Y$ O - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);. `4 c* h7 G J( Z+ u. `! V2 J
- 9 R4 v0 m: p; Q7 Z. j; _$ ]
4 d& I, g! d" E& |- 4 @3 n) A+ t( b% m$ f
- return true;
3 y7 W# Z" f# H n4 L - }
5 O3 v8 F& v( N$ k8 j; X6 y
复制代码
9 M- N. S3 s+ t6 \% T8 e0 O1 `: A& P0 \
, w" ~# H( }" e: N( v* J
/ O6 O* q8 i+ n W- Y
|