本帖最后由 shane007 于 2023-9-6 11:03 编辑 ' J5 }8 r: S2 V% L, Q1 P( l2 m& W
2 V/ |& |% r, F# K: h* @(nibiru.exe 772 KB (790,528 字节))7 t0 s" l( d4 z3 Z' o& ~
0 F9 D1 q: i3 @; x, O2 M# k5 ?
将sub_451390,sub_451599 这2个显示函数进行了hook.# ^3 |- t! z" O3 S1 l) S3 g5 d5 S
确认这2个显示函数都被调用了。
& I; x, e T5 J8 B# a$ H' Q9 }第1个可能显示的是调试字符串,第2个显示游戏字幕。 j8 C7 L6 a+ ^+ [$ A' l" S
4 T1 P6 N' _* W) r以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
6 z# L! m4 ]. c0 l
; n7 H/ f8 ^" X. T! W4 g' ]9 c9 F7 a //v12 这里出错
, A0 g6 \+ k4 [* l8 h+ |; _$ s //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
4 e) }/ ^7 v3 w& ~7 W
r0 l# ~0 C0 V. g/ E输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
* v2 y9 Z' V% \8 ?这种方式显然是有问题的,会影响性能。" ?. x6 f B0 d0 Y9 v
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。- Q) q$ o0 Z2 E( B1 U' [2 r
5 Y6 y2 @# o: M0 X: P# r5 D' K- sub_451390_Font1_hk
; J$ S0 Y9 V( K/ S! n1 J1 D9 [ - sub_451390_Font1_hk
- O) S6 d. l0 ^& W# K0 o - sub_451599_Font2_hk
: _0 P0 J1 P, J6 E# @8 t$ j - sub_451390_Font1_hk% M6 ]5 k9 q4 K; D
- sub_451599_Font2_hk; X9 c) _# e1 N5 F
- sub_451599_Font2_hk3 ] v- d9 d+ f& _4 i: n/ z
- sub_451599_Font2_hk; v# h* G: q8 L8 D: _
- sub_451599_Font2_hk
5 f- {! D# Q% a: I N& Q - sub_451599_Font2_hk
# H5 @' |& u& h0 ^1 K" \ - sub_451599_Font2_hk7 _! k( K6 g1 W7 e: K
- sub_451599_Font2_hk9 _. ~1 j; r$ Q9 r5 _
- sub_451599_Font2_hk
4 i, `# Q/ o' v% `, Y - sub_451599_Font2_hk
复制代码 ) c- X" C# [" P- ?. i5 z! Y) C
代码3 j* E* q. ^. Q
- #include <windows.h>
% s" i, m. }4 ^+ W5 ?5 X - #include <stdio.h>$ x0 f" A; c S
- * a! l& O4 W6 u: X- L
- #include "patch.h"& m4 X3 g# }( G$ Q1 k
- #include "patchNibiru.h": C$ n' q* q1 a% x5 f! G
- #include <GL/gl.h>! F" _9 C" S3 Q6 c) C2 |0 g4 E
- * ~ _. a% ~- j& p- e- j
! C/ O% T7 C' z6 g- DWORD SUB_451810 = 0x00451810;
: S; T& \3 T7 T1 F1 t% P/ P - DWORD SUB_451390 = 0x00451390;9 P; D" r. K% N! {( k
- DWORD SUB_451599 = 0x00451599;9 @% M) h# d8 ?% a" q
& P; B+ W# ?# A* F. @9 D- HDC currentHdc;4 b4 q8 `$ u3 t3 ?8 @0 m+ F
( I! @3 r0 ?# t* m" V- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9) D: I8 S# F- D6 U$ k2 v
- {
/ r* {- T# P! K# f, V - DWORD v10; // [esp-450h] [ebp-450h]
0 }/ \. I% d2 m7 ~ - int v11; // [esp-44Ch] [ebp-44Ch]' l% {$ t7 U# |
- int v12; // [esp-4Ch] [ebp-4Ch]
/ E# {& w' w: i - int v13; // [esp-44h] [ebp-44h]
8 K4 I% B3 b! B* K - HFONT v14; // [esp-14h] [ebp-14h]
/ S" s' {5 Z/ m# [ - DWORD v15; // [esp-10h] [ebp-10h]
; k4 ]( z- U. b7 y* }4 c6 p" [ - int v16; // [esp-Ch] [ebp-Ch]% X% B- W6 j' V" ?
- int* i; // [esp-8h] [ebp-8h]' P, R: m- G4 `0 L5 x
- 8 G9 Z* u% O/ G1 k& y& B& B0 `
- __asm pushad;
& a) U6 J" w4 [# } - FILE* trace = fopen("font_trace.txt", "at");$ f7 R D9 Q# u3 `* \) J
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
1 i) ]$ D; X% N' U6 R3 I2 W - fclose(trace);3 [% n1 j$ ]5 x% h
- __asm popad;: f$ M) T. g$ ]& o3 c. t( M
-
/ R* {, d& w$ {, E1 }. X: E - //if (!a9)$ r5 \+ q2 i" E, J/ y# d
- //{4 T5 Z) w+ Y2 P! Z8 N( r; t7 G& y
- // AddFontResourceA(lpFileName);1 C5 p( a8 y* D1 _- r! T3 v- N
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
8 r0 ^$ I( v4 `& Q- u - // ;
! ~" Y1 g' W: U% K - // *(_BYTE*)i = 0;7 l" C0 \) P) e5 W1 S+ w
- //}. Y6 [7 S3 t2 G# i) H* O
- //if (a4 == 1)0 {/ y4 [( D5 u7 X2 y4 {
- //{. s( Y0 ~* v9 ?. a( U) ^
- // v16 = 100;
7 _- J7 |' K8 a0 j - //}
. d) z$ }: k7 j% e5 w - //else if (a4 == 4)3 `! v0 \% F: u N
- //{
: ^) J5 W$ y" _8 G" \7 v8 S - // v16 = 700;
: |. B, `5 _/ C0 { \& e - //}
) g; M/ }' z5 V e - //else
/ ~, r9 d" h$ \& ^! v - //{
' q6 c, e" k7 \0 X0 T: I2 x( T( ~1 F - // v16 = 400;
0 ?/ x$ v; e# E" ?% H7 F* [ - //}
?; Y# r! G' i% w5 v - v10 = 1;
8 i' `% m7 G8 N" e! M0 z - //switch (dword_4AA490)
- S, m8 k5 G0 q - //{
# i6 p5 W6 m5 ^ l+ k" r0 r - //case 1250:1 c: u4 D; G _ i# u! `
- // v10 = 238;
: J& G: x6 t9 O5 d - // break;" r5 }& q7 j3 i' N! k q7 }
- //case 1251:
4 {8 Y: H( i2 b - // v10 = 204;
0 O+ e* W+ q b1 V" O# R - // break;
& {! O5 ^/ e' x+ J( ~4 A - //case 1252:
3 E, v6 m% I3 _( O! J: }. J% X - // v10 = 0;
: I: E* t3 Q u4 J$ }% ? - // break;
$ F O% p& V% E0 e( j, h - //}+ Q8 x! f. k1 m" v; Z6 p
- v15 = glGenLists(256);
" A& `* n5 D$ N) ] W+ h - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
) C6 J& `- B x$ n3 K+ E - //if (!v14), p% S5 p c/ `8 @7 g
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);9 \3 S) g6 L- s) ^+ ?
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; . ?" F/ M$ p& v1 n- G
- SelectObject(currentHdc, v14);
( a% y9 ?% F( q1 @ - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
2 W5 H1 `1 N* p - ( z. i) ~; F% Z' P1 {$ I
- //v12 这次出错
7 z1 h2 \# J( r$ }. r' N4 u9 Q - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);2 K3 s. j+ x+ N0 [3 |' a
- - ]5 O. ]' C- V7 e
- //*(_DWORD*)a2 = v12;
# j3 r4 @4 P; F1 q/ X4 u8 c% B7 L8 U - //*(_DWORD*)a3 = v13;
Q0 M7 l5 A8 r4 ~% _$ Y& ^ - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
' k3 }- Q6 H, }/ m/ ~4 `. I6 z, c - //if (!a9)% u d2 m% \: b0 C
- // RemoveFontResourceA(lpFileName);+ y6 u3 w0 I7 k3 U
- return v15;( A5 l+ h/ }6 N0 }
- }% X8 o6 D4 G. x* n" U
5 ~5 ?9 B0 e; O" t! X$ f2 r: `: @1 @! ?/ r- //使用到5 ^5 W) a7 `0 S% c A8 j
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
# N) h* {4 H/ N; u/ y- |- d o - {! n6 A' C) \# ]1 z
- HFONT h; // [esp+4h] [ebp-8h]3 d( j9 R" P7 J" F3 G! P" x
- DWORD iCharSet; // [esp+8h] [ebp-4h]! t v" Q! e; u B
+ X% `0 f- G# S+ ~' L) O' t
- Z0 q! C% N8 n) e- __asm pushad;/ x" S9 q$ S8 b0 j* Y
- FILE* trace = fopen("font_trace.txt", "at");
# X; e; y2 q) k1 f* } - fprintf(trace, "%s\n","sub_451390_Font1_hk");2 G% g5 b: ^9 ?. v* R: G2 T% y6 q
- fclose(trace);
! s+ C$ h3 X4 {5 M2 C) d# q# m - __asm popad;* C6 `! n1 x( s/ r: U$ D& Z, G
- - `2 `* ?. L6 C* W3 \$ U% t4 _5 n
- currentHdc = hdc;( h$ n" s. o% ?
- iCharSet = 1;
1 v1 R7 B3 P; {* b3 I: o5 R - GLuint base = glGenLists(256);
9 v- O5 B1 u+ D2 a - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
a+ n7 O6 ~. j% z: \" C! P - //if (!h)
5 s2 O, A1 J/ B9 G" O9 g U+ h$ M - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);& h" [* J8 Y& M* R, c4 t' H
- SelectObject(hdc, h);
: D; C! j+ u4 w& ^ - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
, F* T* U" z4 |" \$ }- v - }4 C+ V+ H3 R. C$ y
- : H1 s1 {; ^3 a
- void __cdecl/ ~6 E$ x# I5 W5 H: R
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)9 i s1 z4 J V
- {
* _# Y' E- a# B5 U0 ~8 { - __asm pushad;/ A# G) }5 j. U- [; u" E
- FILE* trace = fopen("sub_trace.txt", "at");
, j1 C- J0 {. T - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
( f: k$ ]- t- h: ^: S8 s - fclose(trace);: X+ o/ {* {$ y$ S; x+ u- O
- __asm popad;, D x2 s: r* H; K
- - b1 s! k# X8 j* J
- //return a1;
- G! E1 K9 S+ M# Z - }: Q( Y! G0 V: `$ R9 x: ?
- . c. f; {9 X( ^% q
- bool
0 P' N/ O+ w/ E# w& S9 l% ]6 M - ApplyPatchNibiru()% J2 v# H& h/ ~" Y8 m$ A
- {, z. L2 [4 s, |: k [
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);1 q2 |& p$ v$ E; q4 d1 K
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);* x% |5 i+ X3 Q1 n
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
3 x: N. c$ o$ q% N3 X& B; ` - * u% f0 L& ^& n8 Z% Y9 s1 ^
5 U5 t8 H9 @! \; _6 E
) |# I+ {. ~9 Y- return true;
( K# V% y- S( ]0 G* V$ }; d& Q - }4 W9 P. ^ z$ Y
复制代码
9 r: M- Q. t9 s0 o/ j/ l
& C7 v4 D9 g+ g* w7 R/ _$ {; ] E
+ `7 |8 L& M7 M; O3 U |