本帖最后由 shane007 于 2023-9-6 11:03 编辑
, D! Q! A+ N3 h; [+ o$ J: i
i1 d3 n2 c* a$ t/ F(nibiru.exe 772 KB (790,528 字节))
/ u4 a G! c7 G# K+ Q |
* `% L7 Y5 @6 f/ \3 J+ ?' A) W3 ~将sub_451390,sub_451599 这2个显示函数进行了hook.
5 M5 |: m# A3 y' V" P! \: w; p4 V确认这2个显示函数都被调用了。: g1 \' g6 t( m( p
第1个可能显示的是调试字符串,第2个显示游戏字幕。
; Q, b& i( f( u8 [! K
3 O+ d9 \0 u( z/ u7 v以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
$ Z: `8 I& C: O [
6 u! c' D# g/ ~: Y/ h) I& s) c //v12 这里出错( p1 [4 f! G/ q( `( H0 z
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
5 y0 N) F9 S2 j9 L# ~5 `% q$ A% }5 x8 V5 q! e3 A
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
. L, h, c8 m- k/ k, I/ ?" s这种方式显然是有问题的,会影响性能。
1 h- T/ Z j Y7 `在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
/ v" u6 J. o3 M2 s- |( W. _: N# b
( m! _" L; Z* J- sub_451390_Font1_hk
5 v/ r2 {! |( }1 J x - sub_451390_Font1_hk
, i; _3 V+ t) a4 h8 f! t3 W - sub_451599_Font2_hk2 S/ S6 m1 c2 C
- sub_451390_Font1_hk
& m! f( w- ~' X+ e$ y - sub_451599_Font2_hk% d4 ]6 q, L% L6 [1 C* M1 Y
- sub_451599_Font2_hk3 D- T- s4 l* W0 [! D
- sub_451599_Font2_hk
e& t2 k$ P" ^3 u( _! D9 D( P - sub_451599_Font2_hk. v+ i( q3 o9 J# h0 J6 z5 P
- sub_451599_Font2_hk
0 s d$ T8 N0 q' ]" {# B% C# P% p - sub_451599_Font2_hk
' g% J5 ^: f( f1 x* B# @ - sub_451599_Font2_hk
2 N/ ?* i, e6 k7 [ I - sub_451599_Font2_hk
* n( n) o% i* ?; n$ @, | - sub_451599_Font2_hk
复制代码 9 r" Y1 Z8 e% `! a% p, V
代码/ ]. I* {- i( d- J" z0 F
- #include <windows.h>; l% Y# K! E! a. y$ V) g! l
- #include <stdio.h>6 _& H5 v6 z/ O3 x* y$ }
4 h9 J- I: r/ v- ~: t$ S+ V- #include "patch.h"
. X. [" g5 K% |( i# T7 r - #include "patchNibiru.h"
0 w% q# p4 c$ Z, Q - #include <GL/gl.h>
1 f- m5 k6 z- t8 A) p
& [$ K+ p' l- W7 [- H9 ?9 a" N' |
* I+ t2 y/ R k g2 c$ X+ a6 [- DWORD SUB_451810 = 0x00451810;
$ _& _3 a+ U t! x, {( c - DWORD SUB_451390 = 0x00451390;( Z$ }7 z0 P8 b5 A* N
- DWORD SUB_451599 = 0x00451599;
- d: p0 f" J! y* m$ M - * t. F' k M. P
- HDC currentHdc;! E* P# c( [( e
- 6 i. P1 Y- b8 s( R
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)! H8 J- y# u3 u. L: f' s" m' g& J
- {4 k% H9 Y: B# D. I7 }/ ]
- DWORD v10; // [esp-450h] [ebp-450h]
1 s% L5 d: I; R# p - int v11; // [esp-44Ch] [ebp-44Ch]: [$ ?+ h7 i) S& ?: S$ r& s, E
- int v12; // [esp-4Ch] [ebp-4Ch]
4 }7 Z, L( E; z/ y0 h - int v13; // [esp-44h] [ebp-44h]5 u& ?: F6 w# m0 _- d# s
- HFONT v14; // [esp-14h] [ebp-14h]
7 H: ?/ } R3 w, s9 N% R, C) s - DWORD v15; // [esp-10h] [ebp-10h]
9 J/ t5 n% w3 [+ N2 ~* v - int v16; // [esp-Ch] [ebp-Ch]6 \9 _$ A# M6 b, U
- int* i; // [esp-8h] [ebp-8h]
* V+ r. \2 u# h/ g! S B - 9 B; }* F4 u! P) H! m) ~) h# P% X
- __asm pushad;4 z" [$ _: h4 L7 X" {% ?, B, K
- FILE* trace = fopen("font_trace.txt", "at");- b4 l/ j% Y# q2 Q5 f9 |
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");& _) M* k2 T! F) L ^' O2 P" C
- fclose(trace);
5 i& H7 Y" B2 C3 @" s& O3 B3 J; D - __asm popad;. |6 N1 r- J) L% s f7 G0 K& q& R
-
, T% t( O; i+ N" w, a - //if (!a9)8 `" N$ x, L7 I( i2 ~# j
- //{
7 R2 m* o5 }3 `0 Z: {% ]/ ~6 e - // AddFontResourceA(lpFileName);& o1 t% J# b* B6 U# P
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
, ]* l( b& ^0 J5 }; k - // ;
' @: \! Y, X6 o6 v+ z: V7 u - // *(_BYTE*)i = 0;+ l( o8 u( {! Y3 @
- //}8 h8 r/ Y6 G8 Z/ a0 y
- //if (a4 == 1)
: v1 Z7 |% L# r' h3 L4 _ - //{0 { }( `; _ Z6 X" ^% @. f
- // v16 = 100;# P" y) l) W5 {" i. k
- //}
; U" [4 N1 |# }/ D, g0 P - //else if (a4 == 4)
3 o9 l% m( o3 C% W% O3 t6 X' m - //{
( W" L* z; s* B4 E9 Q' m - // v16 = 700;- `6 M2 ^/ O5 c9 \: ]: x3 N6 U
- //}
1 P3 ~/ S8 Y8 r - //else) e- o& g0 ]2 ~; M! `6 A/ }/ q
- //{. `0 ], p& P" e5 n* i, X" Q
- // v16 = 400;" |3 o$ G! C$ h0 z& s+ [! a
- //}
1 k, U4 ]" O, ~" y9 A4 E - v10 = 1;/ D' h2 f. {0 r: X0 D5 c
- //switch (dword_4AA490)
$ h) w- m. w$ y- P/ c0 ^ - //{$ }+ [% Y& c3 e6 B* S3 L2 i3 R
- //case 1250:
+ K6 W* }5 T' M - // v10 = 238;
& J% ?) R! H |9 g- `4 d - // break;
- b% Y$ N7 [% Q) M - //case 1251:* x$ s! ^; ~- Y$ P
- // v10 = 204;
- Z2 z+ g4 g. @& K% x2 \ - // break;
5 M6 o9 Q& V$ u. i( ^% u! Z2 ^9 } - //case 1252:
W$ O9 h3 {/ i- v - // v10 = 0;
3 i; W+ g1 z1 u6 o s# L# j6 b - // break;7 T" E; `" `) r
- //}8 b! {, I. ~' R; g4 ?: R
- v15 = glGenLists(256);
9 M4 d/ y7 M% F) @$ Q5 t - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");9 Q/ S- t2 S6 r9 D$ |! h
- //if (!v14)" R9 l9 | Y2 a! S$ b- b7 _, P$ P
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
* r! `- |2 b- X; i0 M - //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ( o1 w* o' O9 v/ D8 L7 F1 l
- SelectObject(currentHdc, v14);
( W% A' f2 P# C/ E; h2 X - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
2 @) C8 F+ ?! T6 K4 ?# ]5 `8 K& _
$ Y5 |; Z* c6 _# G- //v12 这次出错! F! N s# l6 p! G9 r
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
2 u6 Q4 B4 T7 j. f - % D1 A/ \" E" h: N. F/ ^
- //*(_DWORD*)a2 = v12;# o* [6 Q$ O* j6 I. X' s/ r
- //*(_DWORD*)a3 = v13;
; t2 J* l* J7 \' W8 M u - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
; B6 C. F( s; Q6 L - //if (!a9)
* g+ r2 v8 @ M: F - // RemoveFontResourceA(lpFileName);
. [5 X! ?. m7 s2 v/ N/ `- O7 ~ - return v15;% x% P+ j! c8 j) S0 g/ w4 L2 s& m
- }
) F: ^, A3 s, w# m* d - ! X- E2 V, E' W3 _ J \
- //使用到
8 I6 B4 g' [; I5 I$ i/ X; n - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
' T) c/ C) g6 B9 Y6 Y! l - {
d3 G$ o8 H' w' e9 q) n' g3 l: i+ I - HFONT h; // [esp+4h] [ebp-8h]
/ @7 @2 I3 p0 @$ s, y2 p - DWORD iCharSet; // [esp+8h] [ebp-4h]
. D) S+ c. y2 r+ b
: |8 g; r- ?7 }5 i- 6 |( v& ^6 b( I
- __asm pushad;0 U- V1 _% U3 _. D9 ]$ d
- FILE* trace = fopen("font_trace.txt", "at");0 g" A a8 N% M7 Y1 ?' b
- fprintf(trace, "%s\n","sub_451390_Font1_hk");
) H" [# M# e1 \9 T - fclose(trace);
0 K" ]2 E, ?: Y4 [2 i# T* R6 b1 O; ` - __asm popad;
; ?1 W, D8 v4 _& R( E - ( G' H* ]7 y5 E, H
- currentHdc = hdc;8 Z3 o6 U$ {$ B5 g/ |
- iCharSet = 1;
" l5 G* l6 }* X$ s1 Y& X; ^8 y9 r - GLuint base = glGenLists(256);9 J: b- k( n! F, X
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");! S$ h; w/ q: n4 G+ w! J
- //if (!h)
$ u5 m6 I5 [' B7 `- Q7 I( E - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
I0 W2 [5 P0 y% F6 o - SelectObject(hdc, h);
d0 i- q& l' X; ] - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);+ } B D/ a% h5 D
- }5 T/ h! Z$ t7 E$ b; I0 m$ K0 c
- ! [& b! Y, c5 h: W5 ?! l; G
- void __cdecl+ M3 Z: V4 R* j! f$ ~" h
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)* n7 f5 s$ b7 k, M- [
- {$ |( \! V& p9 ~& _& u- N% l
- __asm pushad;1 h' @# o8 r6 v* `% i9 ?. C* k( d1 B
- FILE* trace = fopen("sub_trace.txt", "at");
" N" w- d# x8 b: B j, j' ?9 Y - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);/ d) P& v* ]2 ?" _& h1 I
- fclose(trace);
. ~$ C% J; j) N: { - __asm popad;8 L, T/ m) F7 Z8 ]
! J6 S1 {; V/ Z1 X- //return a1;
) {. P3 H# ~/ C6 y. ]! t9 g - }1 `1 H& \0 F3 B( W+ }: j5 [
- % a( x" T' ~# Y6 S8 G
- bool
$ v0 b: {6 P% ~! A c - ApplyPatchNibiru(), j# I" c; p2 i
- {
5 c0 ]( N" H/ P - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);! c6 i& J7 B* \- h9 h- S
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
4 W7 M# o U+ q& @: O$ l. {4 z f - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);4 k8 u2 X4 v1 T
3 O3 @* y/ Y3 K6 ^: @1 H9 P P8 [9 N- ' p+ |, o4 p* R o* G1 X( o
- 3 `. a* z5 k5 g$ g4 X# P
- return true;( i+ K5 `# F) b/ b: M! d
- }3 h" ^( m. W3 i% Y3 p
复制代码
3 a4 d( t) |8 F2 {
" i* _; h5 e6 Y0 d
, Q# A1 K s- J; I1 K" \! S
# b) O8 Y- _; j9 j- M$ v8 S |