本帖最后由 shane007 于 2023-9-6 11:03 编辑
5 a/ v) t# e D' ?* l1 Z1 v# b0 M
; l: l1 a' ?6 ~% l4 L$ B* G(nibiru.exe 772 KB (790,528 字节)); L) z5 F0 @. o/ j+ ^2 J# q
$ N6 [& N, x" q9 z1 m) W
将sub_451390,sub_451599 这2个显示函数进行了hook.+ o$ v9 x! Z5 G. P. k& `
确认这2个显示函数都被调用了。8 h5 K0 t8 I6 T0 R
第1个可能显示的是调试字符串,第2个显示游戏字幕。
2 o$ _% s) r% F' o' p# o( `- ?- E
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。& ~( v- z3 \+ ^6 R2 L( j+ @
, N9 @* Q) D% ?+ f' `% i //v12 这里出错
- o" r$ ?* p1 F/ G7 m //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ Q& j! C+ E9 N. l5 s3 G7 J* L8 n2 m, U4 w
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
, j: Q2 |9 M1 N; d& J" q# ~这种方式显然是有问题的,会影响性能。: m6 T: F A( R' f2 p, u3 k2 X/ S
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
/ f }3 G5 d" M4 J6 g
9 s1 P: l% U& _9 m; z- sub_451390_Font1_hk# Q; F5 T9 Y& C2 d$ n: G/ {
- sub_451390_Font1_hk
% I$ X' U" \; P - sub_451599_Font2_hk% b7 w1 ]' I( L/ p" T
- sub_451390_Font1_hk5 Y3 F/ S. i# n, x! m
- sub_451599_Font2_hk
5 \6 z' P: U( |+ c' M* j- n - sub_451599_Font2_hk
( A# _# r+ j) G0 N4 m) o - sub_451599_Font2_hk) @% z X4 Z5 f! h) g
- sub_451599_Font2_hk' P" y: T! U9 y+ J$ n1 G" W
- sub_451599_Font2_hk
: [' N3 }' N. S6 ~" G/ c - sub_451599_Font2_hk
4 p& H% |7 T: W. i - sub_451599_Font2_hk
2 A# {1 Z4 G( Q - sub_451599_Font2_hk; k+ Z) |$ y9 @" P% d% c. `$ a! f
- sub_451599_Font2_hk
复制代码
: |" m) O1 a6 A& Q) J代码0 P# s9 F1 r7 A( y8 r3 u
- #include <windows.h>9 E2 |- ~9 L" l- ]9 r) \
- #include <stdio.h>
. C- S. O/ l: l% y: s" x - ( b* Z5 L( v( D, t& n
- #include "patch.h"
7 G7 Z" F3 ?& b( ^6 h - #include "patchNibiru.h"
, Z) h& t2 i) B3 m7 `" p - #include <GL/gl.h>. {$ X) ?# V) m
- 6 M9 J! ~- v0 \/ V. g
" G, p# N# j# P. a# g- DWORD SUB_451810 = 0x00451810;
' S" ~7 Q! Q: ?3 N. | B - DWORD SUB_451390 = 0x00451390;
* W& a! a% Y) r: J U - DWORD SUB_451599 = 0x00451599;- u7 e& b6 e, `# C( ?7 k7 t
; x" K) b6 B- j* z- HDC currentHdc;; K/ [$ w( q1 K& C2 J2 u( a
- g; t2 f5 R5 @- H- 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 M: ]8 \$ R* K2 g
- {
+ Z u: s0 g7 ~5 ~8 m - DWORD v10; // [esp-450h] [ebp-450h]
3 Z2 a; a+ H* J. `! R- i - int v11; // [esp-44Ch] [ebp-44Ch]. u3 L* U, A# @5 X8 C: o" t
- int v12; // [esp-4Ch] [ebp-4Ch]( i7 D o9 v7 }* G, ]
- int v13; // [esp-44h] [ebp-44h]
; x0 f; b* K1 H8 q& R. x - HFONT v14; // [esp-14h] [ebp-14h]
# q; q P9 w O6 \ F - DWORD v15; // [esp-10h] [ebp-10h]. Y1 N6 U7 l/ e5 f9 g+ I" h3 W
- int v16; // [esp-Ch] [ebp-Ch]. g3 ?5 o2 ]7 ~$ m" J
- int* i; // [esp-8h] [ebp-8h]
, z& e. f' _- b, U - $ [- }6 f' I, E( b
- __asm pushad;
7 V% C4 ]! p8 {- F - FILE* trace = fopen("font_trace.txt", "at");# @5 v7 F1 I0 C
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
7 _" a w9 t+ s* O - fclose(trace);
7 h. V7 i, b& o+ D; e+ L - __asm popad;
$ ]. U5 T2 T2 J# l/ A0 G -
( F$ G( r4 v0 _0 @. v - //if (!a9)
E8 K# m4 Q2 J% S1 B# I' N. e - //{
! ^7 z. t/ f7 _4 ] - // AddFontResourceA(lpFileName);& d/ l8 P9 A/ f! W! O
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
# b- \5 Z' K1 _' t4 Q& w! C2 G' I - // ;' Z3 R' j9 v+ n$ k/ i: A0 Q2 a
- // *(_BYTE*)i = 0;
3 G4 Y5 m7 s- G) W% ] - //}
* [0 z7 W6 P! s: ~) G - //if (a4 == 1)& I& O1 A8 M! l. c) O, _
- //{$ @9 k: B' r0 E. i! @- a9 Q
- // v16 = 100;+ i a* @0 r% [- o
- //}
Z6 L( h6 A$ r! n - //else if (a4 == 4)
1 H) R7 G0 N( @( y - //{: [) @ t! Z; B! I$ ]
- // v16 = 700;
2 U5 v! a" F4 C - //}: C: d" Z3 S9 {& w- y2 U' j( f& T
- //else8 C a5 s8 }# }7 W
- //{6 K3 \5 L6 t/ f4 ?5 W
- // v16 = 400;
0 ?% R% _: t8 q% r9 q1 x - //}4 Q G' |1 `" I5 d% U, [: E5 ^
- v10 = 1;3 |+ Q: e( s( J4 P4 Q' M) G
- //switch (dword_4AA490)
$ e! \7 l0 O7 b - //{9 Q5 p' ~6 X' x' L3 d
- //case 1250:
4 [( A: I% v E4 W) W0 z - // v10 = 238;
$ f% D7 ?, r6 }. O# a" a$ Z+ s - // break;3 F0 ^" f. S, t% p4 r, l
- //case 1251:
% Y3 s( q- X) N - // v10 = 204;- C* k3 A0 B' N; O4 X. k
- // break;0 j/ n% U( N& T' I
- //case 1252:) j. g# G* X1 g. I
- // v10 = 0;# R! n$ b( O7 w- ^2 ~0 Z) ?% t* [
- // break;
6 \9 y) A# ~ I7 G, R8 H8 {$ r% A - //}1 ~' Y7 K- Q) K/ T6 Q
- v15 = glGenLists(256);4 Y3 Z+ z6 f& s/ @" n5 ~8 F
- v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
; |$ P' D2 T8 G/ X c' s* K - //if (!v14)
. A; f5 [4 f+ P, p r - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
( C; R: Y- c- B& _ - //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
3 M4 z: }' g4 n! X9 k - SelectObject(currentHdc, v14);
6 s7 O% @6 ?3 g& U$ { - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
* ~4 D# a5 F4 N, S - 6 @, M7 v$ N, i; l0 ?) S9 D
- //v12 这次出错
) O! _7 u# R( |- b - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);7 M0 E" i/ i; U! D' n4 ?/ H r4 C
- 5 k4 n0 l0 Z8 C' I& s q
- //*(_DWORD*)a2 = v12;
2 B$ t4 y' A& N/ r- j# m, Q3 V0 N, x& W - //*(_DWORD*)a3 = v13;0 L( y& d( b6 U% p, w) ^; ]( R
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
( d0 B1 P- {0 J1 Z - //if (!a9)
8 q& }- m$ M" H& O - // RemoveFontResourceA(lpFileName);
* s" j. b0 u' o3 P6 G - return v15;2 M& c& n2 Q/ C5 s
- }; I! G% ], i% u! J* W8 H
- + a4 U3 h& u7 b: N3 H+ m2 a
- //使用到
3 |0 o/ r$ d( Q1 o' e - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
' O1 j# } N m6 W6 V - {7 R. @6 X+ R# C3 r
- HFONT h; // [esp+4h] [ebp-8h]5 i# S B9 `6 `2 A) H
- DWORD iCharSet; // [esp+8h] [ebp-4h]8 b+ C' N) [2 D2 D; p! `( J- |0 n. F
/ P, y5 y% e0 |% q3 B: F. S# O- ) P- ? I6 q( }% J x) L
- __asm pushad;$ C" k$ v0 p9 F2 k4 r) ^, v4 v
- FILE* trace = fopen("font_trace.txt", "at");
0 Y7 I" r# b1 s7 G3 u - fprintf(trace, "%s\n","sub_451390_Font1_hk");
u+ L) Y: f# I- R) I: _. p - fclose(trace);9 }# a$ Z4 G8 Q- M# a1 m! C" m9 z5 r% U O3 b
- __asm popad;
7 [8 i! g4 d) F! O1 l; ^! I8 t - r2 W# v1 h7 B0 V: ^+ y$ ]
- currentHdc = hdc;
; W- E! U, B3 n - iCharSet = 1;6 `3 f; `% b7 f# \" F& t* [
- GLuint base = glGenLists(256);
: f1 V, |8 G1 f( \+ F; b* ] - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");2 ]' ^% Y- |+ [; i& U9 T
- //if (!h)
1 i$ m: }' m& [) p/ \' y - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);7 j+ x+ \5 f6 w& ?5 x6 Q% P6 }
- SelectObject(hdc, h);
. b, c( p6 p P# t& C2 X - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
% e' l. M2 v- V8 C) s) a. ^ - }
; ~ H3 k2 [! A( [- s
7 P' [9 |% U# W) l9 ?8 r3 x- d) y- void __cdecl+ b O1 V9 W; C6 {+ K ]' X& O
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...) \6 Y" g# j7 X# I+ R
- {8 t# j; Y6 k' y) J1 }3 @
- __asm pushad;' u. _: s+ ]! @' u/ ~" i5 E9 `
- FILE* trace = fopen("sub_trace.txt", "at");$ S1 {+ [+ ?. k; a- @9 N6 m
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);1 E6 {, c5 m V! K! ]# p
- fclose(trace);
) _& ~# u( F# {" B o - __asm popad;, d2 W+ |) G/ ^. a
5 k2 X9 E) W' |+ ^* G: o! C- //return a1;/ X0 }# q" x! x4 g) d
- }1 x" P# ~& w. A) \, e
6 e3 I) G2 Z6 v2 C B- bool! ?# y, h1 A2 X: W9 w. h
- ApplyPatchNibiru()
q% @! U# y' s. e) o% v! V - {3 i8 j1 n8 A0 t7 R* D! a& H1 a0 S0 @" Y9 f
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);4 K8 d6 `, l3 l4 V3 H
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);4 n( ^: O, L: ^' l( T/ W
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
5 `2 N7 A& Q' N, `
% Q& c, Z3 K2 v7 e E9 N7 I- , L8 Q* n- J% f" ]
; ^. R) v( L/ t- return true;% L4 `- T" l$ i9 G/ N1 G
- }
" k7 [% f7 H; W* i+ m5 I! D3 y
复制代码
1 |1 k& E* u- A" M" q7 e- P* `- V! R( V, Z, L
: \3 U/ a' v( v9 R3 Z. @. @$ o V
/ l5 \+ j1 b$ I0 I4 P/ |$ ^ |