本帖最后由 shane007 于 2023-9-6 11:03 编辑 # D" k. p1 b/ i; [- s
- }2 d7 r* t4 @/ n& Q(nibiru.exe 772 KB (790,528 字节))+ D. N+ s9 E; D8 x
% q: D" j0 @! x4 @
将sub_451390,sub_451599 这2个显示函数进行了hook.
/ G8 x* E# ]5 ?( N& u+ Y* N" |$ @! h确认这2个显示函数都被调用了。
2 x) e4 }1 X. L2 P9 V7 Z9 g& B第1个可能显示的是调试字符串,第2个显示游戏字幕。7 S6 A& U s+ A
6 o1 Z& C& B" F( e0 s以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
% r' a: P: _! u# B& a! q7 F
% e) |4 b% `! W3 w9 s //v12 这里出错
+ |5 z6 c2 y! P; s: l7 F# E //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);( p8 ]0 X7 n! e4 f: V
" g8 D) H( P6 J2 C+ Y; @' V- {
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
; b) Q$ p& B) W& B M$ w. ^这种方式显然是有问题的,会影响性能。
x' {- ~4 Y* ]/ C/ y在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
4 c( Q6 K& }9 f k+ A" v5 F/ e
" V; B) S4 Z# ]+ A3 ]' s5 o( {( p) s5 w- sub_451390_Font1_hk
6 p" V, u1 y8 v# v! G - sub_451390_Font1_hk
2 ^) w* L8 M, q; C- ~ - sub_451599_Font2_hk5 D' Z4 k0 V5 V! ~
- sub_451390_Font1_hk
5 p; H, D4 w4 |* Y3 Z! {) U - sub_451599_Font2_hk
% t! z9 Y" F" _+ w4 x. `6 H3 X; ^ - sub_451599_Font2_hk% t# H8 _: B( a
- sub_451599_Font2_hk
7 a& s7 i# r' A+ |, A& Y - sub_451599_Font2_hk
2 j/ @* Y. f( F2 w - sub_451599_Font2_hk
; H! j8 q7 j/ \& s' G - sub_451599_Font2_hk7 V/ G4 R3 ]; H& h! \. u1 ^
- sub_451599_Font2_hk) t+ ^/ @4 X$ S' |. }* N
- sub_451599_Font2_hk+ B7 R1 C4 g. }9 M$ f: t- h* Y
- sub_451599_Font2_hk
复制代码 4 E) K9 T% S% b# H) O) e
代码
2 e, ]" B4 ^& X$ Y- #include <windows.h>
8 _- ~. h h% z3 F) a9 i2 z - #include <stdio.h>3 `2 q: n, p! F$ Y/ m Y& a# i
* R! C* A$ s0 J2 q- #include "patch.h"
$ K5 J6 w8 N @) h- H# S& L - #include "patchNibiru.h"
: J9 Q7 v; F" S0 o7 f+ ? - #include <GL/gl.h>
) z3 B7 J/ ]+ U
9 m- a& T# k% ~% o: E- ! J1 E4 v/ I5 e" |% A
- DWORD SUB_451810 = 0x00451810;+ J3 v% x3 L" g) ?( X- u/ f" r
- DWORD SUB_451390 = 0x00451390;& ~. C. h% c) O4 m8 d$ x
- DWORD SUB_451599 = 0x00451599;! V8 U# p* L; p$ L w
- ; U" V4 L6 _4 C/ n3 \6 t8 N
- HDC currentHdc;
2 i p4 y$ \1 H. ?2 j - , G" k5 l3 K1 X/ E: x
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)4 s- o' ~# V- e' \0 a
- {% n& }: N, b- y" N! w
- DWORD v10; // [esp-450h] [ebp-450h]2 s' [# m, F3 y6 {% D
- int v11; // [esp-44Ch] [ebp-44Ch] ~6 U J, ], I
- int v12; // [esp-4Ch] [ebp-4Ch]
! D% C* Y7 ]6 e2 {; u, t - int v13; // [esp-44h] [ebp-44h]
# q! W: k, i9 H+ U - HFONT v14; // [esp-14h] [ebp-14h]
/ n2 j. B3 O. I - DWORD v15; // [esp-10h] [ebp-10h] d, r) [' S$ E* r& ? }, v/ K
- int v16; // [esp-Ch] [ebp-Ch]
! ]+ s- I8 N# ]0 U: N2 ` - int* i; // [esp-8h] [ebp-8h]- f# V5 k3 C3 [& P6 n: ]' [
% l2 E4 O, d# ^* z, M$ }- N& L- __asm pushad;' o/ A7 Y2 i5 K( V1 b
- FILE* trace = fopen("font_trace.txt", "at");
. J) A2 s) d6 C3 {+ ]3 b4 i4 K - fprintf(trace, "%s\n", "sub_451599_Font2_hk");
4 v. |* U' _' o4 Q" G5 |* e- P& A - fclose(trace);
8 W; R9 l% R: [2 v! O& l) n+ ]' ]5 A; O - __asm popad;
% g0 o- K) C' k, D2 Q- u -
: ], K; x' ~* H4 b5 R( q - //if (!a9)
$ w/ e5 W# j/ [; r8 M - //{! ]3 ?" Q- Y6 P) Q! _0 G
- // AddFontResourceA(lpFileName);
: h, b) I. ~' k, a - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
- L+ Q0 y+ j. ^7 I6 l& a - // ;" a( C: [1 ^0 a* C
- // *(_BYTE*)i = 0;1 t$ B6 |# u3 J* R7 y. C& }
- //}3 X& ]1 L1 K! p3 Z" k# y7 q4 E
- //if (a4 == 1)4 u$ S# I' ^) b+ j8 C6 a) [3 `
- //{
p6 U: K6 t2 C; l+ o - // v16 = 100;
6 H" y8 B, i3 b, | R - //}
' c; A l3 h9 b' E9 c' m% {# z; w" W - //else if (a4 == 4); d1 F3 ?* k3 [
- //{
% ]% t3 `; i0 p4 \! z - // v16 = 700;
' J0 L0 [& a% g# Y1 N) P - //}
5 n; w w& Y6 d0 V/ q - //else. V5 J; E$ [, l
- //{
/ i* r2 h; S m+ x- Z! E' Z. ` - // v16 = 400;
& A% s. r, H/ M- s# x8 r1 S% K - //}
- c' W8 _( Z% G8 R: r - v10 = 1;1 H/ t6 |% v+ b5 T6 c
- //switch (dword_4AA490)& q1 ^- [8 l' W8 f
- //{* G, `+ B+ Y/ x. d$ |
- //case 1250:% ^) U' E4 b( q/ R* T$ K6 w$ I
- // v10 = 238;
; ?* o- K% G' J - // break;
) K1 f5 o- R! v - //case 1251:- X) } s" T! P1 L, y( f
- // v10 = 204;& p' t; |8 G# x
- // break;
0 j3 f! w) h/ {6 j3 M - //case 1252:
& W- p! N5 [( \' d+ k1 | - // v10 = 0;
3 j4 Y/ s* O. j( k& v/ y3 f$ V - // break;% o. N# g" o1 p
- //}5 E5 i. w! n* d0 ]5 ~
- v15 = glGenLists(256);
; [. f$ a0 q3 T7 `" \/ O - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
: Z- y. T) y8 Q% | - //if (!v14)5 {* E/ \! c; A5 i, K$ }: L1 F. t$ F! v
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
( }7 `4 y) j9 A* @ - //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
/ X& _4 s5 \2 j' F. \/ G. s7 a% y - SelectObject(currentHdc, v14);- k, z1 l5 ^# ~/ q" S6 p
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer); e+ S' n0 h' u2 P/ S
- 8 F' @$ d8 d. u: L
- //v12 这次出错
' @3 I4 e( D0 l3 ]9 ` U - //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);# Z0 w% Z( I! V& c9 j) M! W: A0 y( i
- ( @: T. q% r: z8 a
- //*(_DWORD*)a2 = v12;
% A$ b6 p6 _! a' C3 v4 J - //*(_DWORD*)a3 = v13;
9 E' [8 X* l/ S$ x% O - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
8 Y1 L. d7 L6 u/ @2 `; i- j% a! A - //if (!a9)
k ^1 J& S$ F0 s% o2 x+ g2 p% y - // RemoveFontResourceA(lpFileName);. `0 Q) t& _2 ?0 M
- return v15;
9 ^* P, U; g! F - }
0 o! ~: P' M7 \$ `9 ` - ' @7 v0 f! G& O! L
- //使用到
: k7 r# O5 \3 m6 @ - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
8 w B9 Q7 Z2 k, m1 `3 o - {- _; y. z$ U& e+ W" V3 A# ]
- HFONT h; // [esp+4h] [ebp-8h]
/ X4 h0 [& Z( y# S$ z, ~+ q - DWORD iCharSet; // [esp+8h] [ebp-4h]
1 ? c" R1 ]1 Y- S - # _7 r, t. V4 a5 q+ |5 t# h
! j! T- p: @* ~* T, v% z0 _- __asm pushad;
I2 ~- _5 |8 U - FILE* trace = fopen("font_trace.txt", "at");
/ `7 E: ^$ M0 t7 t7 R4 v8 h' y b - fprintf(trace, "%s\n","sub_451390_Font1_hk");
7 _, T( Y0 T3 S5 {# [ - fclose(trace);+ B& h8 s) Z1 {
- __asm popad;
3 W" A7 U7 \+ g$ j+ v8 `
: {! [! t9 Y( u4 R- \" c- currentHdc = hdc;
; c/ R5 }3 I6 v - iCharSet = 1;( }, y! D. b+ X9 O
- GLuint base = glGenLists(256);" J9 \5 b, G) C- a P& S( a- f M
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");0 A# y# ?& t4 e4 C- L: u
- //if (!h)
$ H5 u1 u. n( ^% z - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);0 T7 u7 T# l' T4 J- Z
- SelectObject(hdc, h);1 E( D9 V7 r& u& }( I! F. R0 W
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);" _. f0 k/ M% D: p4 v6 y
- }
8 G+ }/ i$ g( V2 D
8 n! p& |1 a1 w0 A- void __cdecl- \% i; x4 ]! o- ^1 ^
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)! k6 {8 E- ?6 f2 G: _ D3 ^
- {
( s6 V6 R, i/ b+ ~2 l4 A - __asm pushad;- H: ]$ I+ a0 o
- FILE* trace = fopen("sub_trace.txt", "at");
6 G- ?1 d2 B8 S/ x4 {( y - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
! `" [# z. x; s% k9 d0 ]7 B - fclose(trace);
; s3 A; y9 M' n, }5 {* | - __asm popad;
2 N0 `. ], V2 g5 N
' j4 \) Z* ^# e- //return a1;
: b% {' A! B5 r9 b - }
% E( `. S! `% \9 S$ w9 l" I1 r
- r0 U4 h, h# ~- bool9 y* A; R; i3 q+ K3 R
- ApplyPatchNibiru()
, M% H1 k$ j# T2 F; V - {
! |6 a/ @9 I/ u) h2 ^ - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
; B$ `$ g- ]! e5 g - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
1 V" r9 j; m' Y7 O - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
0 j/ T/ c1 J. [, _) L; x3 B' H# H
7 `6 n& ~" x' _% Y) K, t' z( o+ J
1 r. M( K6 }# Y/ e; {5 X
/ {8 O1 `2 D0 F6 o1 N/ D- return true;* V' w5 d+ |. M. l& z( e
- }8 i/ k/ ~" x. o" ^
复制代码 9 G4 Z/ `& n2 c8 k% F
% _( Q9 @+ z; F4 Q
) p0 e- `2 ~8 F9 k% I
9 ~: K/ l D9 g$ N/ }% E# V |