本帖最后由 shane007 于 2023-9-6 11:03 编辑
8 `# J$ O0 f0 H% d6 X+ U C- f& c6 ?& h) `
(nibiru.exe 772 KB (790,528 字节))
& c3 O# Y+ E2 G4 G" K0 r1 u% ?" c0 h, `
将sub_451390,sub_451599 这2个显示函数进行了hook.
% x/ S# e; x, c* P1 H4 n. V- D确认这2个显示函数都被调用了。! `+ Y4 W! ~1 M! p$ L* _& Q
第1个可能显示的是调试字符串,第2个显示游戏字幕。: z; L% u; F' w$ x& F: A
7 I; b( W6 A( I" I7 R以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
6 G: b% B1 ]/ q( d# I6 X6 C- I6 R3 T4 t: U5 E' `& z3 u# N
//v12 这里出错
: y/ H! J8 K2 Q* ?( l$ O+ q1 _' M //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
( \/ L( t- _ b9 |3 I# F# M X& p' k e( X- f
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。/ E* q8 S( v, @; N
这种方式显然是有问题的,会影响性能。
- O; i8 D9 Y0 A/ p7 U. G在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
- A+ n* I$ C0 u0 I1 k* O5 m' F) p g D
- sub_451390_Font1_hk
3 E1 O( l& y1 R" ?' ` - sub_451390_Font1_hk9 @4 L4 q/ j: R5 e
- sub_451599_Font2_hk$ e# ~3 n) g# X4 a' [
- sub_451390_Font1_hk
8 F# @* n7 s y+ f; v - sub_451599_Font2_hk0 J, r. C F, e- q% a
- sub_451599_Font2_hk
) ^ Z8 Z8 Z4 F" `7 V - sub_451599_Font2_hk
) s% g8 W% {# ?1 ]& z# L9 I2 V - sub_451599_Font2_hk
9 L5 Y' T/ G* g( r - sub_451599_Font2_hk
6 e$ K; d6 p" a% [, Y - sub_451599_Font2_hk
4 w0 u9 c V3 h x' T F - sub_451599_Font2_hk& }. H- _% W* k/ L7 \# W- f$ A; q
- sub_451599_Font2_hk1 I- G# G3 ^/ P7 L) _: y, a8 P
- sub_451599_Font2_hk
复制代码 4 i8 ^! _4 N' [" w* [
代码
5 d" A/ C* ~3 `/ G- #include <windows.h>8 h6 h g4 U2 V
- #include <stdio.h>
2 u) \; l' ?/ z9 Y- g s
. ^4 V. P- ^, G- #include "patch.h"
# |( J, q8 d5 [ - #include "patchNibiru.h"
) f+ b! r/ R8 w% T7 V L - #include <GL/gl.h>
( f% y4 @5 s. Z/ A1 ` - , @* T2 g/ L& s2 ]3 e; ~
& B# E) Q* S0 \% x! _1 D) F; `- DWORD SUB_451810 = 0x00451810;
B+ E0 U |' v d$ } - DWORD SUB_451390 = 0x00451390;$ ?- r- }3 e r, D( i
- DWORD SUB_451599 = 0x00451599;
# D& I8 O- B Z - 7 r2 C% U- o+ g
- HDC currentHdc;
2 f7 Y& T8 ^% G8 ^ - T- g9 A7 }" E
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)
% Z, Y1 ]8 I3 _3 o' S+ I0 }4 Z - {
$ q5 V7 N( o; r" b( O2 q - DWORD v10; // [esp-450h] [ebp-450h]
; m3 a I! o. N* e3 |/ c& B - int v11; // [esp-44Ch] [ebp-44Ch]
3 Q- Z. I! L- L6 f! u# h: T - int v12; // [esp-4Ch] [ebp-4Ch]
+ u6 f; E3 Y/ Y+ M& k4 M - int v13; // [esp-44h] [ebp-44h]
" `6 d8 g$ p8 @$ m, \ - HFONT v14; // [esp-14h] [ebp-14h]4 n- E1 J, a1 I, ]" E$ K" C
- DWORD v15; // [esp-10h] [ebp-10h]5 [3 E1 k6 @2 A1 \1 f) i
- int v16; // [esp-Ch] [ebp-Ch]4 [0 o) ^( @) A
- int* i; // [esp-8h] [ebp-8h], R" b; L) X7 b" L
- 4 W, N. P, o# r' n; r
- __asm pushad;
/ y* j4 |, z2 U: T7 c. L5 c' a3 V - FILE* trace = fopen("font_trace.txt", "at");
+ D- V9 A( a+ v - fprintf(trace, "%s\n", "sub_451599_Font2_hk");* D6 {: b% @% D8 m" Z
- fclose(trace);
8 z/ u4 U/ Z# ?. F4 r; h - __asm popad;6 H; H1 c2 s* {; ]& ]
-
2 G: C6 _, i' d* F% L0 ^ x - //if (!a9)3 i$ x: W7 h( S% M( R, t
- //{7 v0 q4 E# }+ _3 |4 ]) V
- // AddFontResourceA(lpFileName);* [5 T A; [% V5 A
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
4 u+ d. J% F) I! @ - // ;
# r; R0 v2 T$ U# s8 |% d% J# ~/ ` - // *(_BYTE*)i = 0;
9 O8 [# T6 U9 K - //}
, R! S! k' W6 C V2 W7 D* C - //if (a4 == 1)5 c5 c% [ j; M9 X
- //{
' L& Z* w8 D" ]3 F% P - // v16 = 100;0 B0 c- i1 D8 u" L! [1 }* Q) \6 f
- //}
5 e" u9 j) j2 ~8 V0 T - //else if (a4 == 4)* @' x$ n7 |/ v! \( D+ @
- //{
3 D' |0 j/ Y- l" ~4 E - // v16 = 700;! O4 P$ d1 a0 B
- //}
9 O. u6 b5 m! e( R* d+ O' H7 I/ ^ - //else
. a% C4 h) J( s9 Z( j A8 B - //{
: J' M- l" f) M& P4 Q1 o! J. s0 @ - // v16 = 400;4 I+ i7 S5 k6 V8 u$ L, N3 [
- //}6 H/ a0 K6 H; H' P/ ~% n+ s0 o
- v10 = 1;
! ^" u! A$ K G7 ]7 v - //switch (dword_4AA490)
) Y5 s; m6 Z' T6 R - //{( Q- d) I( Q. M3 r
- //case 1250:
+ `' @8 ?4 `( P5 B6 o4 L$ `0 ? - // v10 = 238;! B5 l4 M2 F7 L1 ~1 P
- // break;
% M6 s7 c' f S& j! g9 J1 I - //case 1251:
* B' z: k/ Q( R* X( r# T* X# i - // v10 = 204;
; d9 S, f& b% S! b3 X - // break;
; H, e( n. ]6 \ - //case 1252:: u, _$ O* s' e8 d" H
- // v10 = 0;
& O7 y/ j7 p2 M0 Y2 ]! O - // break;4 B) F( s4 t5 `' p P
- //}6 E k3 P, t" e# f7 `
- v15 = glGenLists(256);
" O9 x. `* K2 K2 t2 L6 b ? - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");* u' x7 z6 n; T
- //if (!v14)* E7 \2 d0 X, b3 ~9 N5 n
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
9 G: L: \9 C/ v8 n0 E8 H! Q6 n - //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ( Y( ?* B: C1 l& ]" o; m
- SelectObject(currentHdc, v14);
( s% s& Z/ [. l1 j/ V. Q2 z - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
; p% c; W% B- m6 I; {$ b( x - 1 G8 R+ z: m1 b; G
- //v12 这次出错8 S& g# Y/ ~4 ^# `4 J' r- z
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
3 W' ~0 Z9 J2 B. X7 ` - $ H' d# |, G0 h: `
- //*(_DWORD*)a2 = v12;
5 N1 w8 p( C$ [; a# L! n - //*(_DWORD*)a3 = v13;
( ?7 z3 K7 R5 ^ - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
x8 l, o' y* S8 F6 F8 p B" u - //if (!a9)
- k% W0 P. c. A1 ~- a9 c' ^) x - // RemoveFontResourceA(lpFileName);; C' G8 G: g. j
- return v15;
! ^6 O8 ]6 v) v5 F; L- _/ [* ` - }
- v( B8 s7 `, U* A8 y: I
$ c6 Y8 q; o" ?: @- //使用到
8 |, z* B" {& I- G* C+ W$ x - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)9 o+ {/ j, u, I5 [
- {
( B/ R9 i4 C: d - HFONT h; // [esp+4h] [ebp-8h]
8 D- M; j+ B6 S - DWORD iCharSet; // [esp+8h] [ebp-4h]8 _3 B5 L9 F9 s8 f/ V+ u
- & G. M0 @7 B4 w1 f" o' ^6 z* }
- : b$ |/ p9 z7 L d7 K
- __asm pushad;, r) v* Z8 `2 T; g4 ~( D) s
- FILE* trace = fopen("font_trace.txt", "at");
3 J2 M8 M2 w5 @: G - fprintf(trace, "%s\n","sub_451390_Font1_hk");
3 \' P+ W' |: O* N9 d - fclose(trace);
# D6 O! }- k% r1 H& [/ ^1 z - __asm popad;
( N% e: u2 w& B: P# n' S+ p( P - 2 C/ g& I# l* S. v2 |; \! t
- currentHdc = hdc;- j: }4 p: d; I- m+ |6 j
- iCharSet = 1;
$ J' x% [/ a+ T# S% H9 s2 L9 M - GLuint base = glGenLists(256);
$ L5 ^- [* _3 @3 k - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");1 F( x; t& K6 o) i4 Z
- //if (!h)% X0 Q' s' q3 ^: K9 g1 |
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
0 w( R3 [8 F% z4 @ - SelectObject(hdc, h);
) B! W+ e8 u, t e# Q# ]3 ~ - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);& `2 ^2 l1 R9 y4 b6 V, A+ [
- }* t% [ }* I, L* @- d
- ( p% E) _' U* O Y# d- `
- void __cdecl/ V% w! Y8 r) y
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)" T2 u9 D7 `1 U3 Y, L
- {
0 C, d' w$ |2 F5 Y - __asm pushad;! I |" G! }) h0 c$ ?# k
- FILE* trace = fopen("sub_trace.txt", "at");
0 T% ^$ k0 \! r6 u+ x& K2 x - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
- h* ]4 m% E8 m$ a2 j - fclose(trace);
# u3 O: x4 v- j - __asm popad;" `' R, U5 Y5 C6 T7 [7 x l
- . Q1 r3 G8 T1 b7 L
- //return a1;0 _& _2 Q, I% e/ r
- }
2 J! q1 `* F+ V6 S4 e4 |, Y. h
y2 C5 P: Y/ S1 W i- bool
2 N) \& {, [+ u4 U( c4 G/ f' H# L - ApplyPatchNibiru()
( z3 Z0 h; F# |. q3 S" U7 | - {/ w$ K( ?( u! e' d2 }
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
$ p1 _0 }- Z. z7 C( C, J( V - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
- C$ d$ J' X6 v% s* G - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" S. b$ {2 `( f' U
0 c% T* S) H3 X+ L- 9 G6 H" k. L6 ?3 t
- 2 w" W5 I. ^0 t
- return true;0 [1 s$ @. }' C* \' o0 d
- }2 a. d. y6 x& w. @
复制代码 % u8 c! m3 l$ z
: A0 \2 b, v h# q, D, I* X3 X' Q$ |* G! L2 Y. b
- ]5 t! y) u+ M/ x" I( k |