冒险解谜游戏中文网 ChinaAVG

标题: 【OpenGL汉化研究】Hook OpenGL的問題 [打印本页]

作者: shane007    时间: 2010-1-24 11:41
标题: 【OpenGL汉化研究】Hook OpenGL的問題
这篇文章的一些思路和我的某些思路类似,留待以后参考。
0 w; K( X, R3 b( O+ i建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。

% E- V6 T# p7 ]% a! x/ k$ x2 C, T% [+ M1 K* t3 \
原文
3 b5 \' P; n6 y* e4 s* c6 _* G: fhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html : M' j4 z% s  f/ I1 `

6 w- E  f( J+ t* D& n% J大家好, , m+ n; }# l- Y
/ j- ?% B2 u% z3 U7 I
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable ( A& ]7 a1 v: a: P' ~
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
  f+ r# ]" g+ Z- p( e) C, @8 z! P) J, X- r4 n/ J
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
3 L5 m2 \" s  {7 o& p    但是BMP圖放在wglSwapBuffers卻顯示不出來 9 t) F, J* _1 Z$ }$ B" c
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 - k/ H/ X" c" r9 G, U' r. C) ]
樣的時間字串  
- O4 H) T3 K4 h  a
+ M/ ?, O/ {5 M+ G. L. F$ r7 ^% S; K. t

/ O  t$ ^4 ?1 o& Y& P4 j) k# Z: s4 s& I. a作者 : fushunwu(fushunwu) ) f6 N# J# l. d# i9 ?) y
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    # P$ b, x- g  B
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  ! |+ M% D) z! z  [' m
2006/9/5 下午 03:21:34   b! ?* v/ L* A4 r4 y7 \
/ n% L. U6 v  R
sorry,按太快還沒打完 ..
2 K$ s/ ~5 o/ |% Q% x% Z& f+ h, t/ J! N
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
; e+ g" B8 \8 Q' |" |' [' g& u" ?,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) " o. c1 [1 k' M5 k7 f
* I0 M- s8 J! Y3 t' @7 J$ K
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 : C! K1 e" x2 p4 p" C2 ?& g4 f- A
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
3 m! [# R$ m- r! I3 z, Y
% h& K; a5 `: \" P' x想請問各位高手,有沒有一些好方法可以解決 . $ `3 r8 Z% f" {  f) b# o! Z
1 A: }. J0 @1 l8 D1 h6 }4 a) ^" h
下面是我hook opengl API的code : & |: t9 k1 {: R2 O
// hook wglSwapBuffers的code; hook glBegin的code也一樣
; y/ ?7 n$ O  C: Rvoid WINAPI wglSwapBuffersCallback(HDC hDC)
! ]4 q7 G6 M4 M2 r  {
4 x7 e( ~) \9 K' o7 l. g# r, L1 n9 p: w) z5 V
if(!ininstializedfontshit) 8 U1 m, u1 c7 P; a
{
, |) v. c3 U+ Z- G1 sfont.InitText();
4 [4 N/ @. B2 \# A0 E# R3 n0 zininstializedfontshit=true; # N5 \" d' c# E! y3 b
} 9 I" ^5 a: y  F" V
, W0 o0 T" W' k( i' j# |) s
SYSTEMTIME SysTime; " z6 ]9 U- e  q- S7 d6 R$ d
GetLocalTime(&SysTime); 7 J9 W/ _/ Q; K. Y+ ^% J; U8 e, x
glPushAttrib(GL_CURRENT_BIT);
. k( t4 m4 U& g/ H8 P9 J    // 顯示現在時間的字串 9 D( M- L9 v& f) P, m; t, u! J
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); 1 N  J0 j: {, z  Y. W+ b" j' G$ M

2 b% O" c9 ?" A" e- Z' [7 b4 A    // 顯示BMP
3 A, Z* A* k: I; y" G
4 q/ |- W  |, T" g; G' j    byte Texture[]={IDB_BITMAP1};
9 [3 x2 V4 w  ^+ M/ i( \' i4 Q8 O    glGenTextures(1, &texture[0]);
3 N6 Y' P" `1 ?hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); . y9 c2 |/ k; Q7 D: E

  M; {8 L% s7 g4 b( w! g, e4 sif (hBMP) // Does The Bitmap Exist?   N1 A4 }5 ^! o9 G0 Z  p' Z$ W
{ // If So...
3 B" \% z+ n: y' E$ `; `GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object ; [* M, y5 g# X7 D  H
// sizeof(BMP): Size Of Buffer For Object Information 6 j  c/ y# [) x, M. Y
// Buffer For Object Information 2 [; W/ p1 V+ |- r" [6 N- V& n
glMatrixMode(GL_MODELVIEW); : h, Y& V8 L4 d" ~4 I
glLoadIdentity(); . H+ L! l4 p5 b- L. [2 A
glTranslatef(0.0f,0.0f,-1.0f); 6 l! K! n9 q- \1 n4 H) p! ?- |2 p
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
3 M; s/ t; o& Q; ]3 o* r    // Bind Our Texture
' \& B* W& I' I8 `7 y    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
+ f* L, e- B, k2 O! }! ]! L. L/ P    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
4 C" E3 W" h5 @. S4 x' T8 I1 Z) m5 o$ h; s* x* J5 |/ o2 `
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); / H. U# X8 }# `1 r
DeleteObject(hBMP); // Delete The Bitmap Object * o, T- T' c; e6 Y: V
} , {1 X$ X) z" [
glPopAttrib();
" _  f/ E8 k4 T# Y$ ]: |% R6 C, K6 G# p# r  u2 v

$ ?' |$ G4 L- V4 S3 e} ) X# C0 j4 f" X$ S5 X" A
wglSwapBuffersNext(hDC);
5 S/ z1 l( c# Z% @% E} 0 ~  O) d8 _6 f
3 |! P! Y6 Z5 \) N
6 p4 Q6 T8 M5 @  a! N

: T. t. ~( w. y- x4 \; ?. Z' N) }' J; r4 I  E5 L- F
6 ?. j* A# Y8 _3 B

5 w; G2 S; `- ?8 f1 [" s, Z作者 : dorkas(aming) 5 y5 f. p! ?. G/ v
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
! H+ e4 q2 `& s' W[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  6 V; A5 C# q, @. g& ~
2006/9/7 上午 10:30:03 7 U( u. N1 N; C# Y5 `6 H

" ^3 f# C! _# _: w( U1.貼圖動作錯誤 " K6 ?! y" F  d7 T% `5 @

9 ^) J% E# q, l+ c2.
; c' Q9 F: T( h% z每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 " l2 s4 C' O% e5 `0 `
$ V- S2 p' p4 k  ~6 u- }/ z

2 k0 }: O/ b- j7 Z& ~5 E+ R: wstruct MyTime
  _( ]8 ~) A9 W' Y) o{
" ?1 B: K# c1 z8 w; `0 l! c    byte Texture; $ x% r* `( f8 m# z6 S
    FontGL font; 0 S. g- ^7 S% N
    void initial(void);
2 Z: U1 b- V6 h: r$ a7 g. A    void finish(void); 9 J% a7 R  o; h3 B: x* ?
    void draw(void); & h) o9 N+ p( l2 L) }$ Y
};
7 d- P/ K; u1 \% Yvoid MyTime::initial(void)
- J4 I3 p& F, Z% C" D% n{ * |6 e4 z, N' F  C
    // 載圖 初始字型
3 I( e+ L7 e1 x% P$ I    font.InitText(); . r# \7 Y, t: `' B% d, E
  glGenTextures(1, &Texture);
1 v- ?0 G8 Y$ x/ }5 p8 N" s/ @# q}
  A7 W& @8 ^0 n$ Q" V% F0 Qvoid MyTime::finish(void) 2 X( a3 p1 O% ~
{ " P0 p1 ]% m- q
    //釋放圖形 字型資源 6 L7 d; s' n8 }; z6 E
}
9 v+ F6 x$ J( z7 V) p# H: p- a- L* h& l" d* A, `/ I! Y
void MyTime::draw(void)
! o- I# M1 V$ Q0 Y4 a* j) x{ * ]9 D: p* C$ m5 `9 R2 r$ L% p
    // 顯示現在時間的字串 ( v- e& G8 L" Z  ]- q
    font.Print(......something...);
5 A9 G! y: _0 h: Y: @% T3 I, o    // Buffer For Object Information
8 V0 Z- }9 l% c. r: N" X    glMatrixMode(GL_MODELVIEW); 3 N& L0 j' J( n! W% L
    glLoadIdentity();
! E6 ^( [. m- z% ^% `    glTranslatef(0.0f,0.0f,-1.0f);
* @) L2 i" j1 `, M& }    glBindTexture(GL_TEXTURE_2D, Texture); ( r- G+ M- n2 n$ P

8 G, B' y# m; y! D9 A, G* @  ..... DrawSomeThing
2 q) Z" c* A5 W1 z/ M( t. G3 l    & ^4 f) @0 T* x$ J, n- K
}   |" k+ A! A- J, o

: h; P5 j5 y0 p% s
: x& [; G  [" S8 R# FMyTime time; / Y( ~: e" l# O6 C) u
void WINAPI wglSwapBuffersCallback(HDC hDC) & A3 c! ?, l: ?. Z2 X& R- \# R7 J) N
{ 6 R; H* E8 \* \) D
    time.draw(); * {) H% @# ^0 O# I' e" z
    wglSwapBuffersNext(hDC);
7 i& Q' X" C5 Y: X1 k% w3 R: A}   x8 S% k2 H0 Q9 D9 H  @! Z
  p9 d% D3 Q$ R' x
你只要掛進去前呼叫 time.initial(); , K6 o2 {+ [- M! I/ H1 f
結束呼叫 time.finish();
$ l. J# A, w; Q: j: s6 M' k+ O8 V
- v+ r& _* ~1 L. @8 [0 y9 O9 J9 K, @8 n. f# Z
# c; P" r7 ~( m. S

2 d: F/ w: I0 o, ?4 {" ?& a% m作者 : fushunwu(fushunwu) % j& G7 F6 Y0 @
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
- o9 z* E% K! o. \[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  ( W$ K. I. A0 n  M0 N) Z: e+ g- U
2006/9/7 下午 04:19:31
/ {: a$ W! E7 s' D* _5 p- E" ^7 i+ v$ y* U7 ^2 E
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
1 i% P" J3 `% f; }( g0 C3 W& e1 c
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
, i! q5 i: i5 d6 J時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
4 r, u3 b) ~2 L! B! X像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
+ Q+ n2 _" X$ S+ s; {; N8 K  x所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
0 t* C! @6 ~; T" K8 m/ A  I( Z$ s% W* w! }4 y% O

7 G; f) j$ r8 Y(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
, N! Y8 A) W4 g    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? . Q: q9 R) M- T& \8 F1 {1 }; V
    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
  @& B' v( S% i  i! \* l, `) q
2 G/ i+ S! m8 @1 G" M1 ~' f5 I(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 6 t$ i$ A- _, F& l# }) ~7 `0 l
( C& H5 L* w; G; J
4 ^1 x: A6 |9 ?; W( S/ p  V$ @
* J7 P  W9 u1 ~. C$ E4 f

$ W& b0 r, `/ ]4 M+ j/ G: s* G( |6 E/ G* C9 w( P: Q
作者 : dorkas(aming) ' |) }  G' F8 R% `$ Z  v( n4 S
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    * ?* H: ~7 w! x; l
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]    e: X; J9 ~& s& S1 B
2006/9/7 下午 05:31:01
( z8 q3 b1 p. O4 c, j1 L2 a' K% m  e2 x! d# |
1&2
: d5 Y, `( W. O我對OpenGL不熟... : I6 n1 R: ?0 K" y& }! z
5 V0 p* V& W/ E& Q% o
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
) o! S( F- p/ W% \4 p. V$ c
4 G, q2 \% V  R/ y  x+ F: r$ t& m8 u) @% w( D4 b$ f
初始跟結束都是做一次的就好了 # W2 @$ x- _" p* }2 S
你高興要擺在迴圈裡面也是可以 ! S2 p, f+ [1 Q& t  i0 r0 h" B
6 d- h0 Y, J! F# Y' T3 \/ W
程式的要訣就是 起 承 轉 合 ' P/ T5 q  e- m
initial
0 X5 `0 M% \9 h5 C; bupDate
5 i2 q) |: K7 C9 C) jchange
1 y# A: b6 M" e, ]3 F8 zfinish ; J: M6 x/ N4 L1 @
物件也是起承轉合 + L$ u& A: G. |  V
函數也是起承轉合 . g6 ?5 x# O) g# e6 E* h
迴圈裡面也是 起 承 轉 合 : v' ]! s# [7 o. T2 x6 h
. p: A0 E/ `2 a

* r2 I+ ^- l" K. G( r9 d2 S0 e- w: Sfor(起;承;轉) $ }3 U. m9 M: N, X. y: g
{ 8 D% o: K% }/ {

( q6 p/ c1 Q) P1 |2 ~, t9 t& d4 t- l' e* R2 f4 L5 ~; [( R
& u! d+ }  J, D) c+ f, ~4 N! `# q

5 x& p: i. _6 J6 V. c/ U8 p# W; J. ^% ~}
  g1 x, r4 O; \) }, |
( t3 d' D$ q: X! r+ f" y5 I+ d5 E2 n' d& z8 `; ]
只要你分的清楚 屬於那一塊的性質就好了
# n! c8 C6 B- _. L9 H/ Z/ m8 d- n, h: ^. M5 z% k' Q) P0 D' l

0 n# P& d) i) q. j
! n# O, r% {, F* A8 z! @/ @7 q* P. S: e2 D5 J1 v: r. e# E( _" B

/ t% D8 y" g* O. v+ \2 S" x作者 : fushunwu(fushunwu)
  y5 ?9 p' a6 X: ?  ?' D0 r/ h[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    " h% c  G& t! n7 g$ @$ k' y
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  ) ?$ q& I3 e) N/ H% |6 a8 {
2006/9/8 上午 10:32:26 1 r! R0 S. n# m% n# d% X# d
' i! `5 H* A2 t! S1 V2 Q: P" |
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
! a, A  K3 @; D' D7 x
" [: X2 G! |: \像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin . c+ d& E9 K; x: W
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 : F5 t. g0 c' Z+ `( Z! s; \; p
我在想是不是因為座標還是矩陣的問題 ? 0 A; V, \4 Q9 L% B

$ M2 |7 ?) c/ t# d但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? : G# e( y+ a6 X3 z
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 4 V+ W% Y, J8 Y4 n3 P# v4 c
  b0 w4 u' _: j
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
作者: 海心的剑    时间: 2010-1-24 15:03
一丁点都看不懂。。。。。。。。 [s:60]




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2