本帖最后由 shane007 于 2023-9-6 11:03 编辑 / x; s* ~2 h; x) |. l/ a6 z
1 j7 d( ^5 J2 w% f6 Q U(nibiru.exe 772 KB (790,528 字节))1 i: M3 X) W/ v) R
6 @4 S( X/ r! g2 Y1 S0 B$ E
将sub_451390,sub_451599 这2个显示函数进行了hook.
" u6 ]5 o7 a8 l N' J确认这2个显示函数都被调用了。9 e. |* s: n- ^
第1个可能显示的是调试字符串,第2个显示游戏字幕。
) ?: |2 u( N x/ O% P
* r1 u* u/ [( M- s$ [( @- I; {以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
' M* B/ h7 G* @$ n1 ~
1 N; p1 F' ^. C0 e- o3 U //v12 这里出错. |) \! S4 S7 ~0 H* E V ?
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12); Y& `* q0 ?2 h& t2 Z
}1 {- A, j' R9 ]
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。& c7 w- C$ u# @+ h$ _0 h; o
这种方式显然是有问题的,会影响性能。5 }& p9 u+ H4 P0 X1 _, m7 N
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。, X/ T0 D/ U; c' x3 k
8 s: c4 @5 r4 d9 i% x- V- sub_451390_Font1_hk
5 `8 g2 `$ ~5 g" P1 J) w - sub_451390_Font1_hk
3 f% w; d! u" L8 D - sub_451599_Font2_hk! u+ t2 b+ U8 c
- sub_451390_Font1_hk$ A: G$ Z8 C: h+ V3 T+ a' f6 i
- sub_451599_Font2_hk
) D# g. O$ a8 q% S - sub_451599_Font2_hk
) W8 l$ H) I8 F/ \ - sub_451599_Font2_hk
$ w. ?* U! X& d+ A3 [ - sub_451599_Font2_hk. R( W9 s3 v: [ l
- sub_451599_Font2_hk: ?# _: W1 @/ R% |- e: n; Y
- sub_451599_Font2_hk
9 _4 r1 I* o% N9 U) B; b - sub_451599_Font2_hk: K) K: b7 L9 I" y+ K; G
- sub_451599_Font2_hk
4 ~7 [; n6 K, F0 G) i - sub_451599_Font2_hk
复制代码
( I1 M r" P( N! |8 M. i; U t/ D代码9 }5 E2 D0 B- X+ n0 R7 X. L( a
- #include <windows.h>; O6 c1 J% V& N/ u
- #include <stdio.h>
& ~) _6 `. g2 |- l2 I( } - 2 V( K3 C9 n* k( C# I) |$ F [
- #include "patch.h"8 \$ M+ K0 A* w! [+ b( Z
- #include "patchNibiru.h"
0 A) n, B! P, A - #include <GL/gl.h>
. F0 I1 L$ z& _; z3 I- G) f5 z I% U - 4 Q: }7 T7 z& E5 j+ A$ ~
- . h A+ y3 v* ^4 [( H
- DWORD SUB_451810 = 0x00451810;1 e6 O' z6 P6 \# h, U# |0 N" @3 T
- DWORD SUB_451390 = 0x00451390;
, ~/ L' G/ r9 Y - DWORD SUB_451599 = 0x00451599;$ M3 Y2 g2 p4 l: h8 U7 j4 u6 h; g
3 C/ m3 }9 Q$ Y- ^- HDC currentHdc;3 y. t+ n) ~, _4 Q
1 w4 U; Z: U) M, r6 G- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
" n; D$ f+ f$ B2 X- E( m - {1 z0 ^. V+ D8 W3 r6 @- X) B, j
- DWORD v10; // [esp-450h] [ebp-450h]
, U; e- e/ v: o7 X - int v11; // [esp-44Ch] [ebp-44Ch]
: C% o: [0 }& w7 B% f7 E4 A - int v12; // [esp-4Ch] [ebp-4Ch] F) f% J" Y6 t' F- Z
- int v13; // [esp-44h] [ebp-44h]
& G0 ^1 ~* H2 w4 s! `9 j- t% [ - HFONT v14; // [esp-14h] [ebp-14h]
+ G0 G9 B# n& k1 I3 a - DWORD v15; // [esp-10h] [ebp-10h]! Z. {- O1 v4 h
- int v16; // [esp-Ch] [ebp-Ch]
0 c# c5 a+ o d5 ^6 [( r) }& N6 q - int* i; // [esp-8h] [ebp-8h]
1 C8 D; ?$ f. X! T$ P. W - * l2 q8 s3 I1 S; l5 n/ @
- __asm pushad;
4 W( l" `( e+ l, }& B; G, D A& C7 n - FILE* trace = fopen("font_trace.txt", "at");' \4 M! `$ T v' f8 {9 }" |* d+ f
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");/ b" T- D9 b& N- p7 A; h' u. ]
- fclose(trace);) d& x0 ~8 Q' d3 j! o
- __asm popad;
% h4 h8 j+ ], M -
' j. y- k% b% H6 u' w9 N - //if (!a9) _3 u1 Y4 a7 _: D5 O
- //{
2 [5 K) g& R! F4 S/ B5 ~9 x9 O - // AddFontResourceA(lpFileName);, b3 X T2 g, Q$ C" K6 R
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))2 v# C/ }" V* D. _
- // ;5 y* R; p. D2 a' f7 c- m" \
- // *(_BYTE*)i = 0;/ ?1 z7 r" [' L9 A8 ^6 Z. h
- //}
1 H) t/ ~8 c+ {) l; P - //if (a4 == 1); X) m+ \5 R' S1 H: i
- //{
' c# O7 v/ }) K - // v16 = 100;% _% u1 x) t4 p1 o& T6 g. ?
- //}% P- u( U: W, U4 D& d- }: o9 T
- //else if (a4 == 4)' S( `/ a: Q6 ^4 f' o3 P1 @* f5 ^! U
- //{5 O* j0 C v. G; J# {2 e
- // v16 = 700;0 ]/ l! A, l# }0 u1 X
- //}
0 z* G% q4 [9 f. t7 k- n) o2 e3 Z - //else5 {1 Q$ f5 o. q4 G1 J: S6 T. {
- //{
, V7 q5 b5 X* K/ G8 H - // v16 = 400;% ~3 t" T# Z! j! t0 C
- //}4 J. P! Q( g. f' w7 w) r. Z/ {
- v10 = 1;" |9 A' \" }7 t! O: n
- //switch (dword_4AA490)
0 e2 I h C/ w& C8 D- N - //{
; M3 t& ^! G- I/ Q y9 n - //case 1250:
; G* o+ p+ g1 s% m7 d0 p - // v10 = 238;6 R$ L* n2 u7 }0 A( a% L" {9 L
- // break;
. |4 b% ]1 {, S5 F5 { - //case 1251:
# X# @" M+ n; m. t: J* H4 k2 q - // v10 = 204;
- Y3 G5 t+ D+ w) J - // break;# \/ q1 X8 L: {9 D
- //case 1252:
8 e0 B. P2 ~$ n- e - // v10 = 0;# ]4 A! V0 P8 }4 ^
- // break;
; t' g) [- q; b$ v2 F2 t - //}
7 k0 D2 E3 V# t9 C! J0 m, X. l - v15 = glGenLists(256);
; x, p4 B' f9 P; ]3 M3 P9 V - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
! @- D0 c( I y3 P5 S) b* g3 P - //if (!v14)
& F" A7 m) a2 m& V# T& A - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);. W* K% s# k% N! M
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
5 H. }$ A/ @5 a2 [ - SelectObject(currentHdc, v14);
, {+ l& f. A% p/ f% K: E2 Z4 g \ - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
! d; N6 Q; A8 X+ @. r9 F - 1 ~1 W1 k" a$ Q5 ^3 _6 P
- //v12 这次出错/ ^6 Y S9 m& k
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);) M0 y0 i" I' M3 P+ Z' b0 z3 j3 F
-
* D' B/ [" W3 o- P/ f9 c. k1 u: e - //*(_DWORD*)a2 = v12;1 _ h6 ^ _2 k
- //*(_DWORD*)a3 = v13;0 W: o4 t6 b- u0 i1 y( a7 J7 ~
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
, D$ ?6 g, F5 T0 @ - //if (!a9)3 `% W2 r, m$ [( R4 n6 j
- // RemoveFontResourceA(lpFileName);: |4 A$ g% y! a, I0 x# {
- return v15;7 j6 M9 c( t. B8 H: J% ? E
- }% G j9 n. m4 S* g4 X% S* t
5 ?) _; v7 d# B5 r: x$ G% n- //使用到
# {; @$ s( }$ N8 N3 P - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)2 t3 {, Q$ ]5 }6 o/ q! G
- {0 |% s G2 B+ `1 ]7 g
- HFONT h; // [esp+4h] [ebp-8h]
" K8 M& w4 Y& {7 R& ^% Q - DWORD iCharSet; // [esp+8h] [ebp-4h]
0 {, U4 `6 N) i: n& t - ' O! O$ X" K% m E0 I! S
. G6 T& ^$ X7 e: W' ?& g- __asm pushad;- E% A! x, k6 I% f- J
- FILE* trace = fopen("font_trace.txt", "at");
" r. |/ p1 ~+ ~( ~ E5 z. Z - fprintf(trace, "%s\n","sub_451390_Font1_hk");, b$ e$ W; \& f" _: C/ T( H! G- ?- a
- fclose(trace);4 k) X. v; H) g* ?; b
- __asm popad;/ `( n6 M9 p# }3 Q2 Z* G
; T$ W5 P) M4 G2 {5 f3 l- currentHdc = hdc;- C+ M3 i6 x0 I( L b
- iCharSet = 1;
8 \" y( i/ Q; ]1 v0 m/ t$ ~ - GLuint base = glGenLists(256);
" K% V$ k& h6 V( w/ q# U8 [2 T0 n - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial"); X8 W2 P$ J2 j7 R% q: h
- //if (!h)- f9 s, ]- T" u7 V9 o6 |
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);) Y5 ?& n) I7 l) w7 x! I' a
- SelectObject(hdc, h);
# q& V8 a. ]* } - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
- L& _1 O+ P& w, M$ L* Z& k, G - }# r& @9 M( {: ]5 m
/ p5 l B7 f; D- void __cdecl
9 \9 j6 R4 @& Z$ L - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
" j! g: C8 z1 l7 _3 \3 D J - {. I; D* H3 r: D& g2 Q1 L E
- __asm pushad;
, Y1 g; V4 {6 R z- y. g+ l - FILE* trace = fopen("sub_trace.txt", "at");$ z* K' g8 z& y/ z. U2 [
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);) m8 o% w: I& y
- fclose(trace);9 O$ K# B7 L; Y5 V0 j1 M
- __asm popad;
. T. ?/ I- G) }& p& w - 8 X5 c1 r ?# g; p
- //return a1;
. L" O7 x0 ?& E5 ^ - }
~! l) i: k( F# d9 J; m% j! B4 u - , f- x+ J8 r' ]0 o4 Y* ^
- bool$ Z6 |4 E6 Q. K% O4 c
- ApplyPatchNibiru()0 [6 w/ B' T# I) P( w+ }
- {
( T9 }; U- J: d" Z* e - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
' M( b2 u$ ^' Y5 @7 b: C! Y - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
+ `: l$ u9 z; z - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);& Q: Q# o: m1 B! P8 Y" B: e- \' L9 |
, D. L; `* _1 j( M4 F
) q4 N/ u* C. ^. L0 R# J
7 a8 Q6 H/ F$ z: |- \- return true;- a1 H8 f' \( C7 L% ~5 W0 O
- }4 }9 s, J4 C4 D7 [) Y+ ~7 c6 W- E
复制代码 9 O5 n# q# X( ]9 i' G
4 B3 |! _! i! `! r
. u0 {( _: U: O# G. G& |
2 f, N2 B3 Y8 s |