本帖最后由 shane007 于 2023-9-6 11:03 编辑 & ~6 [, |# q) o# `2 ^
. c; z8 g) m% Y; Z9 d* N4 d/ o
(nibiru.exe 772 KB (790,528 字节))& Z/ ]& y9 ~2 f1 q$ k
7 z+ `, l" R3 y' }6 x) X$ B7 q* d
将sub_451390,sub_451599 这2个显示函数进行了hook." i& I0 ]0 C% \% l; {& y& _
确认这2个显示函数都被调用了。5 c1 Y! c5 _ A0 Z
第1个可能显示的是调试字符串,第2个显示游戏字幕。2 r; @/ \0 X8 N' v7 U" o R1 _) n
; f/ ~6 q: Z1 g+ q" K
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
# s( j1 D H* k8 `$ u- p1 H* B- Z/ ]7 F t8 t7 G
//v12 这里出错: b0 R. x4 i# F; L$ r
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
8 d) u) |; L5 H1 o% U; ^ I5 l5 ~+ s9 Q4 M
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。! \0 m0 m5 T7 G
这种方式显然是有问题的,会影响性能。# R* G3 h; V9 ^
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。- m+ Y, b0 A. y& |
" J$ C7 o2 ^# J! e! P- ^1 I. ]- sub_451390_Font1_hk: _9 \9 n. x+ E. q* F3 [
- sub_451390_Font1_hk' I) S3 [7 i- Q K* W# b
- sub_451599_Font2_hk7 Z9 k6 X, G9 P1 R7 V* V
- sub_451390_Font1_hk1 ~3 ?5 m h) o7 ?6 M
- sub_451599_Font2_hk
& A9 L1 X: g; y0 e; [; a - sub_451599_Font2_hk
" n- U! Y' m: z8 k+ y, n [- Y- e' j! I - sub_451599_Font2_hk6 O- t G; C2 u8 O' ?
- sub_451599_Font2_hk
. ~7 @# ?) A3 q7 Z+ k - sub_451599_Font2_hk% ^4 ]+ ~1 @4 y' o+ ]0 U
- sub_451599_Font2_hk
& H2 P' R* _8 O( w" @* Y - sub_451599_Font2_hk4 M2 W+ D- F/ {6 V9 m
- sub_451599_Font2_hk, { h3 f$ _/ ]; n' c
- sub_451599_Font2_hk
复制代码 1 p$ W( D+ \' s8 _ N% [3 B
代码
8 L0 u" Y& { Z8 e- #include <windows.h> o( T- P3 A' S
- #include <stdio.h>3 v9 l1 v+ O9 S! Z8 }
`% ]7 |$ S/ O+ w6 O: Y& [- #include "patch.h"0 _ r/ ]! |; \# L2 j9 c
- #include "patchNibiru.h"
4 b8 H6 h) B- z+ r4 e) C9 X - #include <GL/gl.h>( m: g. g: `# Z1 T0 ?+ ]
& R/ c6 X$ _: D3 A
$ `0 R$ b0 ]2 F+ x( x# `; T- DWORD SUB_451810 = 0x00451810;+ _. `3 E- {' c" o
- DWORD SUB_451390 = 0x00451390;! b7 g" N" k. O9 J- r/ t+ O
- DWORD SUB_451599 = 0x00451599;* d* X9 u* @/ i0 a
- % a% [! v7 R4 }. _, Q
- HDC currentHdc;9 Z/ R0 x6 V2 }2 D
% ?2 S' Z) s( w- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)# s% H" H" `7 d* f. g
- {
* x8 D5 ], t! m7 o- T8 K - DWORD v10; // [esp-450h] [ebp-450h]8 v+ Y+ z0 X# o; J- R
- int v11; // [esp-44Ch] [ebp-44Ch]
% \7 w# O) q; }6 g - int v12; // [esp-4Ch] [ebp-4Ch]0 \9 z) H2 T6 q# G) d0 G5 B
- int v13; // [esp-44h] [ebp-44h]
$ k% h4 W# A/ v3 _% x - HFONT v14; // [esp-14h] [ebp-14h]
% o1 n3 Z- b0 z. v- \# [ - DWORD v15; // [esp-10h] [ebp-10h]
! s m1 E- e% q8 ~ - int v16; // [esp-Ch] [ebp-Ch]/ U( J- ^$ Q/ B6 ~
- int* i; // [esp-8h] [ebp-8h]" `" N, Z' k1 i; t
- 4 ~; [1 J' X' d& Y) D
- __asm pushad;* f. V ?: A, R- y. `6 q
- FILE* trace = fopen("font_trace.txt", "at");% {! x' Q! n' q* S+ b
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
5 Y4 C* L! B' E/ d/ k - fclose(trace);
. s; t+ P, Z* ?+ B+ f- ^2 Z/ L - __asm popad;! M1 L3 a8 B3 W- K
-
( t) }( z+ s& a - //if (!a9)
2 Y" B4 ]' A8 N) L* [' p) N - //{7 L, w, v) Z, p5 a" S( Z
- // AddFontResourceA(lpFileName);$ N+ ?5 B* P$ [6 \
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
" q: @& i7 N/ c+ q6 G' t8 E - // ;
" e% e3 v( p i$ m, S+ j- Y5 o% m - // *(_BYTE*)i = 0;/ R; y5 U6 M7 h
- //}
/ ~; ]" S5 z8 w - //if (a4 == 1)" Y9 {( q1 Y' {& a7 U2 e$ w2 @
- //{3 N1 L6 E* h( \9 o& x
- // v16 = 100;
& f x7 n) F$ j/ z0 L+ _* ~ - //}
0 G5 u5 N1 }% b% ^" Y% e+ a/ W - //else if (a4 == 4)! ~ \1 T7 \6 O3 v* m5 o
- //{& D* k4 \5 `. X3 q5 `7 m
- // v16 = 700;! W) P( F# P( {" {* F
- //}- _ ~" w/ |: u$ a7 l. i% W1 R
- //else. `7 q5 _& [1 w! ~' A- F' y* ]9 A
- //{
/ p H: q6 W- Y* G: a! d/ Y' v8 T* K$ b - // v16 = 400;9 I. B9 C# v3 b1 w$ q$ w ~
- //}
- m& `. E& T" _ b - v10 = 1;7 r! F' `4 N& L- O! Y! L7 B
- //switch (dword_4AA490)
9 p3 }# q W' F, T - //{
6 O3 x7 Q7 C* g2 Z6 W& O" V - //case 1250:$ B- {) l+ A" Y( F3 w% Z
- // v10 = 238;
$ c# `8 ~, Z1 u+ T - // break;$ x* C! v* U. s/ B6 `# l3 _6 e
- //case 1251:
0 {6 J2 t0 ?8 n* T; X9 o/ p( @: J - // v10 = 204;
+ b( r6 Z+ \. y! v$ @, d - // break;
5 E: N* |2 B! y( n/ D' D5 m - //case 1252:
" z) H: R% s6 x! r' x& i( {- L - // v10 = 0;8 M& a: U5 _" x! O) {! k& `
- // break;
2 _+ { {, ]5 o4 t- P8 ` - //}
) s+ C! E- s2 Y- E - v15 = glGenLists(256);, r, M' U) T" R9 A4 q5 \9 g
- v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
6 K) R2 B. X7 Z8 ]! _$ P# K - //if (!v14)0 p7 S9 d% @ d
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);5 S9 i) |6 e3 m: m3 B" `
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ; m& p8 C& `; F
- SelectObject(currentHdc, v14);7 C5 G7 d1 A+ `) B2 F' M
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer); C9 K6 n1 u* ]' U# r+ y
5 ]* ?, F% G. O- ?* Q- //v12 这次出错
1 t! ^( z6 e8 Q6 k+ H) D$ h4 K - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);$ T# W, l4 |1 x! p
- 1 e6 A$ e0 {1 b/ h
- //*(_DWORD*)a2 = v12;
8 [- ^0 x; j6 W' |0 g& T' u - //*(_DWORD*)a3 = v13;; d3 Y% o0 _2 ~' U
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
* B& k9 [) t9 G" E - //if (!a9)
" M$ V5 O/ n# g( C8 h- C1 m - // RemoveFontResourceA(lpFileName);
/ _; J3 S6 Q% H/ P9 [( O; R - return v15;
% W3 i/ @3 k, ]/ a9 B! [5 G - }
7 x# y; u& T& m1 d0 o/ e
?$ K' R' v- ~3 k. E- //使用到
# q% z: D ]4 V1 T! o - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)' w! r! D! A N3 u2 {# K
- {; O- F+ m9 J& _
- HFONT h; // [esp+4h] [ebp-8h]: X5 J! F1 ` H* M, [4 _8 c# a& l" O* M# i
- DWORD iCharSet; // [esp+8h] [ebp-4h]
R/ F- ?/ Y) t2 S, N - # u3 V% i, Y/ @- ^. p2 P
- 9 F/ \' {3 \- D) t$ c8 e7 W0 D) C
- __asm pushad;1 ?# `; i% u x1 G
- FILE* trace = fopen("font_trace.txt", "at");
6 p; u. m. c4 ^3 `" X* `) a" n - fprintf(trace, "%s\n","sub_451390_Font1_hk");- E I/ M% r% q: G& f$ V
- fclose(trace);# p/ q9 O- b3 F% V; n6 K
- __asm popad;
8 E" K& j/ O7 }& Y2 j* T5 _5 L% o" u
/ h' {3 `2 {) s' }1 g4 J- currentHdc = hdc;
4 z# k6 }0 [! Z/ ~0 ?- J; T - iCharSet = 1;
# e' ~# y% `7 I - GLuint base = glGenLists(256);
. M3 l. ]& F# B5 Q$ { H! w B - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
2 E1 ^4 C8 R; k( ]2 q6 Z# h - //if (!h)+ E- h- f- S) N- F' C. Q \
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
6 `9 h2 J/ {( ~6 w* K - SelectObject(hdc, h);
6 R3 ?8 L8 _! F) X - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);% N1 E$ s/ g, a" s3 A; ~- p; J
- }0 t% _7 L% x8 s/ {$ u) r
4 I: R* s% L0 `% A( B1 D- void __cdecl. C; n/ c% y. T- D
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
) |- b2 L. G) L% L9 i3 Q; [. f - {+ G; h; x0 N- Q# O" k+ b' K/ }) X
- __asm pushad;
/ d( C6 U! M7 P0 [7 \% A' ^ - FILE* trace = fopen("sub_trace.txt", "at");) ^% }6 x/ b- T+ o! u
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);- V/ `/ Y% \5 m w2 n" b2 e
- fclose(trace);# q( v% i q2 a) R2 `- _0 b) k
- __asm popad;
. M, H$ K( `/ i
4 C& J3 u' p* e; \4 Q2 y- //return a1;8 I! V8 @+ I4 {/ D/ z z( z. P( l2 U
- }6 D+ L& A3 K- s* ?* ^
! s+ k1 f" r$ x$ K# b- [, Y& T& F- bool
3 x' x' \0 b& P6 r - ApplyPatchNibiru()
( ^* D8 C4 u0 {, [ - {) Q2 D* z$ g9 h! l# D) ~1 A
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);: c1 W$ l& X% q$ _! g, d/ f1 s
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);8 F. v- z: V9 b6 c, Z
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
) `7 p) E# a5 O9 C( A2 U# u T
: F& S+ }/ j% E# e- f: d- - G% ^8 T0 H! \7 u/ ~, Y, a Z U! w
. ?' k. S$ E ^; K2 J8 I6 y# N- return true;
1 |7 s) D# t9 H/ E& |" A/ H - }( v& j( n2 G; U* W
复制代码 3 j$ D9 n& D/ f/ g+ i3 ?
8 E/ `% E# `7 I* @8 @3 v! z
' f0 l4 z5 i7 h# `) X8 A
# e# c8 j% P# s* V, n |