本帖最后由 shane007 于 2023-9-6 11:03 编辑 8 x9 E Q0 Z! X+ b$ c
& m; K ^1 v7 t4 `8 {9 B(nibiru.exe 772 KB (790,528 字节))* q2 u. D/ U: Q
1 H$ P- J/ C1 v4 F- I' Z将sub_451390,sub_451599 这2个显示函数进行了hook.. U: ~( S# J" H7 g [
确认这2个显示函数都被调用了。7 {; I+ ]% q# U. L, c4 T
第1个可能显示的是调试字符串,第2个显示游戏字幕。
8 N ^7 G# h% M9 S9 W$ W) x4 Z6 \
$ X+ ?, U5 C/ `以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。 ^) ?2 {: k. v/ S
. L4 ~" a0 L1 p7 W7 c, O
//v12 这里出错+ @. P& d8 Y: B3 R
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);9 O' [ C+ }$ E. W
" u' Y# D* K$ B5 @5 M
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。- J* _( g" ~& k, B5 K- `
这种方式显然是有问题的,会影响性能。
1 C- t X1 x' U- \7 Y, ^ Z" d在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
) s3 M6 G/ y: `$ ~% _0 _( q% }+ K
- sub_451390_Font1_hk5 M J" Q: s" l0 W; p) [
- sub_451390_Font1_hk. l7 l- j$ h0 v+ i& F: e3 u
- sub_451599_Font2_hk3 \1 [+ o" D, {2 P; y% p8 N
- sub_451390_Font1_hk3 F3 t5 ^$ k8 O9 E
- sub_451599_Font2_hk
" u, c6 L8 U5 j7 x5 S, }$ ?; E* p - sub_451599_Font2_hk1 d+ A0 m; e' V
- sub_451599_Font2_hk
! K5 Z' |3 k7 G( G- y' ^ - sub_451599_Font2_hk
& m& |5 p- h. k2 S! n' y. G - sub_451599_Font2_hk
0 `3 E) u; U& [' @( I: G/ g. I3 [ - sub_451599_Font2_hk; ~5 ?" z1 E# G
- sub_451599_Font2_hk
3 d8 W) `* E% x: C ~5 R6 Y' d [4 N - sub_451599_Font2_hk) A9 S! d, o e4 j8 L: E! l$ t
- sub_451599_Font2_hk
复制代码
7 V2 {! z' b% q' v$ z5 G代码* P$ j6 O8 J# c' ]' p5 v* j8 I1 N
- #include <windows.h>
5 H2 D2 F6 o1 V3 t* k. k - #include <stdio.h>1 l$ B4 K2 F" f j2 u
7 {6 g$ U6 @- k+ g; o. I- #include "patch.h"3 D5 d: r& L3 c/ M6 X! I
- #include "patchNibiru.h"' n- I$ O8 ]$ _! t
- #include <GL/gl.h>
- ?& l- z" x/ i8 A4 D
& |2 a" h# a# Z- c q' i/ T- 4 @2 n$ ?: C$ L# W) Y! Z2 S
- DWORD SUB_451810 = 0x00451810;
. L$ y" [( @/ q - DWORD SUB_451390 = 0x00451390;
" w! Q* t. u3 \4 ]) Z - DWORD SUB_451599 = 0x00451599;
2 U) |9 ^' _, G, V/ H2 _ - : q* O+ J# y3 O. v; m9 F
- HDC currentHdc;' E1 o: X" }4 o" P. B" w
- a% p3 ^% a+ I9 T4 F5 `6 U4 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)
7 S) i2 m" J3 ]! h5 w7 c7 A, Q - {
8 T& W x; @% i' r2 h - DWORD v10; // [esp-450h] [ebp-450h]# q* t. ~$ H2 M0 M
- int v11; // [esp-44Ch] [ebp-44Ch]1 n, I8 o' \( a+ g7 k! m1 [3 n4 H- g
- int v12; // [esp-4Ch] [ebp-4Ch]8 Y& f1 Z5 I. Y/ n/ t# n
- int v13; // [esp-44h] [ebp-44h]* Q6 i, @ n, G7 ]6 d1 M
- HFONT v14; // [esp-14h] [ebp-14h]7 Z: x% B& b& ^% h9 t
- DWORD v15; // [esp-10h] [ebp-10h]
8 \. F, U- R6 b! Z- [* { - int v16; // [esp-Ch] [ebp-Ch]
. {: L: W- U3 B3 ] - int* i; // [esp-8h] [ebp-8h]- l1 A5 }$ o0 M5 U/ f
. e+ F! N/ s3 g# L2 M+ G/ _* B- __asm pushad;4 {$ Z& E" q- N9 C; M+ |& W- P
- FILE* trace = fopen("font_trace.txt", "at");( C1 Y) X8 I2 l, ~+ t
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");3 q0 z2 v! t! r, \
- fclose(trace);
! `8 I& V. P, D/ \ - __asm popad;
) _- o( ?5 @& P -
" c9 b, W8 C) u# I4 L' i& M- F - //if (!a9)
" @7 n e' E6 F - //{
; K* O( P9 C3 E. z - // AddFontResourceA(lpFileName);2 H$ I6 @" i! }, s" o$ A0 x( O
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
9 A# h9 r6 A4 N0 L( O+ M9 n T+ t - // ;9 [2 H; Y# T& |. J
- // *(_BYTE*)i = 0;) w% p5 D4 g% ^$ [( [3 Z( M2 Q
- //}# \8 D4 ^% Y% U4 Q) c" r
- //if (a4 == 1)1 b$ l# J& P } M6 P$ V, b
- //{
9 L. \4 E0 Y) P& e - // v16 = 100;9 |* D0 q$ i0 N# m& `. Q1 R1 [
- //}! [6 [. [' Q/ F9 b/ @ c
- //else if (a4 == 4)
# u) o3 g. j# B5 k$ S6 ?& r) N - //{/ B- i6 A; M; E0 Y
- // v16 = 700;
5 j! }, @# _( N, T/ O - //}- l/ b# |. S8 E7 n2 [
- //else
. S7 ?( n3 i& y [% j( [ - //{
* Z2 P9 l# }! `# c, z3 N+ x4 p6 B - // v16 = 400;
! z2 d+ f$ b; ?9 Y+ \8 T - //}
0 ?4 i9 |" ~1 x E4 b8 U& z6 [ - v10 = 1;
* ~$ P8 K3 h( e - //switch (dword_4AA490)# i/ g' v% R$ g, ]" Y7 I
- //{4 Q% _% A. ]. ] t4 R% r( P
- //case 1250:( A& ^6 r/ T" T" V W3 ]! m; |/ z: ~
- // v10 = 238;
. [ b" W- C) A/ e. U - // break;
3 ~" m; s. I% `8 F" { - //case 1251:
: P8 I6 D: a+ c( N/ w - // v10 = 204;6 @( o3 O+ ^! I) Q' f+ }
- // break;; P2 ]9 j5 V% z; l: `1 z' b Z
- //case 1252:
5 z' \! Y# L* _7 k1 p" O - // v10 = 0;
0 r% G1 Z; I# h7 O- e - // break;9 n# T1 ~/ q$ y1 E/ G4 t5 Q. T
- //}
% W) L8 u! {$ f- b) Q - v15 = glGenLists(256);
5 \0 _* S7 {0 a/ ` - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
: c% G- e7 ]) b, L9 c. \9 W - //if (!v14)
+ r4 H) p) Y A* ?2 T! T - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);+ r- b' \( d/ v& \1 X4 ^5 S$ m
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ) B6 c7 q A5 w$ V2 m" Z) f6 S
- SelectObject(currentHdc, v14);
) m" v1 r8 [# f" S - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);$ K: u1 I& {: L8 K
- $ z" w* l6 C! E8 Z
- //v12 这次出错, O1 F, ~2 ]' W8 P' V( V2 x. @1 n
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
' `; `& f% y$ y; k - 0 y8 a5 n* Q. S9 Z. J: j
- //*(_DWORD*)a2 = v12;3 `4 N- V3 y. J' ]
- //*(_DWORD*)a3 = v13;+ M- U( f: s$ j: y d! l$ i! l
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
o0 O# L8 ?" m) R - //if (!a9)( b# h' w. G8 x1 x2 c! m
- // RemoveFontResourceA(lpFileName);8 k+ S Q/ u6 K& Z
- return v15;
0 p4 H% y f: r. o2 t( h1 v5 ?% w - }( V& m& E, t$ X# F# u# o0 x3 I
/ O! |9 t" z5 a- R( E, h4 _- //使用到8 Y B! c8 {' I* O: Q% S; x
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)% s9 V- B. ^9 {% s1 t2 I
- {
$ D; v n/ d1 b - HFONT h; // [esp+4h] [ebp-8h]
$ A) _$ l# H @% A/ L# l3 C - DWORD iCharSet; // [esp+8h] [ebp-4h]
+ ?/ D1 }6 _' o# @ - 5 Y9 x, `+ M; ^$ e5 P% L$ h
[' h7 ~+ o" F6 q7 ~9 z- __asm pushad;! t# h T; |8 m' z0 L
- FILE* trace = fopen("font_trace.txt", "at");
0 X* L( A' o2 T, x7 a' a5 \% p - fprintf(trace, "%s\n","sub_451390_Font1_hk");
+ t0 e# S5 v3 ^4 O' z: N1 I* q - fclose(trace);
& |5 f3 @4 E) U: W& S - __asm popad;$ r6 q y' z% A/ X' P; O5 [0 n% I. g. E
U: c3 h# N- G/ M8 ^- currentHdc = hdc;
; ?+ f' ^! P" r* q. ~ - iCharSet = 1;
( O' u. t; z6 i; G4 i2 Q - GLuint base = glGenLists(256);
! A, F* f% x. V. A+ r - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial"); t- n. R1 I2 L& @
- //if (!h)
0 R7 Y5 M5 u0 e - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
1 l# y1 S6 h& B% y8 L9 U4 }; ] - SelectObject(hdc, h);( s; E7 ]% a" ~1 q. }9 X
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);3 r& c- |! F8 o0 V9 I) {1 A1 r* u
- }
6 u4 G# ^8 X6 Z! y: h3 P
, f0 b! x* S( m+ ]% G1 p0 l- void __cdecl: `$ p7 e. h: c; K9 @5 `
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)3 E% O3 d" b2 l* n- U4 N: O2 \& p
- {
3 t# z( z- O# Q Q! Y7 l - __asm pushad;# O! t# T# H" \- A5 Z* r
- FILE* trace = fopen("sub_trace.txt", "at");
/ ~: n: q$ u/ A0 R1 r2 z - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
8 I! `2 [) N! H - fclose(trace);
/ H0 _! ~. f+ C0 z - __asm popad;' j( V8 Q: u2 b2 p
- ( w! n7 \4 o3 e$ w0 S
- //return a1;/ n; Y+ H# x' Y) m1 r
- }: R/ Z/ i9 j8 R/ W8 e( W
. T. @! D6 X+ _, P% @- bool
/ I6 r6 S& T8 W9 _9 ~9 \ - ApplyPatchNibiru()3 H7 C* s' \. m0 }3 H. @: J
- {$ h/ d2 f3 M' a. U# i5 h p
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);' M; a& l, ? S+ W4 [5 ^0 P: d
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);6 c* b/ R; i1 A* e" n5 X
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
8 y1 C% F }5 Q8 G
1 x+ n3 c% s5 Y2 D3 b$ R6 Z# E- - l) }: T; G" R* @4 P# y5 O) l' T
- ; y% Z& D* p0 r3 S
- return true;
0 d; N3 }" Q6 I h; D$ { - }* G- ~2 T7 V7 E1 I7 X
复制代码
6 f9 _) f8 Y/ Z, d6 a1 J; Q' B& S' q% x5 P
- y# T2 ~+ [) h( ]) d9 r! N3 `3 c. A! w- @- s
' E7 K# p/ B" f0 L( l! P) F* | |