本帖最后由 shane007 于 2023-9-6 11:03 编辑 + d# ?$ f( o4 e: w
2 [* O7 I% L& T0 R(nibiru.exe 772 KB (790,528 字节))
6 a: \- h0 Y' g
5 J- o& {3 V2 r0 i$ ~将sub_451390,sub_451599 这2个显示函数进行了hook.
6 b' d! y5 z& s4 H) k" z: t确认这2个显示函数都被调用了。, t2 G, v$ `$ Y [2 v0 x2 s
第1个可能显示的是调试字符串,第2个显示游戏字幕。
2 V* S% U; M, \6 ~0 H/ k) C( q5 d: N# R0 B% c9 _2 V
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。: ~ r3 W$ m9 @4 F* A# y1 N o
" ^# r' F/ W2 L/ s s) A5 c //v12 这里出错
~2 G# d: H! e# [3 D/ [ //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
# O5 f" x5 f2 d5 r5 q
3 `& F6 ^- R Y: `% T输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
: w' H; c$ k. I这种方式显然是有问题的,会影响性能。
' M% } O: N$ k7 B在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; {/ Z$ o/ X& g1 v
_. t, J1 S$ c# |! ]! a- sub_451390_Font1_hk
9 }) L5 v9 | U& A& r- X - sub_451390_Font1_hk
8 G e6 m- L1 t, _ - sub_451599_Font2_hk8 d3 T9 T* A! U) ^
- sub_451390_Font1_hk
7 M: E3 J: ?' P$ S' B q0 j - sub_451599_Font2_hk
7 s1 E7 S7 p8 t+ K R$ U" v) c; U - sub_451599_Font2_hk
7 W$ M% p! A. X6 W; f2 C4 v - sub_451599_Font2_hk7 u6 ^" a r) ~+ c, {! B4 Q% _
- sub_451599_Font2_hk( p1 p! I# t) L, {
- sub_451599_Font2_hk
. w3 q7 I! J4 x7 R% R. H7 S - sub_451599_Font2_hk7 Z& a& Z8 q" ]
- sub_451599_Font2_hk3 j: U3 ^" x3 |; u# i
- sub_451599_Font2_hk* z$ E5 X% W; j* J
- sub_451599_Font2_hk
复制代码
4 d2 A+ h' J! ]% o' N代码
. k* m0 W& [5 I% |. D- #include <windows.h>' H" S6 _* d q) \0 c
- #include <stdio.h>1 N- A: v* {& [3 h1 _" ^6 O9 \
# m3 k) i# B: _3 J" {+ z- #include "patch.h"& g* w6 f8 L8 a1 a2 [. @
- #include "patchNibiru.h"0 R9 U& Z' B8 A9 I/ }" G! r( ?0 K: F
- #include <GL/gl.h>
# W' m. ?1 l) D7 R F - / c, U K8 i, a* K4 X' |
9 s( ~0 z7 t9 p/ e" \5 {- DWORD SUB_451810 = 0x00451810;
9 X, _( T2 a5 X$ m, r - DWORD SUB_451390 = 0x00451390;- E6 U1 Y. ^* H/ @! _7 l& f- u" S( g
- DWORD SUB_451599 = 0x00451599;
# O, }" m: g: Y# \2 ]! J6 F2 K - 1 M. j- A( h# O
- HDC currentHdc;
+ V/ Y; t b' ] - $ X6 g7 K5 O; M' k. ?
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)1 ]$ m* R' L& b6 | `
- {" N7 i) b& `* ]/ r
- DWORD v10; // [esp-450h] [ebp-450h]/ o1 j7 N/ m& u) u5 w
- int v11; // [esp-44Ch] [ebp-44Ch]! M1 A# C8 U* w8 u
- int v12; // [esp-4Ch] [ebp-4Ch]
. x# B" g0 c- t6 {" H - int v13; // [esp-44h] [ebp-44h]: v t$ I( M q% p5 E5 ? N
- HFONT v14; // [esp-14h] [ebp-14h]9 U2 g( T/ V1 d9 K
- DWORD v15; // [esp-10h] [ebp-10h]
r% a+ c/ f: G; d& T - int v16; // [esp-Ch] [ebp-Ch]; {9 u3 [: X" o/ P$ [. T
- int* i; // [esp-8h] [ebp-8h]
x4 [% K: W) c- `* F - 6 N* O- f' [" V* Y2 {5 Q# p) j9 i
- __asm pushad;
/ |! ^! i7 n6 P8 ]' _% s0 | - FILE* trace = fopen("font_trace.txt", "at");) u2 ~% S& N* b F- `) D
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");
" j6 J* q- n1 g7 d) M: p( ^ - fclose(trace);+ |9 P/ ]2 ?$ S$ `8 a
- __asm popad; S1 K9 G1 D2 I# ~& [0 @
- 7 T; h9 k9 u6 ]; V
- //if (!a9)( l. S" _& \/ i6 ~& X; c, z6 M. J2 v" i
- //{& H6 h4 D2 A8 {5 t! ~' {
- // AddFontResourceA(lpFileName);+ s/ P; w$ i! T' J$ r+ q& j
- // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))% C# ~, y: b( _! f4 \
- // ;
+ W! Y; E# [/ ~: U0 E% |; I - // *(_BYTE*)i = 0;
, M( X6 i2 k& I0 e/ Q& \ - //}
3 D; ?2 v" }6 O, w; S* G: l - //if (a4 == 1)
. `+ q9 I0 [8 y2 q& P - //{, ~; t# L2 w) L% z
- // v16 = 100;
; u: m9 r7 J9 @, Q2 b$ @ - //}
* F3 a" k: Q" ^" w - //else if (a4 == 4); p+ v7 S* o& I0 {) U0 z' S8 ?8 i
- //{7 H7 N/ S* N( X( i2 @! V: x4 V9 s' a
- // v16 = 700;
) y$ @6 K0 @ A) j9 h1 e9 Y0 s; H - //}
" i5 e6 x/ {# ~: T% k- ^: G# s - //else8 h7 o$ b. v. J' }% ?/ D
- //{1 l, U/ K6 k9 g; s; G" J/ L
- // v16 = 400;
1 Q3 s5 ^, @6 B) g$ k$ D - //}9 T& L3 ?0 r. J
- v10 = 1;
: W3 z* p& z( a - //switch (dword_4AA490)
( o3 p) e# ]" G- T+ U F9 t - //{+ S/ E3 z. U0 k! e5 ]
- //case 1250:4 @' H: |. o* q5 k) `/ O
- // v10 = 238;
( h# }) a0 F7 u1 d6 S - // break;3 _* F( a% F. {0 d
- //case 1251:. U: d7 I3 l+ S5 R6 E
- // v10 = 204;
0 e- Z7 B% U* z8 O# V: n - // break;
/ [! u6 r3 u& }/ Z% j' i - //case 1252:. C' k+ R# V2 o9 n \/ ~
- // v10 = 0; A) z5 a! b9 T$ P7 c% D
- // break;
; _1 C) Z$ b, @ e2 _$ j - //}
! _3 ~: K$ ]5 S8 H5 W; t - v15 = glGenLists(256);
$ w, ^6 W" k0 H- F- T0 T. Y - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");7 N9 Q4 x( s, J6 I( B$ I; @
- //if (!v14)
! G2 W/ S" r+ p5 \, R1 Q - // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);) ~; y Q: V4 c* @, m; k1 K
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
/ i4 T M6 } Y0 K6 y! K0 u8 y - SelectObject(currentHdc, v14);
2 p6 ^% T! ~' |6 p9 \/ f - GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
+ _! A8 V. }& K& t4 s
& \8 W% }' @/ H6 S- //v12 这次出错( T( ]+ {% d, i1 d4 A
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);; ]& K- {0 R; ]5 w7 j
- ( o+ O( e8 {/ L
- //*(_DWORD*)a2 = v12;
0 _; W* U$ i: k0 `! i7 i - //*(_DWORD*)a3 = v13;: P y- Z# c* V
- wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);, S" v. U8 P I- T/ |
- //if (!a9)
, Z4 G9 @; t3 D$ K0 ]( D - // RemoveFontResourceA(lpFileName);3 V" M) Y$ z9 H8 U2 ^! I- e
- return v15;. l% v5 T$ ~ W" d: G. ~
- }
! i3 y8 Y- V3 M ~ - / D+ Q2 K1 ~2 X& U1 L
- //使用到
4 [$ o8 {& W6 H, v - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)4 F) `8 w( {3 ?2 h
- {7 a9 E7 E+ D$ r2 n
- HFONT h; // [esp+4h] [ebp-8h]% F4 Q- Y) H. r' m# ]4 [
- DWORD iCharSet; // [esp+8h] [ebp-4h], h* \! L* }$ v2 o. ]( Q6 G) o" o
/ Y, a- l# u2 j, Q4 M; P
: P2 I0 j5 t6 j! J- __asm pushad;
, H! Z) a8 D1 b5 [4 k' o - FILE* trace = fopen("font_trace.txt", "at");
+ U& V8 C v% k ]$ _+ T% V/ w - fprintf(trace, "%s\n","sub_451390_Font1_hk");
. Q/ Y6 m8 ^) T* C2 S6 p" A7 A5 h/ M, ? - fclose(trace);' L& b) Y7 o9 C; ]' E" k
- __asm popad;6 z# n, i9 V- T' a9 _/ ]
$ Y" j( C3 ~. N4 G7 s; T- currentHdc = hdc;0 ?; R. M" P% b+ Z. U* O! ]
- iCharSet = 1;
9 A1 ^& z/ y7 B- ^0 z+ G7 l - GLuint base = glGenLists(256);6 O' | l/ ?- O" m/ E, A" ~
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");) g- p, Q5 |# D3 b6 e
- //if (!h); E2 Y9 j5 T0 \* B% I
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);+ C- U; P- X$ g9 \0 O6 |
- SelectObject(hdc, h);* v3 }, Q- V7 Z& u
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);) ]* i6 b s7 i/ r/ U) a" @
- }) ~6 h( ? n! \5 `; e
- 1 j* @5 Y6 O' t9 n- n/ S
- void __cdecl+ `! [* p; W* C/ W5 d2 b' \
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)5 M# k$ B/ H6 ^# I+ Z
- {
7 E9 j' {% @3 a2 R, N6 L4 L. @; i - __asm pushad;
3 k( j5 W7 H; A% T - FILE* trace = fopen("sub_trace.txt", "at");2 n0 E V( c( k- x# C
- fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
1 ^6 b( Q: |# z2 H0 R' F - fclose(trace);/ t6 k/ ]' _1 p( N) B$ r
- __asm popad;( q) ?" M' x2 f. f* F
# V3 M2 }" L7 A, J' I$ a; U0 H# p- //return a1;
& u3 o) r: S$ I, {9 |5 _9 Q - }
# d e: {/ L, G2 y0 J, I - 8 J. m, M/ ?) E i' F
- bool) T3 W' L+ E ?( }
- ApplyPatchNibiru()+ K+ Y: _+ t# q9 i8 O% a+ B
- {7 g# h6 E# E" G8 ?# D) L5 H3 ^
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);: t% y8 [3 k5 f6 A4 \* M
- JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);3 l6 C3 S- B! K8 V7 \
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);" e9 B3 ~' p8 _
b* b0 i3 R% e \
' K8 B) ?8 |+ |' ^( m& R
- ?; r( Z2 j# ?. R% l4 |2 {0 K, l- return true;
' x+ G. q9 v; n - }% v2 j! m$ y k' Z; O+ u
复制代码
: q8 m/ k! U1 I/ q
9 y/ c( ]5 I7 }- g
/ h% E: M" w6 I; H4 U
% X+ G' V; v: j, l2 b* R: x |