本帖最后由 shane007 于 2023-9-6 11:03 编辑
/ Y& N' l8 k5 M& D6 D* _* p: |" A# q$ K6 k+ U. S7 q3 b; V
(nibiru.exe 772 KB (790,528 字节))
8 F* c6 _* P0 u0 C2 w) b0 W! s j" k G
将sub_451390,sub_451599 这2个显示函数进行了hook.3 J$ ~2 Q' F0 p) h( o0 _
确认这2个显示函数都被调用了。: _# }: e M, Z/ `* u
第1个可能显示的是调试字符串,第2个显示游戏字幕。, ^; S Z3 L6 V# D! F1 A
& S6 P# j( Q3 w+ A
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
, G3 g% H. y' x3 g* Q& ?$ d6 ~0 ?' j7 O7 l9 `2 B
//v12 这里出错+ `8 R4 i) V; H; z; x# K
//GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
D$ b4 N" m5 }4 D7 h* \# X( D# v) P/ u" x' p8 C4 J
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
8 A9 `, x2 R# ]& z3 ?这种方式显然是有问题的,会影响性能。6 Q6 I: K8 u" n# @ C
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。% G0 o, V9 I5 t, Y1 G7 Z
) x1 ~( c9 e2 u1 f4 r& s. r. E3 {
- sub_451390_Font1_hk
, `( f8 r* ?7 ~6 D - sub_451390_Font1_hk: Q0 c5 {' q: p; J. h: W
- sub_451599_Font2_hk
# x2 T& @. U! _/ K - sub_451390_Font1_hk
1 ~2 b0 ]; l1 O# a' f - sub_451599_Font2_hk# s3 [) p( S- n" s* p- `" ^, K, A5 {
- sub_451599_Font2_hk% P3 H6 T0 D' r; r- F* {: W) R* K
- sub_451599_Font2_hk
# v! b" g# ?8 b0 E - sub_451599_Font2_hk
) B3 z1 z0 m/ x+ a4 L - sub_451599_Font2_hk( k& L* E1 Y/ A( Z" }/ L# O
- sub_451599_Font2_hk6 i# H: I( b& H: i( s, S. A
- sub_451599_Font2_hk$ `/ A9 V) q+ P: {4 h
- sub_451599_Font2_hk
7 s$ E: M) B6 v, m' p' x - sub_451599_Font2_hk
复制代码 5 k; w7 z# ?+ ]
代码
% a: l6 f/ a. Z" E% R5 O- #include <windows.h>! U5 [$ d( y5 c# R4 g) {
- #include <stdio.h>
- ^ C; ?0 q2 O6 R
1 N: c% l- U8 V* e! _; A$ J- #include "patch.h"
5 J( u7 \' v1 P" d% y4 _ - #include "patchNibiru.h"
, I$ {7 ?7 |2 l- P - #include <GL/gl.h>1 d2 o* b, z5 T+ K$ L. V) K4 c
" u; D, Q. e; i3 Z& S; f9 I
0 o2 ` X a, d6 s6 K% p( |: k2 a- DWORD SUB_451810 = 0x00451810;( N! C; n' `) ?4 h, @0 h
- DWORD SUB_451390 = 0x00451390;
; l4 m5 P+ i! Y9 P - DWORD SUB_451599 = 0x00451599;3 ^$ c/ V9 H' S' q
[8 n8 P4 u- @- HDC currentHdc;
; {5 f! h9 q7 N8 | - 8 M% S) E4 l Y0 d# D& T/ j
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)/ }# M1 z3 L" T" m. B$ q
- {; S: v8 E; X: Q ^: [% E4 n' `% t) @
- DWORD v10; // [esp-450h] [ebp-450h]
! }8 e; Z/ c( ?2 g+ A6 l5 h - int v11; // [esp-44Ch] [ebp-44Ch]
, \8 J i: v8 E, d. Q/ H - int v12; // [esp-4Ch] [ebp-4Ch]+ F4 v$ M9 t. h
- int v13; // [esp-44h] [ebp-44h]
" j* H+ d/ \) n8 p. A - HFONT v14; // [esp-14h] [ebp-14h]3 \4 r8 h7 M3 B- \
- DWORD v15; // [esp-10h] [ebp-10h]
4 i7 Z1 i9 b9 F v1 u, [ - int v16; // [esp-Ch] [ebp-Ch]' |( S6 U' H9 J
- int* i; // [esp-8h] [ebp-8h]
5 k$ P3 }. Y' ~ P
" |8 s' C2 y x# W* l! t' T4 |- __asm pushad;
' G& x3 u8 W( x) S& |! @8 k" \ - FILE* trace = fopen("font_trace.txt", "at");
: l! I7 o& q- Y7 @) J. I - fprintf(trace, "%s\n", "sub_451599_Font2_hk");' K) _' d) d0 t9 i) O& g C
- fclose(trace);
+ O1 X2 u: l7 J4 Z - __asm popad;
7 @; B7 |8 f5 T' u4 A - $ ?. i+ h* M8 X2 h
- //if (!a9)2 @& Z7 u4 z s7 J6 W* d
- //{. t+ l& R& S3 p- x9 x7 `
- // AddFontResourceA(lpFileName);
& n6 {' u% g7 M& F - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
' [2 z2 x @( z# r6 W - // ;
' _; [0 A( V! q - // *(_BYTE*)i = 0;/ k2 D3 A* g/ S7 y! I
- //}/ e, t+ ^" W& H! d% t& r4 k/ `# g
- //if (a4 == 1)
; d8 @ c4 \+ M8 q1 b5 M$ C% \0 v( b - //{5 c; o- o6 z% ~$ |( g5 v+ k; a! G, X
- // v16 = 100;8 `2 u! J8 W) j# e5 c' @! h
- //}: t! ]9 }8 q1 D5 z0 J: U" J! h) g
- //else if (a4 == 4)
5 u& c$ B2 l* s. r9 K - //{
/ p7 m6 s8 b) v- E, Y - // v16 = 700;6 N& u2 u. v: a8 r- u
- //}
6 R) n9 V8 |* K0 d: Y4 W - //else
0 \) n0 p3 l- { s6 E9 X O& G. K - //{
7 v' k7 D" e, j- I) A - // v16 = 400;
4 T2 {- {& @4 `4 u7 [ - //}
9 @, ~& a' N# ~ H' q - v10 = 1;
2 ~, s% T( {1 Y/ \- Z9 ^! D" B2 t0 H - //switch (dword_4AA490)2 w+ x& Z# b( R c/ g
- //{
. o' G% o+ Q" ]/ [7 O - //case 1250:
3 \+ V. A: O6 @) R; N, p3 i# p* E' F - // v10 = 238;" b7 a0 R* l3 d7 ]
- // break;3 _. D0 q; O d9 v
- //case 1251:$ l/ V$ @5 \( l: A8 X4 _; u
- // v10 = 204;
* R, d' M& u9 d- J" c - // break;
$ l8 \! a' k( c' N; N - //case 1252:
/ f) R5 t0 O5 ?# _, U6 [1 Z - // v10 = 0;! ~. C7 p7 W1 g
- // break;
1 c I. |. p! l. K - //}! J3 v6 O$ F) `
- v15 = glGenLists(256);
& S0 v. X4 g8 j( r( g' `* Q - v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");$ }5 F6 c% S4 X" a
- //if (!v14): ]% D% N( E8 h$ D7 |& o
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);5 L9 I# Z- z y k3 P) `
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; & o) M- S |0 }& Q& F9 X% b
- SelectObject(currentHdc, v14);/ S: K- A2 [8 N/ Y, p4 t9 {
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
/ ~& W- M# Y9 y9 i6 B1 j0 {
: r! \) r# B8 z# W. K0 F- //v12 这次出错# o1 g s+ v9 q
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* L! I" j; \( z6 C* x A3 Q
-
' G* U" ~4 ^5 _' `. {1 m' a) L - //*(_DWORD*)a2 = v12;
z" M2 |% ^0 W3 @- ?. N, X - //*(_DWORD*)a3 = v13;
, t% }( o, W( B - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
2 Y0 n) t' H- z - //if (!a9)
% W2 z2 h2 y) R w* x" n - // RemoveFontResourceA(lpFileName);( t7 j1 X* u( e& [
- return v15;
3 G7 S% i* }& S. X" R - }
( O: X; H/ I8 B* s
; H, C" v1 I# w- //使用到
0 ^/ D" {9 x; T5 n2 R$ V6 X - BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
9 p _0 d7 `8 S - {6 }; v; q1 i. q
- HFONT h; // [esp+4h] [ebp-8h]
4 Z7 u$ _4 R7 T( @3 N0 b% N9 z - DWORD iCharSet; // [esp+8h] [ebp-4h]
0 q- Y1 ^ H( A1 C# x; p8 P
" Q: {# q+ A7 \' ^# v# _
8 ?' B3 @4 ]& `+ e- t- __asm pushad;
/ }0 A3 u- x& Q/ i# s& r; } - FILE* trace = fopen("font_trace.txt", "at");
0 [5 t" P5 X9 E+ [. Z - fprintf(trace, "%s\n","sub_451390_Font1_hk");5 x" B, q$ w) f$ F D
- fclose(trace);7 s1 [6 m8 I" ` F2 f! [9 j' G
- __asm popad;* x. i5 i& j3 n) V
, c5 v# T0 D, W5 ~0 B- currentHdc = hdc;
3 ~+ o9 j% i0 O - iCharSet = 1;3 }0 W4 j* {. Z; l8 O; |2 j* ]
- GLuint base = glGenLists(256);
4 L M. q% R) d. E& U/ ~& Y; u - h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");. V0 m1 ~# [" c4 C: x# Y3 { R
- //if (!h); i. |. q |% Z5 z' Q. J
- // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);; x( a, A4 `; F% m d4 C
- SelectObject(hdc, h);
+ O W0 R/ f: L/ c - return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
( v+ P# K* @- O* O# R8 e - }8 J" ^( D7 }# K
7 r: L" U# c5 Y- void __cdecl( E/ u0 L& D5 f( t9 |3 K
- sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
8 m3 |9 H5 R8 M7 C( | - {
0 q. C I% d0 {5 e! F: V S/ j9 m$ O - __asm pushad;
) H7 Z, |4 ^! j6 \ - FILE* trace = fopen("sub_trace.txt", "at");
- Y5 K5 j) _3 L! i - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
2 X% D; m" \# L6 \ - fclose(trace);* d, X4 Y' [8 z6 U/ E
- __asm popad;3 d- t9 D, e, f' R/ H
7 ~( H2 o7 [3 I1 U; ~# g9 o6 h. R- //return a1;) `& @# P& d$ O9 V c
- }1 v7 [" {: e e2 I* J( k2 F
& d7 C$ W% x! E- bool
/ y( C9 s; ~/ Q) a% s' E& T0 v - ApplyPatchNibiru()
. q) e% o) b; W5 Y) h - {
$ f' g, R/ N1 |+ }3 u. u0 N. S - //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
" P9 I3 ~! n: ?$ a: E+ q2 y. M - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
6 k9 A, J, G8 A5 u- D# t - JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
l# C! P: o0 x" s9 l
1 w' G7 m" M; B+ |# N" @- 1 G6 ^5 l0 j0 i6 q5 y( R7 v
8 B* l& W$ b! t# w' }- return true;
* a! [( C# t6 \0 B J3 y) O9 J - }9 ]: r/ V, A! C+ Q" B
复制代码
. H% d, Z3 L, c/ J
4 j! n* |0 N* L1 M0 j; ^) N+ D: V1 x
' l; f7 t& b$ q0 `- A |