本帖最后由 shane007 于 2023-9-6 11:03 编辑 & K5 T4 r9 A$ _, v* Y4 O6 W: C
8 q- V) H7 E6 I(nibiru.exe 772 KB (790,528 字节))
W9 c/ ?9 d( `2 z
- P( P) }% |8 D将sub_451390,sub_451599 这2个显示函数进行了hook.( I: ~' ~, @+ |# _8 m
确认这2个显示函数都被调用了。1 c2 |+ {) E1 a1 a# l3 M9 ~
第1个可能显示的是调试字符串,第2个显示游戏字幕。
. k* U* w: h' h# d0 t9 K0 B) Q% J5 D4 J. Z4 ~
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。. K/ `* r: g7 K6 l6 s
' C8 K4 q! ^/ D* N! N& `. c8 v //v12 这里出错
0 Q$ N8 L( n; l0 I( @8 A; b0 L //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ J+ g+ v: Q" k4 G* n1 y. Z$ _. i* v' o7 h7 w* K9 B5 V! [" t2 E
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
* B/ M Z* Z% m3 h' N0 A这种方式显然是有问题的,会影响性能。2 M3 l8 f+ s" v$ i' w
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; v. v/ N" ^, `3 A+ Z! y/ X* I
' h3 F: X& X P% Y- sub_451390_Font1_hk# P. U$ w& ~4 W
- sub_451390_Font1_hk
8 Y. y- U+ P% ?7 M+ M: Y& H2 j - sub_451599_Font2_hk! l# j: D7 Z4 M2 |4 j
- sub_451390_Font1_hk4 o( [4 @6 e q
- sub_451599_Font2_hk8 W: j% h2 z( u
- sub_451599_Font2_hk
& n- h" c* F. o1 C% `( i) V+ |. v - sub_451599_Font2_hk' Q i0 e& l, x! r* ?* M
- sub_451599_Font2_hk1 D$ F$ F% Y9 R$ G) m
- sub_451599_Font2_hk9 R/ Z# c9 {/ e1 X! r5 ]
- sub_451599_Font2_hk9 W* Y' b, X5 v/ b8 M
- sub_451599_Font2_hk' i6 Y# i0 L0 E' H( P; z
- sub_451599_Font2_hk
2 k F" K. K$ `. ` - sub_451599_Font2_hk
复制代码
% W+ w' K/ l7 ]6 w1 G3 `: B代码
- G" u6 v8 G& c A2 X- #include <windows.h>
7 n8 x0 H6 V) E# C - #include <stdio.h>
0 y( D! e; P& R: _6 D4 q& u. `; h3 ?4 E - 4 b$ p6 q; Q3 l4 V
- #include "patch.h"
* G7 f: ?* @% v+ e# d - #include "patchNibiru.h"
% b: H7 M6 ]# ?5 ]/ C) [" o - #include <GL/gl.h>: ]% O: [0 x6 g k, x
- 4 t$ Y- W O, \8 E K6 j8 j
- # j5 i0 o* H9 C, ]! X4 F X
- DWORD SUB_451810 = 0x00451810;
1 q# O" N: [+ _- e! g9 _2 k. U - DWORD SUB_451390 = 0x00451390;
. `/ c7 T8 F# E4 {& B - DWORD SUB_451599 = 0x00451599;# ~7 ]5 A; W& F7 _- Q- d% K1 t( C
' c7 K7 ~+ K: ^" x0 g$ L; Q- HDC currentHdc;6 u0 [# _) h9 r7 `
- 1 Y" \: A- E8 H, U
- DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)& O5 q! S& `0 l) ~" o
- {
, H( @- Q+ w C! k4 j8 } - DWORD v10; // [esp-450h] [ebp-450h]$ D6 t" I% ~9 R: Z' w( `; A
- int v11; // [esp-44Ch] [ebp-44Ch]# I: E' q; }9 Z. F. r# c& a
- int v12; // [esp-4Ch] [ebp-4Ch]0 n0 F+ x. ?* t- X. |$ k/ h* i q
- int v13; // [esp-44h] [ebp-44h]9 ^% C6 @/ X6 j
- HFONT v14; // [esp-14h] [ebp-14h]6 m3 j- P1 A. Z1 ]: `- d
- DWORD v15; // [esp-10h] [ebp-10h]# G1 ^& _# M- x1 p6 z
- int v16; // [esp-Ch] [ebp-Ch]
3 Q* `; t% B- d# Y1 k; s - int* i; // [esp-8h] [ebp-8h]$ Q, i) b8 [1 o* B
- ( ~! O$ F$ L& S+ C9 D) ]( R( y
- __asm pushad;0 r. o7 a5 E+ w
- FILE* trace = fopen("font_trace.txt", "at");" y& M2 ^% Q5 K$ Y
- fprintf(trace, "%s\n", "sub_451599_Font2_hk");2 k5 T; L+ c" }- O- ~
- fclose(trace);- }. _* f3 U# B( N f0 z8 n
- __asm popad;
& [! X1 |+ l5 K1 v$ X -
: |2 ~8 h1 |, c+ g, e7 v% Y3 |. E - //if (!a9)# r' Y# D6 {3 w- f& e% Y+ `
- //{8 k! W: I( j0 F0 [6 Q
- // AddFontResourceA(lpFileName);
# b2 W& D6 f5 _6 o% g - // for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
1 D# }# {8 w0 k3 z% f5 f - // ;1 d1 K- N7 g) }5 U8 T9 I5 o
- // *(_BYTE*)i = 0;
7 `1 F; Q- h5 B - //}# b' n; z" h8 D4 Q" d4 q( _! {
- //if (a4 == 1). @7 V* I0 j5 x
- //{. o: f. S6 p. m E/ N# x& A3 y
- // v16 = 100;
5 O- [( j2 o) ]9 x! t# m - //}
' u9 Z( N# X: d! t7 R$ r* Z% C - //else if (a4 == 4)
b4 q$ h. e. C8 O/ P8 y" _ - //{
! l# {6 z3 g0 z/ r, [ - // v16 = 700; r' h: A6 e8 j6 [
- //}3 X- J* O% g- H% H
- //else
) C8 X) s: K/ v- I3 R( a - //{
4 u2 @- C- _# R; Z$ A - // v16 = 400;
! W: F1 L% d4 A; t - //}# i$ x0 A1 s# ^+ @0 i
- v10 = 1;
1 Y3 u% c5 _! T. Z8 F m2 u - //switch (dword_4AA490)# _# G! h* n8 n! \, ?, j+ f U; ^
- //{
, ~1 o) i# p0 S - //case 1250:. L, v/ ^( } z
- // v10 = 238;
* G1 h2 h/ y: d+ b" K - // break;" \$ I% h. d: {( n5 |- ]6 W- q2 }
- //case 1251:
/ g+ r7 o2 q# ^9 e6 E - // v10 = 204;7 I/ @0 C' \2 G) M6 U1 v
- // break;# x6 H' N+ {8 l
- //case 1252:5 y+ M* T' o9 P0 g% W9 S" N: V
- // v10 = 0;
# u8 G" v* h; z: H. r& n2 U! E - // break;
1 d/ c! F2 o4 m& O: v( h" r - //}
/ Q! r8 R! D; _. a4 k7 H, k - v15 = glGenLists(256);9 |8 {" c8 _; }8 q; r& G
- v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");. G6 ~ q3 F! \# F; h
- //if (!v14)7 F1 l. v( a/ \; V
- // MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);" c6 |: i$ ]8 _* \* F. Y
- //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ~5 K9 c3 s" m |
- SelectObject(currentHdc, v14);+ i2 A- k4 V4 ?# }; t& u' I
- GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
6 |& Q0 A+ q' R) { - 0 i5 Y* W( k4 k6 A( |
- //v12 这次出错" u* K5 Y+ b2 w( T7 ~+ p
- //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
& L/ g2 K3 A0 ]! _/ \) D: v -
2 ]9 Q! f! O% F8 g& ~$ G: G# S - //*(_DWORD*)a2 = v12; c- c7 M% e1 { g3 `- |/ f0 |* x
- //*(_DWORD*)a3 = v13;
4 a9 y) o" {2 n" Z' ] - wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);9 y$ m* P. Y5 H' b9 R4 N
- //if (!a9)
4 q, h9 s6 u5 w* m7 O' o - // RemoveFontResourceA(lpFileName);
" O/ B$ y( [: h& m( T# d6 v - return v15;" p/ w5 W( T/ H& w1 a8 J
- }' V2 [. k( h& r$ U8 D5 ^6 I8 [
4 D5 q0 S3 Q w! D" \- //使用到6 _5 a. d! t4 x W
- BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
9 B# S2 |# f1 {* g - {
5 p( |4 b+ K7 V9 d1 d - HFONT h; // [esp+4h] [ebp-8h]
: I5 v% `( a$ n - DWORD iCharSet; // [esp+8h] [ebp-4h]
. o( |/ a" R4 M" |7 h - 8 w; y; u) @; Q1 O
- % Q$ c7 K% g2 O" H. g1 L
- __asm pushad;
( S( {% w* H# A6 x# u3 v2 T - FILE* trace = fopen("font_trace.txt", "at");0 R( Y9 T* f( P$ I9 x, F, R
- fprintf(trace, "%s\n","sub_451390_Font1_hk");
& V$ w' [$ ?5 |; j8 o( ] H - fclose(trace);3 W' |6 M! B! z& ]& d
- __asm popad;
5 k! w' K& ?" d7 O
; p* U8 O4 K. E# G/ d- currentHdc = hdc;7 h& d; i: b7 \7 ~: q/ N
- iCharSet = 1;
" H d% ~5 l/ `" f* n0 w6 m - GLuint base = glGenLists(256);. e" X% i9 _9 E8 ]9 ^1 W
- h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
2 b4 @8 c) u& R6 X8 c; z& U' N7 I - //if (!h)
, ?/ Z2 X- Y( y2 O! k3 g5 p - // MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
; a h& \$ Y; \: Z - SelectObject(hdc, h);6 p1 p0 l# Q1 W8 \" s' d# @
- return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
8 c7 V& M- A Z( {9 R3 a - }
/ u; }5 s/ [$ P3 g2 j% r( U% o
! [% L( @) b1 w& {- ?* l Z- void __cdecl
0 ~# x! \1 ~4 _1 U2 |% Q; L E# R4 h - sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
! u3 W4 S2 H4 G( P - {
L' l" b& y6 n4 ^/ k, ]. Y" ^ - __asm pushad;8 S. K5 O$ _# u5 _# o2 _4 D7 m( Y
- FILE* trace = fopen("sub_trace.txt", "at");
- p1 E: }0 J; m+ d* M4 D - fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
; A0 z" T7 {" f, Y, o - fclose(trace);* C' ~8 T$ b6 c
- __asm popad;# r4 I$ ^$ t& {3 m) M
& R9 d6 X( x+ ^+ P" h& t: {- //return a1;
1 g9 j! E; Z) u3 Z( _& |4 o" { - }$ u$ Y& T5 g; [6 A# d, K/ N( g4 _
- ' b) R: ?, k. p7 u
- bool
3 z1 |2 j8 y2 V' [' x! ~- {" ~ - ApplyPatchNibiru()% ~% Z4 u+ l* l7 A- V6 c
- {6 e9 @) T* r, K( C+ `
- //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
0 b# v: \1 X- m) [# Z8 ? - JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);: o1 Z( H: E2 I* I" K8 C9 ~' t7 v4 R, o8 N
- JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
6 ]# e* I f/ j: i
/ m f+ \( x* b$ d- 2 f8 L' W% b7 k" q4 Y
, V3 W# K/ Y) R" p, N- return true;0 Z! z6 c' E9 q7 D/ N ^
- }
& q1 e8 Z- w; |. j1 ]
复制代码
9 ^, u$ H" |5 W! O- M7 B# W# }! ?( r6 }, P Y; x
5 l# ? X% W+ @% p1 A. z1 d
' N$ D6 I+ R" T |