本帖最后由 shane007 于 2023-9-6 11:03 编辑 5 v. K2 V5 s- i. r
3 d( U- z# r0 P1 A5 R" ]0 p
(nibiru.exe 772 KB (790,528 字节)): W5 H5 y0 \1 n8 ?6 y
# _; Z& ^* x7 |0 o! l将sub_451390,sub_451599 这2个显示函数进行了hook.
; m8 Y {/ ^& D& ]3 j确认这2个显示函数都被调用了。5 H5 j% E4 g2 k5 H
第1个可能显示的是调试字符串,第2个显示游戏字幕。3 w5 X( F- L! s. l! O
" X; o' h8 p/ c) u+ A5 P9 B5 c以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
- o6 x8 o- z$ d: f0 b& n
2 g( [$ Q+ N* T' V //v12 这里出错
( F+ a Z. |7 M+ ? //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);: O. S) X( @5 w) x4 s7 m% q. i
, y$ T6 e0 l# z, n) @5 b
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。6 y6 n+ A& g* F. d/ G+ a
这种方式显然是有问题的,会影响性能。, ^2 m0 I4 S( N
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。0 V( A$ |8 \+ r! B
8 \1 o- D- w4 [& A
- sub_451390_Font1_hk
3 C0 T$ u6 o9 R - sub_451390_Font1_hk5 I: l2 V6 f/ X' O/ N
- sub_451599_Font2_hk
! D& G7 m) q" s - sub_451390_Font1_hk
( B: i# f J; i, Y( y - sub_451599_Font2_hk
9 i) a& Q/ Y j D' C4 Y - sub_451599_Font2_hk- W, K, z6 w* [8 g# \" I1 @
- sub_451599_Font2_hk2 {; _9 Q l% i) E& ?0 X
- sub_451599_Font2_hk
% b$ r8 g" `/ K - sub_451599_Font2_hk
4 [ Q/ C3 V, i: L - sub_451599_Font2_hk
2 v) r. d" c# Q' P - sub_451599_Font2_hk0 A% w( a+ j! l- V
- sub_451599_Font2_hk
1 W- P2 Q8 d. N - sub_451599_Font2_hk
复制代码 ) i7 v: R; q% `2 V' t( G0 b
代码, b* t! c% S' K2 x: K9 c
- #include <windows.h> Q1 c4 K1 G7 I/ J6 n' W
- #include <stdio.h>
( B" V) L1 W B- e- G - ; k6 l2 j1 m' e, q' q" B- C
- #include "patch.h"' {1 P$ n/ I0 C1 C3 {* E1 L% N p1 N
- #include "patchNibiru.h"
{0 A0 v& f( _1 z6 T9 T1 m - #include <GL/gl.h>7 u% g3 |8 R; u) L+ u1 ?+ q
8 u: ?, r7 B' y! V3 [" N
W" d' E: Y3 ?2 N( V; a- DWORD SUB_451810 = 0x00451810;
+ D5 A9 {4 ?3 Q - DWORD SUB_451390 = 0x00451390;
2 N* E6 F4 z' ^$ x) |+ ]# |0 P$ g - DWORD SUB_451599 = 0x00451599;; ?$ O7 L3 Z$ S) e
- 7 ~" G. Z) v* R3 p
- HDC currentHdc;
+ _' ?$ U+ J, p
; M: V) U) ~# e- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
: x; \, u0 ]0 D2 u; D4 ]: d' D - {5 A2 ?+ h6 C4 ?; O4 F( D/ @
- DWORD v10; // [esp-450h] [ebp-450h]
m2 E* j) c9 J4 ^! t8 n& T - int v11; // [esp-44Ch] [ebp-44Ch]
$ h7 a6 ?& S) M/ b- @ - int v12; // [esp-4Ch] [ebp-4Ch]
% I6 i0 H3 c0 w# j. @; I - int v13; // [esp-44h] [ebp-44h]
3 @" O% H0 \/ B( O$ v8 w6 A2 g* a - HFONT v14; // [esp-14h] [ebp-14h]
; a1 s; L `; u' `' t& u4 G - DWORD v15; // [esp-10h] [ebp-10h]1 B+ @" k% U) e) ^' U
- int v16; // [esp-Ch] [ebp-Ch]
$ C1 W# I& V3 B. d" L9 H/ E" U - int* i; // [esp-8h] [ebp-8h]! U- ?+ W, d1 M- {0 B0 I' O
- k/ a# Q8 R: o: N6 _ k- __asm pushad;5 {+ Y- j8 r/ C# E; g4 d/ o) j
- FILE* trace = fopen("font_trace.txt", "at");4 b. K" N) C* ?- \* V3 q# `* U
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");) I8 o9 I1 E' z% j; S" j8 M
- fclose(trace);
- _2 D$ m7 U* j9 F3 N1 k - __asm popad;
/ c' W5 K C4 M# o) v5 j9 d9 B& A - ! z6 ?( w+ U1 l7 V$ k1 l
- //if (!a9)9 E6 \) f( L) n9 I. Y% V: B( S
- //{3 h: n: @: [; `
- // AddFontResourceA(lpFileName);
: H1 C l6 U7 V" ]/ u8 _: l0 f1 q - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))0 B* Y* q# S0 [. A
- // ;( e2 b$ h9 @( C" }+ y/ w I
- // *(_BYTE*)i = 0;
2 E9 n# l$ a4 d. z. g4 \* k - //}5 y* k8 A) L c# `+ O
- //if (a4 == 1)
- {. N7 p; f9 O' V - //{
+ K: h. N/ H/ Q( Y - // v16 = 100;2 b/ _4 f9 d2 z! N, Q9 Q2 O& U
- //}8 T/ b/ R; w. A! T7 s/ l3 p5 N% O0 O
- //else if (a4 == 4)
) x$ K+ B- R/ \9 W& p - //{' A, ~* v9 C- L V& J; ^
- // v16 = 700;/ b& i! v3 o8 M2 s
- //}
/ N! U9 _1 u% ?8 \ - //else' O: q B# N! O5 N! A
- //{
. t% E" c7 x( g" a7 {: b - // v16 = 400;" h8 l" E% D$ R) h! E
- //}4 e0 `: @0 y5 X; R: f* p, [
- v10 = 1;9 f2 i! ]; T2 H
- //switch (dword_4AA490)
9 }0 k% q7 [6 C. X - //{+ u3 N4 G0 \* r) [
- //case 1250:2 H9 u' x. c( s9 A
- // v10 = 238;1 i! ]" k u' x# p ?& ?3 p
- // break;
7 t# U% Y" t* l z - //case 1251:! x' |6 j& g7 b: f+ d
- // v10 = 204;& J; i1 m- [& Y0 c; y
- // break;
7 n2 T" X& }: K9 o0 P; m - //case 1252:
; E B1 `" W# R! N F. a8 W: c5 I - // v10 = 0;$ i. n: @$ _2 B8 _/ P
- // break;# k( \5 m9 J# [1 b
- //}
' k( ^5 o3 O+ ~1 j% U - v15 = glGenLists(256);% m/ q3 [# n7 b8 a) i3 }
- v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
) O( y2 O. B* D& n! P# P - //if (!v14)! D5 B3 G* {7 B$ W& e
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
3 b" d3 p4 t$ W T( S# w# P: K - //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
/ Q5 h0 C2 [: E2 R b - SelectObject(currentHdc, v14);
: T5 t" m7 ~: m9 d# A - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
- l5 P( }) F" B- m5 }) [) X - % |% S# q) E9 G4 t. H
- //v12 这次出错' ]- B( G) D' v( ]4 k
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);: y; \" Y. ?$ y$ m* `
- 4 \' T* `1 B( ]* d
- //*(_DWORD*)a2 = v12;0 b, o4 [' d4 j
- //*(_DWORD*)a3 = v13;5 s, F0 }2 t/ ?& g; d
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);: X4 E4 b$ M7 z% k; g# _: ?3 ^
- //if (!a9)
4 L: G) p% L; f0 ]: a& q) ?! Z9 r) K - // RemoveFontResourceA(lpFileName);$ ~ Z% r5 f# r- _) @: }8 \- i
- return v15;+ d. H2 q9 X/ }0 Z8 n
- }" U: K! q0 s& [
) M3 k- k, {5 s. k: Y6 M Z8 D- //使用到- }6 ], j* z( S! H* A- k
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)4 N+ ^: `/ T# t8 a' ~5 Q
- {, G# Z+ @$ y* i$ X& T1 U0 x
- HFONT h; // [esp+4h] [ebp-8h]' A! y# R) N4 u# m- r
- DWORD iCharSet; // [esp+8h] [ebp-4h]: n. o [3 \/ t+ U7 K3 Y
5 R# O# i6 Y9 n0 j
2 R O5 ` l. k5 \- __asm pushad;
) z2 A8 ?: E- ?2 E5 X - FILE* trace = fopen("font_trace.txt", "at");
a2 R3 |" F7 P. B! A& f$ Q - fprintf(trace, "%s\n","sub_451390_Font1_hk");
8 [& n& E+ P& Y5 u+ T: Z3 { - fclose(trace);
8 y7 p3 g2 G O' a. h$ k+ t - __asm popad;, E, @+ l% T' y/ W7 k
- * ?+ b! n6 V( ^
- currentHdc = hdc;2 Q# x+ q2 q, ^
- iCharSet = 1;
9 T2 b" W' B8 Z7 Z - GLuint base = glGenLists(256);% I4 I: N$ S1 A' F. w
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
3 ]/ f% F8 l6 E$ j - //if (!h)8 F* I- _3 b+ q$ {) y
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);% v+ V1 L! S+ o; a# k% L
- SelectObject(hdc, h);: R) n- Y6 ?; U, _
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
4 F0 C, s, ]2 u/ k+ A - }3 C9 } k( G3 ?4 g
# a- v/ W5 J9 d- void __cdecl1 V, S7 a2 p7 g: P) e. d
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)3 Y( A2 v6 n4 g+ Q+ }6 j
- {
4 O) O+ R, S% f+ ~5 t* L3 X/ K - __asm pushad;
% s0 b7 U6 j" W - FILE* trace = fopen("sub_trace.txt", "at");
9 O4 t4 c2 O S+ u" F, k - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str); R, J C' l8 B1 [+ H; u
- fclose(trace);
6 ]$ S6 R9 _3 f- I% C% d8 l2 w - __asm popad;: k6 H8 r# y2 ~
7 ]5 K) a6 Z1 @- //return a1;3 M5 J' l- G+ K) I+ B& ?
- }7 V8 f8 Q( B Q, {8 Z5 P, J/ g+ m5 v
- ) s0 j) z& Y4 h+ E, g! X" i {
- bool. y; H3 V: t9 s+ F( M! C: z
- ApplyPatchNibiru()
0 F/ s/ ~7 v# Q) m% q - {, l" }5 q# D- Q- h( m0 E
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);/ l( Y( I2 r. s4 p, K) I9 [
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);+ s# t# w# h" P5 `2 T m
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
* S$ S5 f$ a$ |2 t - 6 W. k( p7 X% r) k8 a: |/ O
- ! L/ J$ p+ ^. u2 r$ ?
- 6 z5 b$ `3 L& V5 D5 e- C
- return true;* Z) f) _7 x) v, i
- }
8 @& W J2 Q, F
复制代码
' A' P c' p/ W( R9 P4 P7 L) R2 W) ?- q- F7 {+ q
% [3 w+ g1 f5 W4 k
9 K* ], |" A2 Y ~ |