本帖最后由 shane007 于 2023-9-6 11:03 编辑
- ~, B4 r- a* ?# F2 W0 H6 j* ]/ i1 |
v- S% o! X$ w- d1 F8 W(nibiru.exe 772 KB (790,528 字节))
; Y7 F, {& y- C' u+ _ H& h% e
0 z7 k* C8 S6 f; x, H d( A% f将sub_451390,sub_451599 这2个显示函数进行了hook.
9 w) I6 d; _4 d1 `7 [5 ^" s" V确认这2个显示函数都被调用了。
, u* D+ y/ R( Y9 {# o! Z! P2 c; q第1个可能显示的是调试字符串,第2个显示游戏字幕。
5 @# K; ~9 n, M4 Q3 y5 N" c0 W
* G0 B( `$ W. }( r& d以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。' u+ C; t' `. J" D# M- Y# W8 v
4 q# Z! L# Q& D" N& R
//v12 这里出错4 Y7 h3 J, M$ O5 Z% F8 X) f# q
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);/ @. ^" `- l! K- v
! i, h9 c- A4 z7 {输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。5 H" A$ ~, y% W8 z( H
这种方式显然是有问题的,会影响性能。
4 H. r; k- ?3 n8 T a0 M! t! X4 a在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
$ X/ W& D0 l, F0 t, K: N: s6 R/ S& _# U' P6 }" @
- sub_451390_Font1_hk
9 [$ R$ J2 b. b7 C - sub_451390_Font1_hk- }$ G* Y7 y2 f0 R/ |
- sub_451599_Font2_hk
9 Y7 W7 X$ g9 G - sub_451390_Font1_hk, F6 B/ M( @3 S; k7 s2 f; Q; m
- sub_451599_Font2_hk1 c, e. ^) d9 A4 @7 P% r" A; ^9 c2 p
- sub_451599_Font2_hk! d4 ]* ]. b1 K* w. x6 C5 g- w/ \
- sub_451599_Font2_hk
4 p( l" |. ]; d2 o) J - sub_451599_Font2_hk4 U) ^; ?: J9 @$ E6 H
- sub_451599_Font2_hk
0 E" @. x+ ~, i8 e - sub_451599_Font2_hk
; K( ~& S6 S6 l* p* M5 M0 ` - sub_451599_Font2_hk; X# ?4 ^3 ~% G$ E8 l
- sub_451599_Font2_hk2 n% z% e) w" [, o* J: X
- sub_451599_Font2_hk
复制代码 " S8 C; l1 s' Y7 ~ ?
代码- B* q, ?# z! f7 t
- #include <windows.h>
4 m/ W' c. q# T$ k# v8 S - #include <stdio.h># g& T1 a6 {& {8 O5 w6 I. X
5 H' l, y) W1 r, y( t7 x6 I# b$ Q- #include "patch.h"
" }% Y! i, s6 j+ X& _ - #include "patchNibiru.h"
% w, l" ?) _+ y& A3 c - #include <GL/gl.h>
: ?& K% B$ O% \9 p1 \) m( C
. J' D' l$ }2 q4 f
4 ~! J2 f( q. E6 D* \, l" J, b- DWORD SUB_451810 = 0x00451810;1 P( e/ Z- O/ r
- DWORD SUB_451390 = 0x00451390;9 @6 y6 V7 `" @+ O- Z
- DWORD SUB_451599 = 0x00451599;
% f, J$ P% _9 B
1 f1 @1 g* Z2 _* ?% o; ~3 T- HDC currentHdc;
; w1 r& ` t1 B0 {- e! Q
$ e1 i% m0 v6 z% \- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)* E1 I3 Z. A4 e
- {
7 u( z! q: g0 o) {9 r/ X$ I - DWORD v10; // [esp-450h] [ebp-450h]
/ a/ N; z( I' `) Y% [3 f* |; I - int v11; // [esp-44Ch] [ebp-44Ch]
% t: f N, Z2 R x5 y - int v12; // [esp-4Ch] [ebp-4Ch]
2 s/ s: ~4 G8 o `4 l E( i - int v13; // [esp-44h] [ebp-44h]
8 m2 B1 d& z; X - HFONT v14; // [esp-14h] [ebp-14h]5 }* ^* b7 c7 O6 E
- DWORD v15; // [esp-10h] [ebp-10h]
/ X! H- n$ P3 R+ H( _ [6 {# M8 c - int v16; // [esp-Ch] [ebp-Ch]
8 i4 N# K3 s- E* v4 w - int* i; // [esp-8h] [ebp-8h]
1 w: [6 @ a7 D- @ - 5 A8 |' h1 P* S$ c6 A( d
- __asm pushad;0 h# Q" c$ W- _
- FILE* trace = fopen("font_trace.txt", "at");! A+ L* q" I. f7 f1 _
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
7 P! v& r* R/ [9 a+ D5 O - fclose(trace);
) A y2 ` E5 w$ x7 V - __asm popad;
* S* D: b1 ?8 }" s3 T -
) c4 L1 a( A$ W \% ^ - //if (!a9)8 K' x( p( J. R' M2 _
- //{7 A5 M* D+ ] D, ~" r
- // AddFontResourceA(lpFileName);7 q* ]' ?) _; i8 E3 {
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
- I; ^ Z4 s& l: r. x - // ;& h3 n, B; h/ Z% N' u, ?
- // *(_BYTE*)i = 0;
, s( H) i# O# b8 L - //}
% z/ N2 w G# C" n" T9 _( @! K* G - //if (a4 == 1)6 X- A4 v8 v/ [9 D* A2 `
- //{& W& U/ @% x! ^
- // v16 = 100;
) j/ ]5 X5 C9 }( X7 V - //}8 [* K, n1 S" Y. `$ F* O1 V# O
- //else if (a4 == 4)
: E! Z8 q- K! g' j: q - //{! D3 m3 I0 u; U* e
- // v16 = 700;# \8 d U) j! x
- //}
9 Z7 k- X: m6 U - //else a) o/ \# ?* O1 n, r( X
- //{
, Q: ?/ S5 _, f) ~0 @ - // v16 = 400;
: n p- f3 ?+ A( T1 f+ d$ y - //}
2 F# L1 I! w( _5 d7 r. |! C5 B - v10 = 1;/ P/ o5 B& i4 ?0 r8 H
- //switch (dword_4AA490); e; b9 L' a) G* t8 v( i" b
- //{0 P. u8 Q+ h+ Y% ]5 E! m
- //case 1250:
4 v+ g, ?! U" x - // v10 = 238; d; I* Y! V8 M( b1 p/ v
- // break;5 h( Z3 r9 ~) t4 i! {4 A8 T
- //case 1251:: D" R% Z( {" q* {( s& b2 ^
- // v10 = 204;5 Z! L3 B% Q; K% J4 T0 `! u& x
- // break;, n. B! u6 W& S
- //case 1252:$ a2 H- ]2 ]# W' Q
- // v10 = 0;
+ k: q) S& i) U- A - // break;" m- Z: F6 ^. N5 v0 |
- //}
% F2 r: @ K' A. `0 u6 t - v15 = glGenLists(256);
2 t0 d7 C" e& s; h( U! U - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
& S3 l `- I8 L - //if (!v14)% l7 W; f% e2 U. z( ~6 S
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0); N7 k6 ~) l! T; H5 l# a9 _
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
) u& m6 ]/ U9 @ - SelectObject(currentHdc, v14);
! V- L6 N+ ^" x+ o( y9 F7 Z: n - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);0 J# y2 [) c5 y7 c
) I' \1 w2 i" Y8 K! ?8 ] x* s; C5 ~- //v12 这次出错6 H7 B( P, F( z1 W# ]+ T9 S7 S4 f
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);- P! w% D X. C7 p( F
-
+ U6 j, ^. v" f# ^0 d) I - //*(_DWORD*)a2 = v12;" f0 a' P, z l; a
- //*(_DWORD*)a3 = v13;
Z g; K( B8 u5 L; J+ u - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);8 u/ q" n8 S6 @$ h) l
- //if (!a9): s- L' _4 h8 m( [
- // RemoveFontResourceA(lpFileName);* C$ I" Y+ T( \) S) Q3 Q1 a w
- return v15;1 z8 x" Y( {' V. c
- }
/ m4 O. M. g& N. w; ~4 s
; B- O, a: R& J# k- //使用到
! g1 F6 d/ N6 w4 R9 d/ b C' o - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
/ y. z& \- s1 t& U5 ~8 W - {
g* O' @0 {6 T9 c$ M. o2 L - HFONT h; // [esp+4h] [ebp-8h]. X9 S0 l) ~0 ~( M! W$ {6 C
- DWORD iCharSet; // [esp+8h] [ebp-4h]# Q% [& b! P% D- @# Q7 q+ J, |. `
- 8 z/ E+ e: X/ n y) v
6 L+ D% V) k# W8 T7 @- __asm pushad;8 K7 X" d! s% E# K
- FILE* trace = fopen("font_trace.txt", "at");
3 F1 V) f4 ^5 v- F/ M - fprintf(trace, "%s\n","sub_451390_Font1_hk");
7 H& S+ x: _, V1 H - fclose(trace);6 v6 t1 \ t# k4 w# R/ Q% ~7 f
- __asm popad;! K) E2 U( @! \9 ^$ U f. l% k
- * S! E2 \' ]2 L0 n) u9 ^! B
- currentHdc = hdc;
9 M& Y/ m% b; L# E: w! L7 Q! l - iCharSet = 1;& n1 a1 E( L2 g+ d# X; O
- GLuint base = glGenLists(256);3 d1 [+ I# ^2 a7 ?) L
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
& @" J, s! @4 v @ - //if (!h)
- s5 ~2 K, u8 |) r: p) G* V% Y - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);/ Z0 O, l$ Y7 j2 p" g0 a9 ?
- SelectObject(hdc, h);
' p( m# y0 `6 v5 J! u. X - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);- k; D0 I" U$ X( E6 \
- }
3 K, d2 k( I- }$ _/ }- F- B" ?
) I. E6 z( W: o4 B0 K- void __cdecl* x f6 s# i" h, R |
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
|7 K! s! t# L - {
4 [# Y8 A( W$ w3 j4 h - __asm pushad;
! c. @ B+ ?2 O/ E, [ - FILE* trace = fopen("sub_trace.txt", "at");
- F7 h/ N( `7 O+ q( g - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);% a/ ?+ @% Z1 f+ W z U
- fclose(trace);
/ q- a- f( \9 |( a9 k L4 @- h - __asm popad;
, G. r: }% p, T/ d - + _. [2 \- e% r; x
- //return a1;# t2 C" ]3 }4 r# \( M
- }
V0 z+ ]6 `7 q' i- S N0 d
: T, G: D, R* C! o+ t6 X6 L+ C- bool
4 F0 J, T. S& B2 ]/ ^ - ApplyPatchNibiru()
% p, x: M, p1 q! z - {
" P4 l! |- Z9 e1 A* I7 u% ^, C5 a - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
6 h. e1 i0 W4 V# t3 ` - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);( x ]0 ?7 y0 E- C
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599); H; D3 P+ L8 U
- " o) W5 n& d$ w
- 8 M& R4 c, U7 b. \2 \' ^
- 2 z# q) U* d) N: }: @* Z6 E
- return true;# f* l. Q& t4 j1 J, M
- }) \7 {7 I7 R U* C5 g7 e) f/ B
复制代码 3 @" o2 V9 o( H+ N
7 |* {$ i' M& Z6 z+ p1 |
7 f: W+ ?) Y! ~- J" Z& b8 f' O3 b& s; c$ n) A, L& ?
|