本帖最后由 shane007 于 2023-9-6 11:03 编辑 : j9 m" b6 z# h
- l: b4 \) h) s: @9 a(nibiru.exe 772 KB (790,528 字节))+ {- Y: `* E3 Z. j) Y; N d& [
; o0 A$ c2 R) E1 s1 r6 [将sub_451390,sub_451599 这2个显示函数进行了hook.
8 y. i0 C, W( l+ j确认这2个显示函数都被调用了。
. g5 y1 j/ }" U. z/ Q2 o1 D第1个可能显示的是调试字符串,第2个显示游戏字幕。
! i+ P1 S! c5 @: e% t. S0 N+ j4 `5 G, [0 ]! ^( @# @3 C& O; C i$ z7 ~
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。* l$ E, \1 o: s
! T+ j8 l5 F* b. n M+ p //v12 这里出错
7 f9 r6 H3 n/ p, S7 w& Z+ p$ t //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);7 Y8 {+ i u2 i5 ^! z6 T
" Y+ z- s( d! {' Q" ^8 E ]( S输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。+ a/ i. i* l3 l
这种方式显然是有问题的,会影响性能。8 Z7 n9 H8 e$ }3 Z
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; |! a3 g6 ]! h/ {' a+ R$ b# u9 l: c2 d- M) N
- sub_451390_Font1_hk
# E( q5 w9 o0 x - sub_451390_Font1_hk0 Z; w X7 E- ~/ G ]6 a
- sub_451599_Font2_hk1 x$ S+ }* q2 q3 H7 {. m0 r7 {
- sub_451390_Font1_hk
) N2 P2 ?0 _5 L1 y( [ - sub_451599_Font2_hk
, T( r" O9 k: M1 x! L: _ y - sub_451599_Font2_hk4 X# h, A5 g, i4 _3 H
- sub_451599_Font2_hk
% E; N0 ^& N5 J! j/ e - sub_451599_Font2_hk
8 h$ T5 o( a$ ], `9 T8 B( U: n, k - sub_451599_Font2_hk- j( J2 H8 `3 w) A# ^
- sub_451599_Font2_hk
; J" e# B+ ^! W1 s- y - sub_451599_Font2_hk& z5 Z- F+ e( O% n
- sub_451599_Font2_hk4 f9 l8 p* p- o3 k1 _2 c( U( P8 L/ P' q
- sub_451599_Font2_hk
复制代码
% s0 Z, D" _4 ]# C代码5 X; ~9 C! g& O7 V( j
- #include <windows.h>
; _' P$ ^6 `/ G! T+ | - #include <stdio.h>
3 G+ i3 z2 u) o* Y- E9 V - 6 F s# y$ v% m( j1 j+ C4 y
- #include "patch.h"0 j$ ?! a5 F; ]/ X% s
- #include "patchNibiru.h"! Y4 h8 ~5 c# |4 A0 c, X
- #include <GL/gl.h>
+ f6 [$ \- ^$ ^( l, S
d( X* X" v, A( Z- 6 I1 {$ @) O9 ~9 y8 u
- DWORD SUB_451810 = 0x00451810;0 }% q' L% _( K9 x8 }; _
- DWORD SUB_451390 = 0x00451390;
0 b/ Q i0 h# X - DWORD SUB_451599 = 0x00451599;. a+ f& d$ p$ H% K
- 8 g# P" A& t( ^5 h2 X x9 L: L
- HDC currentHdc;
. z9 `* ]% N2 v/ ^: T
/ ]( m4 q8 W+ ~- s- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)" j6 d, M7 M; G0 r. N( e4 E/ O
- {7 o* p! m8 F0 H/ ?6 U* F9 U. a
- DWORD v10; // [esp-450h] [ebp-450h]
* r6 E) y. X7 C6 f& ~4 G! K4 x - int v11; // [esp-44Ch] [ebp-44Ch]' ?# B! T0 N+ E" p2 O e# O0 e7 y
- int v12; // [esp-4Ch] [ebp-4Ch]# [" ~% d. d: j1 [& X3 a
- int v13; // [esp-44h] [ebp-44h]
`1 U1 p# N- A9 j$ ^ - HFONT v14; // [esp-14h] [ebp-14h]9 V; d8 c4 h7 {
- DWORD v15; // [esp-10h] [ebp-10h]7 c9 X* x5 W5 Z' B) x6 ]1 N* I# j
- int v16; // [esp-Ch] [ebp-Ch]4 T, j( N j; w F0 `
- int* i; // [esp-8h] [ebp-8h]4 Y+ i& Y2 [8 d% t/ x5 T$ m
2 N6 _4 d8 i" U$ [5 ~- __asm pushad;9 w" s h7 L* S8 F8 {, v( S2 W" e
- FILE* trace = fopen("font_trace.txt", "at");( ?" Z( x O% u; Y& Q0 k
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");' c1 t7 x/ u, I3 ^
- fclose(trace);
: ~- h: M4 y' w( X8 u - __asm popad;
! Q! } t& O5 @% n4 A6 ? -
n' v3 |+ B" `9 O# o e - //if (!a9)
* }' W) s7 S. H - //{
" v/ X0 F% L- N2 X" Y - // AddFontResourceA(lpFileName);: ^) b3 u% x8 u B% V
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))& y2 M- A) m' u: w( L
- // ;! v+ t( v, t; n8 v
- // *(_BYTE*)i = 0;
) J9 X9 [0 S1 c1 t - //}# X$ J9 L! R$ E5 n
- //if (a4 == 1)
7 M; A3 J9 r2 S$ ?- e - //{
: L. J' Y6 \6 T2 d7 @8 A - // v16 = 100;+ s. b- i' X; X" t" s( x
- //}
8 j9 h% V. O: L1 \) L4 n1 ^. j - //else if (a4 == 4)
# \1 V( P( O; i: E- {% V: U4 c - //{
}& u- M6 W/ J - // v16 = 700;
1 G+ \# A8 k( _7 F# B( M' p - //}
( F4 J8 H* b( B; p0 i5 t - //else
/ _* W% V5 S1 p* {5 r1 r - //{ S( V: y5 _* c6 Q
- // v16 = 400;' l, M4 l+ \ J5 _) K& h! v
- //}
( e4 q; A R4 ]1 L9 f - v10 = 1;2 x W; O v8 \' G$ w* e- Z5 ^( \
- //switch (dword_4AA490)% ^2 M8 @7 ]! Y; Z, `
- //{$ ]2 n% X8 x* T7 G
- //case 1250:
* E J: C' J2 g, a @4 }, F - // v10 = 238;. G% v3 ~* I# ?% N% w. x! E
- // break;; C- w+ z A, u$ X
- //case 1251:0 J7 m2 k6 N/ j; e2 d' |/ x1 d( G
- // v10 = 204;
- x! J1 y- F0 [$ i6 f - // break;
; Y/ M. g' N! w0 h - //case 1252:5 b) c* w, V: ^% k
- // v10 = 0;* O) G+ y! `9 i$ {/ Z; _
- // break;1 k8 T+ e! M5 V& n' c
- //}, k* C7 }/ m- N7 \- |
- v15 = glGenLists(256);" E+ h4 H+ L: f
- v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");8 e+ L7 c. q [$ B0 Z: G/ [: K) i
- //if (!v14)
5 o( P9 ~- ?; A, x) v - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);4 I3 E* z' r0 A+ Q; r- o4 X0 p$ ?
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 7 \# T. W/ e, O) }$ K& r+ e
- SelectObject(currentHdc, v14);
; [% |7 B/ c# n- G - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);# I9 ~4 x! G/ p
% t, ]# _/ s( ]- //v12 这次出错0 Q2 ^/ X8 p" v2 e. H9 w% s- h
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
, a( } J/ R3 K7 Y -
$ }+ ~/ K7 T5 R6 b. D9 G - //*(_DWORD*)a2 = v12;
5 c p* G7 m! Q s7 _) \ - //*(_DWORD*)a3 = v13;
& }4 B7 z! U2 _" k4 Z - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
7 r; n9 _& V6 F+ n5 d* _: K - //if (!a9)5 q) @9 e+ ]/ j! D
- // RemoveFontResourceA(lpFileName);
# j1 }4 l8 A% B5 q, ?2 o( b - return v15;
5 B3 _) ] C" K" R! ] - }& R) H# e s% ^) ?# n# P* i
- # t. O- B7 C# K$ C8 R$ x, B
- //使用到
" h" y" k/ q% ^4 }4 v% Z/ s( s - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
# @' X( B9 v( b, A' f! B - {, i& C. }( x- v+ L* @6 T# q
- HFONT h; // [esp+4h] [ebp-8h]
) s( H* S1 Q6 q; n1 _5 P0 P5 g - DWORD iCharSet; // [esp+8h] [ebp-4h]
b/ M* k: J: b% F/ T - ) S& {8 \! P1 ^& m* F V
8 d# h7 l$ m" A) B) |% k- __asm pushad; J2 i& |" ]& c, N" t( V. n. x. P
- FILE* trace = fopen("font_trace.txt", "at");
: W. i' E7 a5 T" P2 o4 } - fprintf(trace, "%s\n","sub_451390_Font1_hk");% }% U2 ]( l9 q9 c( X3 K& g
- fclose(trace);3 S- G5 `! _( q/ ]1 W1 b$ L
- __asm popad;
" e& M% ], ?" k' P: |# o# R: w4 L
6 ~/ n8 r g& @" `: R- currentHdc = hdc;1 } b6 v2 ?+ A# A& |% O8 @) |0 E1 D
- iCharSet = 1;. z, f& @9 X4 w" g
- GLuint base = glGenLists(256);
& Q% G) {/ w A; e: p- A4 N - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");2 f/ i; ^ Z* q
- //if (!h)% a6 H( R. m) V1 w/ j3 m
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);+ S, H4 }! j S% f8 O
- SelectObject(hdc, h);
2 F8 ^* z0 v0 G- s. S - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
. ?7 ?, W% j7 }% V- e - }
( [3 D+ f+ [) G2 T" X. ]8 { - ( I- S) T. {1 d% b% ?
- void __cdecl6 F4 ~2 g o0 Q$ _0 L
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
6 V$ q! h' ^. r+ b3 ^ - { Q; v* q9 z. y" w P4 m& g* x
- __asm pushad; o, F' K$ b7 G: C7 j; V p w# N* \4 _
- FILE* trace = fopen("sub_trace.txt", "at");: z5 O: A6 j8 Y2 I; g
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);& S7 t4 F b- l1 j* B7 Y
- fclose(trace);
- A' H6 \4 b( d$ K) F" {4 d# Q8 m - __asm popad;
2 M/ b$ P, J+ B' @ - " S% |! {) i9 K4 S H3 E* y' Q! U
- //return a1;
j: q+ j y( Z. y5 B9 m/ B - }
* R, S( v' ~+ d7 i7 L6 r
0 g8 E8 P( t/ t: @. B* h- bool" @+ j' U7 E: A$ |9 T$ ?) I+ s
- ApplyPatchNibiru()5 ]: M8 \. d: L# K- Y- m
- {
& v6 M$ _0 p+ s4 `4 ~9 b D) r% \ - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);# v; T8 u* X, N+ G+ q9 c7 Y
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);, `* ?9 `/ U& W% G; Z( |
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
8 D( Q8 N4 N3 T! V% ~6 `! @* D3 H
2 @3 R9 s* ]5 u, i8 q
4 W) A% h+ J6 C" y- $ `* N, q3 i0 n3 `% F
- return true;
- B1 E" r' j; ]. v3 _! n - }
& b A! r5 F% d9 Q ^9 [
复制代码 / X) {! ~' u* u, K
7 {. ~ @" x; u
( _. u3 r9 u% F" \; _8 \
. o' c0 B9 A8 A* n |