本帖最后由 shane007 于 2023-9-6 11:03 编辑
5 V7 `8 L7 s+ [: x& y* `3 O2 E7 P% d- Y
(nibiru.exe 772 KB (790,528 字节))) P, Y2 ~9 r0 O, |& j
. s2 e8 N, c0 P. L' P s
将sub_451390,sub_451599 这2个显示函数进行了hook.6 f2 a) v( \$ L5 b! ?. v
确认这2个显示函数都被调用了。, ~! o* @. p5 f9 G, U
第1个可能显示的是调试字符串,第2个显示游戏字幕。
: P5 O* r$ l. i
" Z& ~2 c$ {, @( K) P以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。, R1 v" @. \1 g
$ u6 l9 C& l$ }7 v. f* C$ O
//v12 这里出错
2 L9 O$ P7 r* D7 i7 F8 w1 G8 M //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
; x4 \6 M' @ V2 ~4 F1 ]: N0 ?; L: L: u) G: ?. }; u7 B1 Q
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
% {; s! f; l6 i m0 Q0 H这种方式显然是有问题的,会影响性能。/ }/ ?! z, ]' v0 j5 r3 X7 y
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
* p& R* B; n, @& w D, s* v$ z) P+ s+ L) N' m# O
- sub_451390_Font1_hk. M3 A: g. J6 F0 c* v* Q
- sub_451390_Font1_hk& E, N; [1 G$ @% l
- sub_451599_Font2_hk3 i* [- _: ^8 M
- sub_451390_Font1_hk
6 a, b6 R* u: @" \3 P: @# b/ I - sub_451599_Font2_hk
) i. ~' p0 R9 `( Q% j2 y/ T9 v0 r - sub_451599_Font2_hk& Z0 a$ Y8 i# n9 r
- sub_451599_Font2_hk
- r: L# R) l: }+ G3 b - sub_451599_Font2_hk
# C6 P- t7 R- d4 j7 @& e0 | - sub_451599_Font2_hk/ g- W6 B' N: q4 \2 z% N
- sub_451599_Font2_hk( |, B2 I! q2 E
- sub_451599_Font2_hk
9 g3 A( B b1 Y' X - sub_451599_Font2_hk* R6 D( i1 L+ E; A& X t% F' R6 a
- sub_451599_Font2_hk
复制代码
* |" E/ l8 X/ B# N代码
. s& V& ^0 \( v" I6 K/ {- #include <windows.h>
/ L6 r$ [ M3 {! E - #include <stdio.h>
[# j1 e5 @+ L( M; }
# U7 q& v) i& n0 U2 V- #include "patch.h"
4 Z# j0 F6 i6 k. R5 ~1 J - #include "patchNibiru.h"- w' z1 ~6 u6 Z& e1 m/ i
- #include <GL/gl.h>1 s% u) X5 H3 r. N$ z* g+ d
- $ p! @* S9 B% k/ |( x' o
& T7 Y" I6 }) T' z; c- DWORD SUB_451810 = 0x00451810;
* g7 }* Q4 I. o2 j$ t# p - DWORD SUB_451390 = 0x00451390;( z$ K) e; G$ }8 i- g, ?; h+ A
- DWORD SUB_451599 = 0x00451599;# e, ^, ~* H& ] k# o( c: G( B
- 0 k7 q6 R. X; ]4 e, q7 `: {
- HDC currentHdc;
" I% L8 B3 _ Y D y6 O
7 I) `3 c9 I- I: O- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
# y+ P7 Q, B1 b' C9 J - {' B* P) d3 c/ c5 E
- DWORD v10; // [esp-450h] [ebp-450h]) v) I5 I& N; Y0 A
- int v11; // [esp-44Ch] [ebp-44Ch]" O5 k1 H* h& ^, Y% V- K. n' t; `+ u
- int v12; // [esp-4Ch] [ebp-4Ch]' f7 l9 [8 C7 X9 S
- int v13; // [esp-44h] [ebp-44h]
9 t a. y% \6 j- M0 u- V - HFONT v14; // [esp-14h] [ebp-14h]$ P! i C: ]$ z8 u6 z
- DWORD v15; // [esp-10h] [ebp-10h]. ?' ^" @* t' U! J: {& {
- int v16; // [esp-Ch] [ebp-Ch]8 A; x `6 V: i
- int* i; // [esp-8h] [ebp-8h]
: ?, b6 G! ~" e1 g - * J& [8 N) W% ]4 @7 ~
- __asm pushad;' w; L+ t, N8 Z
- FILE* trace = fopen("font_trace.txt", "at");
% w( s: N1 }/ H' M - fprintf(trace, "%s\n", "sub_451599_Font2_hk");
3 r7 |: V2 w, L* n - fclose(trace);0 f& @3 @% D# L
- __asm popad;/ e9 b8 v* v, v# W- P9 T0 ]
-
+ s+ |8 ^ O$ @& j' ]: r2 N - //if (!a9)
# ?; s! E. k& C0 w x/ P4 b1 t - //{( m/ K1 a% @" H( a8 L$ E
- // AddFontResourceA(lpFileName);
* \4 E F& t/ ]: W" s - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))* {9 h" M( ?+ h% l+ [+ T+ B5 e
- // ;5 M, e1 g1 @' c- S" W
- // *(_BYTE*)i = 0;; l5 e W. g! [ V4 j' M
- //}
5 B5 W# e' N/ Z+ }6 |( M- m - //if (a4 == 1)3 L6 w" [: ]& _; T! D
- //{) U; s& F- H) Z5 W# |9 C3 h
- // v16 = 100;* H- G9 c+ h# n' O* \; j7 j- I
- //}7 ?$ T- I9 v; A! c0 f2 w& G
- //else if (a4 == 4)
* G/ G8 H6 e/ `' R/ F* [' z* G - //{) i9 e# L. c' |" M" l& J
- // v16 = 700;
& v- j( a8 V/ e) e+ N - //}
% @& I' a; H# c - //else
9 m2 T* ]7 `4 V& \6 _& n3 G+ } - //{- f$ k- [! [) j/ u/ \
- // v16 = 400;4 j6 J }8 p% E9 l
- //}
/ ]( z+ j# ?0 g5 J - v10 = 1;
3 z8 l" n. N0 z7 E# K% c$ _8 r - //switch (dword_4AA490)9 M; J1 F- P# b3 Q* @
- //{: N6 O& R* ~6 ], [" I8 o0 M& m2 \
- //case 1250:/ H0 r/ `2 r5 U F0 ~2 O
- // v10 = 238;! b/ u0 T6 u' s" F, u" V) ]
- // break;
C6 @. G. V. c' S - //case 1251:& I |' e8 c: g1 A/ L5 a
- // v10 = 204;6 j& x, H+ j3 A% B0 w6 L
- // break;
3 h7 ~. d! M- r - //case 1252:
1 u: Y4 Y/ \+ c; v! @1 C) E - // v10 = 0;3 g. Q% k% ]/ q
- // break;
7 ]+ I: L, m8 F" y" P4 _ - //}
) V4 C7 R8 m! }" P3 x - v15 = glGenLists(256);
7 I6 m) k( t1 {4 k - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");' `9 @7 z, ?8 K; O
- //if (!v14)( q9 T& J8 {6 P) m' C% w, j
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);% C- I; q" i- [, L/ L/ e) S/ \
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
4 c7 O& t* g; @" X3 E( f; x+ X1 ` - SelectObject(currentHdc, v14);
9 A- Z$ O( T. j) R! y4 D7 Q - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
& Q1 B( p1 P8 m/ e6 @ - ; x: h* C" z! B0 t" R" v2 |
- //v12 这次出错
8 W% t1 F( G, @; {( u - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* }' J: u* }2 r1 `( a+ o' @& c; m
- - j! i& `( L; s4 V) x2 |& j* r
- //*(_DWORD*)a2 = v12;
* p$ U& i* S, c - //*(_DWORD*)a3 = v13;
j1 T, a3 G3 P# T - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);4 o8 A% {, ~; s# r
- //if (!a9)
( N$ Y7 Z& |7 g& \ - // RemoveFontResourceA(lpFileName);
6 z# \" e. M9 } - return v15;0 k7 Z% T' b9 O& K& x
- }
) L2 r6 R( \ @* ~) Z' u: K - : K9 V0 F9 z' Z& T. A5 C
- //使用到
& P6 }. ~- D& U) y" y7 h3 q: m' u - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
H' D2 _% h7 C/ A - {1 ~3 [+ ]4 N4 z/ r0 Q
- HFONT h; // [esp+4h] [ebp-8h]
8 P8 r; e; I/ Q/ F0 f7 {( I - DWORD iCharSet; // [esp+8h] [ebp-4h]) y i) W, }) e/ o8 E
- 2 K0 L K) j- @& c$ |# ?& U% h- C
- $ f' |" b2 L6 \2 }: c
- __asm pushad;2 H: M3 U7 [5 i( A5 P
- FILE* trace = fopen("font_trace.txt", "at");1 a. V( i6 |0 x! b
- fprintf(trace, "%s\n","sub_451390_Font1_hk");
* d: |0 |! S: n1 [; H$ E - fclose(trace);$ b! U! u0 }( L' F$ `: n$ s9 n
- __asm popad;
8 Y9 s6 F* t, E8 b G G( E) w' l8 a/ r
@% L" ?2 e6 V: x6 K: q- currentHdc = hdc;
4 k8 a. ?1 y5 C8 w - iCharSet = 1;6 Z/ | X D2 `; i- y1 j _
- GLuint base = glGenLists(256);
$ l: L @7 h) Q. E6 f - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
! C7 u; y3 _: S: L7 [/ ~% W - //if (!h)* K6 U) b: m6 `9 ]- A- K/ `
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
4 Z! C' Q% K9 ^% T/ q - SelectObject(hdc, h);, Y. V, m' C9 B) _+ @1 e5 p- u
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
, O/ c2 w+ m. }: Q: i - }
( q# x# w$ Z7 s+ O. a$ A' E- a - + g, s6 }& A$ }: Q0 M$ x# A
- void __cdecl
7 Z: t0 k% K$ g% D6 [3 I - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
2 p3 z0 B; |( S - {6 S. Q3 ]' d0 X, l
- __asm pushad;
- Q% E* z; m1 c* x/ N - FILE* trace = fopen("sub_trace.txt", "at");* ?6 I( P3 X- I* n2 o9 d/ A) _* m
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);) S( H3 T+ Q* k5 S
- fclose(trace);- _' E. [8 @/ ]. q& [" c
- __asm popad;$ ~3 d/ U J7 a; j5 N
- ' k0 h) Q6 B# [- ?. h0 D
- //return a1;) z A" r4 z6 X
- }0 t0 K9 @$ {6 [4 U
! f8 r9 L! B1 J2 s8 N$ p. X b- bool1 j$ C4 K" Y) b3 o& Y* A
- ApplyPatchNibiru()' P: ~- d/ N1 Q7 B
- {
* A" H* N* E# g# d% Y9 v. P2 C& B" e6 y - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
+ j; L: k* j4 @# x, N: U! w2 ]0 E2 H - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
* m6 i1 R. p3 E& P8 N3 V - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
: ~7 s9 N1 d5 c2 z9 i& s: K
6 V; J8 r$ n+ F) M1 E& f+ _- 9 q& q4 K8 e- T3 Q* N
6 }: w) W) ~- {9 q, L( N1 \! v3 M- return true;9 v% O0 g& { Y4 A
- }
9 T5 f: K; X! U7 M1 b
复制代码 : X* n) \8 k( M0 ]3 s7 V* Q
, L" v6 a: \ N9 F" w* O2 g" r/ x& W; u
6 M+ n; m" [ v1 p T! D7 k% {; b |