本帖最后由 shane007 于 2023-9-6 11:03 编辑 # R8 s) x4 K8 ~, z6 @5 O
, l5 N9 [& R M(nibiru.exe 772 KB (790,528 字节))! {, o8 {$ h2 T6 H9 K
5 b7 j% V3 d7 w4 _1 [) @将sub_451390,sub_451599 这2个显示函数进行了hook.
0 }5 Z, F! q2 }9 _$ K% e2 r1 U6 C确认这2个显示函数都被调用了。
+ `# W1 \8 a( x- j, N第1个可能显示的是调试字符串,第2个显示游戏字幕。
( Y0 U {$ B. y. ^( P* `& S$ k
5 h" n8 ~0 A, i3 j/ F2 f5 H以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。/ y g* s( ^5 K; F: t, U- N. R
7 k3 ?% h. O3 l: K6 X% @ //v12 这里出错) A) c: Z) r. {- J+ h
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);0 o/ |- d$ Q5 ~) z+ o
" A! s! w4 N2 a/ D p
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
9 h2 n! m t9 h( Q" ?( V7 v4 i这种方式显然是有问题的,会影响性能。4 J) s& ^! F4 b( J5 h
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。& V- D, a) D7 j$ O2 {
5 n8 O D3 X& s/ A! X( t% l/ M- sub_451390_Font1_hk
& H) X2 }! @2 y8 L0 Z - sub_451390_Font1_hk
8 I& W @" G2 A r. ~4 ~$ b8 Q - sub_451599_Font2_hk' S$ V( \, t1 ?( {
- sub_451390_Font1_hk
0 u' R5 O. k' N7 T% z1 ^( \ - sub_451599_Font2_hk
/ o* }: J0 Z! U& d1 y1 n1 }( ^ - sub_451599_Font2_hk: ^7 Q8 h0 w9 ], h
- sub_451599_Font2_hk4 O$ W) [% b, A2 ]" v
- sub_451599_Font2_hk2 }" Z* t* m8 ]/ K5 k% q; K- U
- sub_451599_Font2_hk" h3 T. G8 i! S* V' \
- sub_451599_Font2_hk" {1 f; H1 _; D$ D/ L2 W
- sub_451599_Font2_hk0 |: a2 Y: V( p1 Y' w; e5 G
- sub_451599_Font2_hk |3 l! a; y1 b4 w! T' i
- sub_451599_Font2_hk
复制代码 6 a; P3 b7 S7 I* l4 _: l; e& I
代码
# N0 W! i1 v! B& ?% M- #include <windows.h>4 S" T w8 c S7 i( H1 C
- #include <stdio.h>) d! J7 Y" J q* x4 G$ l
) f) ^+ ~/ v v& N* B2 A/ Q6 e0 U- #include "patch.h", \' C" W' l; Y( j, ~9 V4 P
- #include "patchNibiru.h"
, z) N0 h9 \7 j! F) D - #include <GL/gl.h>6 O# ]% b \2 _9 \1 n
" q: O2 M, _8 J. i( t7 O1 E! W$ `- - c' g1 U% g0 u$ W
- DWORD SUB_451810 = 0x00451810;: [+ m# e5 M& A" D0 r
- DWORD SUB_451390 = 0x00451390;- I# C6 e, m' W: s3 _
- DWORD SUB_451599 = 0x00451599;# C4 Q T7 { U; ~, O
- . N4 u/ L; y0 l" R) V+ y/ i1 P
- HDC currentHdc;6 Z0 ~1 c- a7 |& [% P6 l
- * T- O) V C2 i7 G/ [8 i5 c; T
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
& H/ c' I2 n: a. T9 ` - {3 Y9 C6 W. P6 j8 M4 `& p3 c
- DWORD v10; // [esp-450h] [ebp-450h]
+ `/ R6 N" @- r( g - int v11; // [esp-44Ch] [ebp-44Ch]
+ C+ t& s8 i/ _ ?' W+ v - int v12; // [esp-4Ch] [ebp-4Ch]
/ e3 g% { B; S- M6 {7 n - int v13; // [esp-44h] [ebp-44h]
( E6 ~; P4 j) K$ @3 c2 w7 F. g - HFONT v14; // [esp-14h] [ebp-14h]
( C1 O: r9 j% B0 m& ^0 ?, T - DWORD v15; // [esp-10h] [ebp-10h]
/ o- E$ k/ e5 R \6 R8 @ - int v16; // [esp-Ch] [ebp-Ch]7 {0 g( V" X5 F7 C' t+ {/ c% t+ s
- int* i; // [esp-8h] [ebp-8h]
3 g: w+ h& w$ T" J6 | - / j+ R- k2 j4 X1 X
- __asm pushad;
# Z! D1 ~( H4 K4 a6 r - FILE* trace = fopen("font_trace.txt", "at");
2 }$ v$ [* }$ z9 h H- p/ u - fprintf(trace, "%s\n", "sub_451599_Font2_hk");( ~) e$ V+ g& }8 v+ B
- fclose(trace);% y# p/ g2 J- C. q9 O
- __asm popad;" m4 q% `; r, H- Z
- " d9 Q. q* t9 d9 ~+ ]% B. Z7 l" T
- //if (!a9)
6 Q. g3 G# n2 e$ t8 [7 D; E3 Z2 q - //{6 E1 s7 z- `% R+ K' t! u8 V
- // AddFontResourceA(lpFileName);! u$ s8 L5 I! p& r
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
% N% R6 o9 N, `' `7 x3 O+ m& V1 W - // ;
+ [# }# H! i6 ?. Z: d2 | o& s8 W - // *(_BYTE*)i = 0;$ f# Q2 l6 n8 w2 A. r) U- n/ }
- //}3 ?: S+ x2 k5 x. j" L
- //if (a4 == 1)% L" z* a' d( C
- //{% l. y* }& d3 O/ R X: o# k2 |
- // v16 = 100;
( G8 B% y. v' k4 H: d0 D - //}2 s2 [9 Q1 O* O8 J
- //else if (a4 == 4)" T, b7 Q' A2 M$ ]5 O$ L; H: g
- //{' E# T4 h2 ~, h. Y ^( z
- // v16 = 700;3 |4 o2 ` \0 K6 m) M0 ]
- //}4 g6 k: _# r6 q& U
- //else
( M3 w4 y+ h4 H" y0 c( I6 c, h" }4 P - //{
7 m3 d0 U$ h5 [0 a2 r0 I - // v16 = 400;. o/ R- y |) e, B
- //}
$ k+ ^; h: S L; r# S% o. ` - v10 = 1;
3 C+ ]! ]1 n. o: ^& e) ~7 v - //switch (dword_4AA490)
- [5 y: L. [. K! Y* p+ x- H - //{
' N, o. }+ k, U/ ]: s5 F - //case 1250:1 E+ Q0 U( n' _" H8 `
- // v10 = 238;( ]; K& m" a! g7 R5 C2 |
- // break;: ~" t6 Y+ s( }2 o* E# c1 T; g0 N
- //case 1251:
* N' i* I: d/ F# f - // v10 = 204;
8 u, v" g) O8 D6 k' w - // break;
& B1 o3 T8 w5 _* ~ x9 E - //case 1252: F+ q$ Q. h4 R3 Z- d: e
- // v10 = 0;" [9 o s/ r. Y4 z! o' U J$ k
- // break;3 t" V6 t# r" O+ U, b! e1 h4 ]
- //}
) V2 T6 O4 O( b# D9 F1 N1 _* k - v15 = glGenLists(256);
/ Y* }0 k }9 n+ X1 F* T$ o - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
: O1 D+ P0 P5 b- m8 X - //if (!v14), J+ X; T; o5 R& W+ d6 s
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);2 Y' y$ e& {6 A0 n3 G$ R
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
* T @2 D& J# A, \2 U6 c9 D, f - SelectObject(currentHdc, v14);
6 H8 P! o" s4 A# E) K+ X - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);& s z% S' \ C" ~1 \+ D/ \
9 C- Z4 L- l Z- }/ U |$ I- //v12 这次出错( K. p% K/ P4 F Q% R9 }
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
6 a3 q2 g! \/ [" M9 C - 4 g& r3 y) K [3 i8 b ]1 z& e
- //*(_DWORD*)a2 = v12;
. x; \# n# M+ u) f5 o6 X! u - //*(_DWORD*)a3 = v13;& v# k3 ^! S$ }- g$ x. p3 \0 V
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);6 |* ]6 e5 | b$ A
- //if (!a9)1 Y% @7 c) o4 U6 w8 V# M
- // RemoveFontResourceA(lpFileName);( Y" ~9 o' p W2 e/ d" C: f
- return v15;
; J2 s5 T. u8 a5 d9 J) n - }7 J9 B# F2 |5 s$ e4 ~
- & v% q+ h2 A- ?$ m
- //使用到9 A. I# x$ N" H5 ?; \
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
* r! w9 W$ `# Z H. k# @& q4 o, G - {
9 w* k! H+ \2 p# v- X& _6 y - HFONT h; // [esp+4h] [ebp-8h]5 Z: i: H, ]8 B3 n8 C( }
- DWORD iCharSet; // [esp+8h] [ebp-4h]3 o( g! S5 |1 [$ C
- 1 X$ J. s8 A8 k' m
- % X. u) O% ]* t0 d) B' m+ x
- __asm pushad;
7 f# _# ?: ^* ]4 {, _) ^ - FILE* trace = fopen("font_trace.txt", "at");; U; V, x4 ]7 @1 Z
- fprintf(trace, "%s\n","sub_451390_Font1_hk");
# _4 \! i! N* ~) o& O! C7 k1 C$ y - fclose(trace);
- ]0 q& c' I; @2 l - __asm popad;6 {7 m* y1 o6 k. ?. U& v+ y
- ) j' P+ M* x. X; f2 [
- currentHdc = hdc;1 Y. c$ w6 F( Y8 J* Q
- iCharSet = 1;4 i2 c' ^* P, o4 F4 p! Y
- GLuint base = glGenLists(256);
& e8 o4 ~5 ~3 r* D/ r% b - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
6 K0 m, a7 P- o$ a' E - //if (!h)
2 O8 R5 L4 a2 a7 @6 Q - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
7 q% M1 T6 F4 V, d( g - SelectObject(hdc, h);
' B& ^# W& V4 q' S: h& } - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);9 V6 P2 ]* b0 R$ }
- }
, y; n7 f4 C; s1 Q/ K
7 w# j6 S. _0 U7 x, G% f- f- void __cdecl
) A5 j" [# r! {' R - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
) A9 T/ d/ k3 ?! a( p - {
* e4 k! B; w/ A6 B - __asm pushad;" h- l: Y$ i+ _
- FILE* trace = fopen("sub_trace.txt", "at");
; p0 E1 f% V! _8 r: s" | - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
) B# V5 N2 Z: a. U" U' q - fclose(trace);
) j5 e) i k0 Y R' N7 k$ k - __asm popad;
, d( m/ W$ c6 p7 N - # Q* l- K0 g" V$ Z$ y5 u( ~9 N
- //return a1;
' k" X6 H$ @+ N: R1 q# e5 m - }
1 B: _' b* n: L" m* R
/ D V$ T2 h" g n! D4 I- bool. t$ m2 p- T5 G0 ^
- ApplyPatchNibiru()/ A0 @6 E( d1 Q7 |5 \) ^* O$ N
- {
& Q0 r& {3 {6 ]" f - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);8 ]- V7 K! x: l+ A
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
! y# ?. S; L) d% { - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
0 Q! L/ o: i$ B3 G' N$ w8 X
% O+ b# c7 k' S; L6 ]$ n- ! b" }% P* f* _ M8 P2 v6 ^- A8 v
- 9 G% @% \ [' U
- return true;
( c% A: f0 Z" r- ? - }3 ^0 ~3 K' f& Y" h U z
复制代码 ' D/ g8 _* Y& O
# w& E9 j# k- k5 x9 n9 u: A, M/ Z9 N7 I0 u' H8 `; I
5 s" l( K( B0 I/ n, j |