本帖最后由 shane007 于 2023-9-6 11:03 编辑
: @; `7 [1 L% W x2 D1 z* x. R6 O+ J- @3 J# b1 p/ t1 ^" d0 x
(nibiru.exe 772 KB (790,528 字节))
' m6 Z0 j' U: V
; A1 k" @) L o- b将sub_451390,sub_451599 这2个显示函数进行了hook.- H6 s* i! x1 w4 O" ?, v2 W! h
确认这2个显示函数都被调用了。
( i* `7 |( x0 {8 G& e5 J @8 O第1个可能显示的是调试字符串,第2个显示游戏字幕。
# C4 p( C! b1 p# j0 U3 W: O1 e& ?: E: b: @. C9 t
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。! T+ {* R0 x* I! \- ~
; l& f3 \* c$ d //v12 这里出错
0 N# J$ `8 u, [" o' x, c //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);' P* ^' [% A- b, H
: H `# T) g! e5 `3 d/ A: F8 I. W
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
5 k5 j( z3 D- K0 F3 B这种方式显然是有问题的,会影响性能。
% Q/ Z+ o1 d) v3 ?2 x6 v在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。. Z+ a7 C. n& |/ {; \4 R6 n& Z& p1 u
; ]& U: |5 u# q- sub_451390_Font1_hk
+ c# F/ o5 k7 O& O- o# m* \ - sub_451390_Font1_hk/ Q4 F. B1 `3 c! O* W
- sub_451599_Font2_hk
* i9 A! O! R5 k, m4 W& l - sub_451390_Font1_hk& b5 b8 O X/ o' \
- sub_451599_Font2_hk
2 v/ t4 O- U) ?4 ?0 _8 e0 x - sub_451599_Font2_hk; o) ^! L3 w" N" m! J
- sub_451599_Font2_hk
, j. \7 p- T1 s2 U - sub_451599_Font2_hk4 |& |+ {% r% L8 p. {; _
- sub_451599_Font2_hk3 K: u% f6 H+ d) y; N6 ~
- sub_451599_Font2_hk; _, s8 a# Z* {9 d" X. O) `
- sub_451599_Font2_hk
. F/ D5 i" {3 b; ?. A+ |( j - sub_451599_Font2_hk, D" K7 o; u9 f8 n
- sub_451599_Font2_hk
复制代码 " M# u9 M3 ^3 P7 J! {3 w2 w
代码. m! e7 \( H( s# o6 U5 r
- #include <windows.h>) _2 t9 i M, z3 l. Z3 M
- #include <stdio.h>. ~4 W1 D0 K/ Q. i+ N
, ~. Z: p" ^ k6 j! F- #include "patch.h"% g( i1 z( T9 J; p3 G( e5 i! Y
- #include "patchNibiru.h"
' S; a5 p6 E, `2 {' F+ j F - #include <GL/gl.h>, K7 e) z o, S9 D2 I7 x
- 3 `, r4 w- ]9 u* u
, W4 D" V7 Z4 r4 h, g' w1 G- DWORD SUB_451810 = 0x00451810;
/ K4 D) t4 C% @2 W - DWORD SUB_451390 = 0x00451390;3 h9 h: T* R. C
- DWORD SUB_451599 = 0x00451599;
8 A8 K1 M- k9 d! h# } - 7 I1 ?6 d* }/ F) D; m* A& l; h( c
- HDC currentHdc;4 P8 U* d; I( w- o7 u( ~" x
- T; s, V, k! Q1 Z; I- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)% I& G# ~' ^( _, `8 _
- { D+ s6 V, H5 q- ^+ o
- DWORD v10; // [esp-450h] [ebp-450h]$ \4 I2 A/ W& X7 N* f+ w/ f7 I. g3 t, P
- int v11; // [esp-44Ch] [ebp-44Ch]
. c0 ^4 M0 k! M) I2 R: o Z - int v12; // [esp-4Ch] [ebp-4Ch]
0 |( u- R" n, G- ` - int v13; // [esp-44h] [ebp-44h]
- v% J$ @3 S) M& k - HFONT v14; // [esp-14h] [ebp-14h]
. M# x3 [2 }7 h: ` - DWORD v15; // [esp-10h] [ebp-10h]
3 K2 j1 T/ n) D, Z$ u - int v16; // [esp-Ch] [ebp-Ch]
: T$ f& D; \1 G% ?9 ` - int* i; // [esp-8h] [ebp-8h]
. C5 O1 d3 U6 {: [9 N3 X" \
; Q2 x/ M# j8 X6 O' ~- __asm pushad;
: K- Q( A/ d' y9 O5 O, r; v - FILE* trace = fopen("font_trace.txt", "at");% N+ h6 N+ K) f: b% B: @/ @3 w3 F
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");* n' i; w' Z. I$ l) K0 f7 P: k
- fclose(trace);# d5 y, ~8 H" K) R0 O5 M" u
- __asm popad;8 [& X. N+ W( c/ R/ }" h
- ( Q! P* a3 I5 `* ?
- //if (!a9)
9 F) f7 d% Z9 F8 _ - //{
& O- Q) M8 o$ [3 g+ Z: N& T - // AddFontResourceA(lpFileName);
`. S8 y7 F* v- e( p - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
) |' _) O8 U; F4 S; w - // ;
( e2 n5 M* d9 E1 ~! _/ L! l: |7 e - // *(_BYTE*)i = 0;! M2 J( @4 w" A
- //}
- |4 e+ l. b a. _& C* z; U - //if (a4 == 1)
1 F0 L: H f# P - //{+ L _" |! _& V/ c- R
- // v16 = 100;! R. R9 D- w# C2 q
- //}
/ u: M7 E, M, T% G0 r* k - //else if (a4 == 4)
! |6 ?8 v$ G/ [: D2 J; E - //{/ D s! \- M/ q: W
- // v16 = 700;
: v; R6 [+ K/ C5 H, Q; N* G - //}
* d" {: Q+ ]3 V: ]: k - //else
* }( M; a/ J; f) R - //{
6 K' _$ u) A. m+ ?1 n: r, r6 r - // v16 = 400;' V' q- n) y. t& p' r
- //}
r. J8 b, z# T( B5 \6 Q: L/ s* a - v10 = 1;
8 X6 p4 o1 V R* z2 i3 e - //switch (dword_4AA490), ]' i9 e9 b, ]! u" G5 Z
- //{& n; ~: C1 d% r
- //case 1250:
3 |4 W, m: X& T. K- C( e. ? - // v10 = 238;( y: `* X, x! j: F& H. l6 J( S8 v
- // break;0 J; R7 U9 _4 P8 s$ _
- //case 1251:/ Q8 Y; F: ~# V$ s
- // v10 = 204;
) [6 Q P( q, J6 J" y - // break;- b, P' H# J, K( F; b" k& s4 Z" i
- //case 1252:
; \& R7 k" \# d/ N0 a - // v10 = 0;' L1 Y8 j9 |$ p7 K! [- @
- // break;8 p: N9 G$ W6 G& x
- //}6 p8 E ^* y' O
- v15 = glGenLists(256);
6 R% t: d+ @" ]" E - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");6 \* A4 o6 ?. H n
- //if (!v14)
6 n$ }0 I: L' O* G" e& Y - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
: q& B& ^$ N! K0 b! W- l5 a, w) d) _ - //HDC hdc = GetDC(NULL); // 获取当前设备上下文; 6 K3 b, C6 y1 L/ z+ ?
- SelectObject(currentHdc, v14);
: n# x& ^$ W( \% g0 f - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
9 T' p' l3 z0 A5 N @- x - q9 r; t8 U6 [# {! H/ G' @
- //v12 这次出错
! m$ R G8 w3 Z; q/ h( f/ V8 { - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ @2 L/ ^* r4 x; z+ s -
( o- ?5 o( N/ h/ ~% B - //*(_DWORD*)a2 = v12;7 b ^. b1 J; x, d+ ? x. C: y
- //*(_DWORD*)a3 = v13;
1 ^4 S1 h o" c - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);! P" f0 L! w) a3 i1 f/ k
- //if (!a9)
- c3 \1 }' F: ? - // RemoveFontResourceA(lpFileName);
; r! R) X; m% L/ Q - return v15;) P" g6 n4 Y7 w! I
- }% B0 a7 k* B( k0 O( V4 v
" a2 M" W* K7 T( V- r+ b- //使用到4 M2 B6 V! D3 C6 Q
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
0 M# s/ D# l8 A' ]% x8 v) Q. Z - {" U9 b9 ]% d" B) m t
- HFONT h; // [esp+4h] [ebp-8h]
0 V. @# A* _* Q4 N# J - DWORD iCharSet; // [esp+8h] [ebp-4h]! m& P: z8 c, x z6 c- U/ s- P! T
/ c) Z/ B$ K3 I+ ]; r
0 U5 }2 W; J& N0 L- __asm pushad;
! G7 q) Z8 j% m: w9 u; S - FILE* trace = fopen("font_trace.txt", "at");
+ f' g, A9 Y: c8 z& X - fprintf(trace, "%s\n","sub_451390_Font1_hk");
' w: R3 v1 d" g. j- d- Y - fclose(trace);
& e0 X2 c+ h% e2 ? - __asm popad;; u! t" M1 ^5 T
- ( n, G3 _/ E! x: `
- currentHdc = hdc;
) I# S$ [6 ]# o - iCharSet = 1;
2 o6 j% Y3 |( Q8 ^, i% E) i - GLuint base = glGenLists(256);9 @. T2 ?$ X" \, e' x1 q6 z
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");, t/ z, S) j3 G4 i
- //if (!h)8 u' p% Z4 _6 b- N3 w) w* s7 q0 r5 a
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
5 @0 B4 j5 q/ M8 I - SelectObject(hdc, h);
9 w2 F6 k% L9 t0 e; d* w# I! {' d - return wglUseFontBitmapsA(hdc, 0, 0x100u, base); H8 T2 e/ s6 I# f8 C0 |/ @
- }
% {% }# e2 U( J) S* | X+ l
0 t+ w5 R; Z" y0 Q- void __cdecl
0 V! E5 ]2 _( I7 [ - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)8 w! X% D/ u% l9 }, e X7 C! S
- {0 f# C- y3 J7 l1 q
- __asm pushad;% l' X/ m8 N! u) E
- FILE* trace = fopen("sub_trace.txt", "at");! o' R; i, X8 I+ n5 B! f0 K
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);7 [ _ a; f& m6 [% v: Y
- fclose(trace);
5 c0 `% ~% L& }0 c% U0 `& p+ Q - __asm popad;5 r8 Z/ O2 v8 H
- & ^& b( X5 a& |5 v
- //return a1;% r! m0 A" R$ O7 O
- }
6 }( c5 v# k- y( j3 c - 2 G$ t; j- {7 U* F9 E5 l; N
- bool; r% J. s! V3 q1 u3 `( J2 I" I! p1 P2 h
- ApplyPatchNibiru()9 E& U- [, p4 A' R
- {
: S9 a( [* }) J - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
6 T; z/ o2 P9 a9 D( n - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);9 S- {. }) J( i5 M
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" {" @5 ? V, |
; W2 B' [- a0 l! A- t4 A0 D6 _- ; R. H; k4 m. ^
- ( x* Z8 G2 ?, ~9 y' Z- }
- return true;
9 {4 ]0 q: s- g3 R5 l2 b - }& ^2 t- i) B- {6 ?) z) {$ w2 }
复制代码
: W- h7 w& n$ a( r1 l* Q
: c- a9 `0 ?% j4 s3 j0 S. B. R5 H: j3 p0 Y/ |: k1 p+ C0 Q
+ v- {! Z# ^7 X6 W3 q4 f
|