冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2010-1-24 11:41
标题: 【OpenGL汉化研究】Hook OpenGL的問題
这篇文章的一些思路和我的某些思路类似,留待以后参考。
' |$ _; ~1 _4 O6 }建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。

" N5 X7 R$ ^1 O2 a$ [$ _, n# r+ p# }5 s/ ^( F
原文 3 r7 y+ |( \$ w" W
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html * U2 `1 J5 J/ q, _# l
4 F. Y3 P; l) {
大家好, & P+ E# k5 [# h5 z

: M& s" X9 n3 z6 T' X我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable , H! p$ ]/ k" q5 r
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
" Y) ~. H% c4 `2 V0 Y. X8 o
$ [0 p, a+ X* d8 J4 K0 S) o(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ; ^+ _! R4 k$ H8 S3 i
    但是BMP圖放在wglSwapBuffers卻顯示不出來 , w% X: [& Z! d+ D2 [4 |
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
, e4 \9 m$ _  i$ C% x樣的時間字串  7 z2 J) h6 @/ n+ }' F  j6 Z

+ n! E/ r! }! a) {+ z  _( [% h6 L+ t/ j& i" c  i
; \" x. f  _! p" g8 j! E" z
作者 : fushunwu(fushunwu) . `- h3 U5 d- B2 {4 k/ j: u
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
. t; S1 ^: f) W3 \: D$ d[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  5 S6 }" D* }' f  s
2006/9/5 下午 03:21:34
: ^6 Z) y" S& l  `/ T" o; F8 _, e: J2 J. X% X( L6 C, z- M
sorry,按太快還沒打完 ..
  }2 r- S9 s+ H  E/ ]% a' B3 s! f) b' D& x/ b% c, d3 p+ _4 A
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
0 F# k( z+ e- O9 z6 k,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
' A& G& y/ u+ w
. l& I9 s2 ]5 b2 u9 G(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來   z8 D2 g) }4 e; H
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. ! |8 ]1 I, X1 x9 K3 p+ {
3 c) w3 ^$ Y0 K; v6 e+ ]9 J5 g* P
想請問各位高手,有沒有一些好方法可以解決 .
$ c. C2 R0 B: Z" [) D$ L' i3 Y* j' W! E- P" O2 J* R& \
下面是我hook opengl API的code :
# ?8 P- v+ F+ d4 d( e// hook wglSwapBuffers的code; hook glBegin的code也一樣
- J. J2 N- `( W, q( b+ _, c( N% Nvoid WINAPI wglSwapBuffersCallback(HDC hDC) ( _% G; B7 L) ], W, t: |5 E
  { % p1 B5 Z. E  }' Y  u" l
5 w" x9 a2 @4 k/ f# B) X
if(!ininstializedfontshit)
4 x2 L' }. c  y/ w% D: V, M# H& s+ n{ " L- T8 j, l4 K6 h) W7 ?+ O" R/ _
font.InitText(); " p/ ^$ c! d8 t3 K# w' V
ininstializedfontshit=true; 2 f! d' O' Y6 b; K! C8 u" w
}
% o$ ]. f0 E2 J0 C2 [1 [4 g' w+ w- ~9 y% W& n! o
SYSTEMTIME SysTime;
( L7 j6 i# o* \! T9 k. fGetLocalTime(&SysTime);
. {1 m1 |: J1 a0 C3 t5 u' V! `glPushAttrib(GL_CURRENT_BIT); 3 d" f! N( R- h- P9 N3 x: L
    // 顯示現在時間的字串
3 p7 ]! ^* j: j( j* dfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); / z2 o7 ^% ]" J: Q2 `5 _
3 v' o. |0 x8 B% E/ y2 i
    // 顯示BMP / l+ o: @  o4 J2 Y) @/ E: u

  e/ g# z) R, |$ C+ K0 [% z* m: H    byte Texture[]={IDB_BITMAP1}; 6 {7 T9 r+ U: m: P/ e' p% a# {
    glGenTextures(1, &texture[0]);
+ C) L3 u% f8 h& qhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
, x' W! `, I- q
  I! U& N: D; L4 L5 mif (hBMP) // Does The Bitmap Exist?
: ?3 ]/ e" ]. ~$ M/ ]+ s, h{ // If So... / H3 |8 Q  C6 L) b4 Q* }
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
; \( U( q2 Z3 X8 c' s* p. _+ L// sizeof(BMP): Size Of Buffer For Object Information , k$ r# e8 C5 S+ p0 G
// Buffer For Object Information   ]( E; t; Q# G" `& d7 v$ P
glMatrixMode(GL_MODELVIEW); 5 ~& H* Y9 |: k8 f) z2 j( V
glLoadIdentity(); : T8 Q1 P, V" g3 g+ Z" m
glTranslatef(0.0f,0.0f,-1.0f); 2 H8 k3 A6 g/ ~$ _$ D- r7 J0 l
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
3 E/ N- t& x; @' V8 P5 x    // Bind Our Texture 5 Y- L% ]  J+ ]) ~- Y) q0 ~* [2 U
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 9 U9 E/ E7 h, v3 p! v; ?
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering 4 P8 D) ~7 U! m7 s# A

" R1 E( T5 A% v7 h2 Q4 o  \. K7 y& ygluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
1 c& Y( o, u5 L4 f8 z' X8 kDeleteObject(hBMP); // Delete The Bitmap Object ! \3 W2 R  p' Q! b
}
2 M4 Y" V8 i0 |8 B4 Z& a' G9 {glPopAttrib();
1 i* M: Q1 |# I7 E6 E+ f2 i6 K
: L1 K9 `( q2 x% t. e+ `
( q+ G; h. T6 m( M& s} ( K" ~4 g4 T+ w) u, Z
wglSwapBuffersNext(hDC);
5 r6 W' ]. _9 p7 R0 B2 O' h} 3 ]* j* Z6 f: V! f; c( f2 a
# Y+ |" ?! a2 d$ E
3 f( A" F/ L' m, d
$ B- T5 i& X2 p

5 I% T' K4 o3 U) Y
. D7 [9 I4 H7 e3 i) R, F: f/ y: r
4 }0 S/ V6 p* `: O9 Q1 S作者 : dorkas(aming)
! J% q7 s: N) K1 |6 a5 ?[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
3 g0 q* d  z& r9 ^) v1 j[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
. d& [) ~6 I% i* ?/ ?# h" D2006/9/7 上午 10:30:03
1 d7 n& Q( R0 P* a/ m% x) E  X0 o" Q8 @3 {
1.貼圖動作錯誤 ' t' E1 Y7 v0 S& @/ f$ m4 w
$ H7 `. e2 L0 p& k. s
2.
" B, _" r+ `$ O每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 2 V$ H$ S6 }' Y: d8 F
/ v! I( r; l2 ?0 G) j0 T
# B: w8 a$ U8 w2 M9 t$ m& `
struct MyTime 2 k" ~: M6 [5 {4 {" a/ _
{ ; b6 K) u) d0 l* l% Q
    byte Texture; $ x7 G( c$ Z6 I0 a2 T8 ~$ \
    FontGL font;
9 x+ x% v" l* Z    void initial(void); + f+ Z' |, g5 P9 A0 [$ q2 J. G
    void finish(void); ' Y% G% H$ ?+ d7 G7 _
    void draw(void);
; D+ j* e0 R1 m$ Q; F2 i: ]};
3 {/ j3 i  b/ U0 q0 v6 Z9 Vvoid MyTime::initial(void) / @) n& t/ E* F% q6 \9 ^9 [" U
{
' s/ I4 X3 P/ `. M0 ?' K% Y, Z    // 載圖 初始字型
4 I8 o; [4 t6 Y. T& r2 }6 W    font.InitText();
: `+ g" I9 U# ^9 Y! X5 e- a  glGenTextures(1, &Texture); % r5 E1 ~1 m" K6 A; z& e" ~
}
: p' y, n9 ~8 svoid MyTime::finish(void) ( G' _; }, b  P6 Z7 y
{ ' G5 y& W1 a! O' Q: G
    //釋放圖形 字型資源 2 v. Z7 Z  d9 Z+ o
} ) [' ?( @5 e- X) j6 u' s# t& g
4 P3 Z9 |9 j% a+ Q" U
void MyTime::draw(void) 3 X- k. W% i  P6 {8 }: |
{
/ n! Y5 L% ~1 ?( y( u    // 顯示現在時間的字串
3 O: U) n: `; g$ [. s    font.Print(......something...); , {7 B1 r7 i5 l0 i/ G* Y
    // Buffer For Object Information 0 T$ e$ C0 y8 Q# P* }+ z
    glMatrixMode(GL_MODELVIEW); 1 a) p4 O. O6 |: x* P) M5 D' d
    glLoadIdentity(); & i& E5 t" l/ G! i# Z7 b
    glTranslatef(0.0f,0.0f,-1.0f); " `* \8 i( h- s# u- ^. p
    glBindTexture(GL_TEXTURE_2D, Texture); 8 F1 i0 g9 x1 l7 v. W$ |1 i8 r

" I5 s* N9 Z7 n6 F: ?  ..... DrawSomeThing " m# Y+ {8 ^5 l' r) n' y4 D
   
0 P0 X8 a# d0 X% }. M9 i}
) Q6 l1 e& }# k5 r0 ~- z9 c
. J7 i7 d2 i; W7 C# C; o1 t0 s* d# h/ l$ O# `! s
MyTime time; 1 h" ]6 O0 q- ^' S. y. s3 _( a- m
void WINAPI wglSwapBuffersCallback(HDC hDC)
1 N/ W- w. C- {) B6 s0 v7 p: t0 ?8 z{ 2 p0 O  Q5 ?( m) }& w3 |- N: O
    time.draw(); 4 ~( d7 n! {7 m
    wglSwapBuffersNext(hDC); / {" o: W0 A; B5 K" M2 n2 o* d$ O
}
1 Y7 q" U. Z+ t* X) M
* N( [% z6 |4 R你只要掛進去前呼叫 time.initial();
7 e+ X# V, x+ [2 Y% y: l: G+ v1 i/ E; K4 N結束呼叫 time.finish(); & d$ t( G7 b( c- {* w- U

6 u" V2 m$ k9 X) A9 L" y. l0 q2 d$ w. D# f
4 y3 B/ Z: w& C0 R3 ?" z
; b# B% W2 W2 F; {: l
作者 : fushunwu(fushunwu)
! H# M- P2 I0 b$ T' z4 l; l* `[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    0 t. v4 a& l' U* ~) N5 D
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  " q" P( ?$ F3 G8 i0 A( j
2006/9/7 下午 04:19:31
1 A; p. ^5 G# S3 L2 ]: c+ @, R+ G' ]  ?& }$ K" C8 o- m) d% D
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ % \% P" u, K1 M: X/ e
- h; ~/ Z5 {. h8 W6 D0 k
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. . J$ h) o# p9 [7 c# h: N
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. 2 a, g2 W. N7 {" ]+ V
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
& z( h* t% r8 R% g所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
1 S  ^' c* L$ `4 v! D
! p1 G: t' @8 N! M
. ~% t; b+ u' a( @7 p(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
. {1 ?7 i# G9 s& U    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? 6 T6 P# P% k% X! G
    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.   }% ^- b( @* U2 u6 A: W) v' l
* t, Z0 W( }. f7 ]0 R
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
: q$ n- G6 e# v9 Z0 J9 Z. Z' I( g
7 Z6 x% v& E, I  t4 S7 C0 D  Y. H/ W; ]8 o) ^8 ^8 V1 T

# y! W# W+ A/ e5 ~( q9 N7 j# x+ |6 i! e. F6 `

6 \2 v$ r: U% [# D, I作者 : dorkas(aming) / ^0 e' H6 c- X3 m
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    * c' P& w( x4 p) m: f$ i
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
5 P  v; T2 w$ W' u) d5 m2006/9/7 下午 05:31:01 ! C' z; ]* b* l; k7 d7 i5 V

3 G# o$ N: d1 n( E9 E) ?# C- J1&2
. ~' J3 |# W9 E. H& ]' R8 N6 V我對OpenGL不熟...
/ h( y$ T4 G4 _, P2 _# ?2 q
4 z, Q. r; C! ^& S; D) c' K# G* V/ i>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
! Y+ C: y) f+ j- ^, n; U' u! w$ a4 |8 }4 {5 m

6 E4 W' P2 D/ K: f. W% q' q初始跟結束都是做一次的就好了
% }/ z, d' B" F4 g你高興要擺在迴圈裡面也是可以
8 `; |# b1 ~. }- c. _' j1 f1 W8 `. ]
程式的要訣就是 起 承 轉 合
/ C% e' q+ ^9 m* b9 ]% A7 |initial 8 E) z) t  D3 v2 {4 a% D& P
upDate
6 Z: l* V5 ~9 r. A; U  l  \; `7 Zchange
" L  z- V/ s5 U6 s" w0 Efinish ) s. ?! J5 E6 }+ K. H
物件也是起承轉合
2 T1 X6 G9 f' c/ ^+ A3 [函數也是起承轉合
3 l' b4 S' ~- \5 C5 {迴圈裡面也是 起 承 轉 合 5 o( u' @1 p. B
6 v0 M+ x- j8 M0 S0 P9 @3 t

8 A$ S' d, b; C5 @* Gfor(起;承;轉) 6 S! y) H- r, \
{ 6 O! v2 x: H! n2 I/ F, o
7 T# }+ j  N" O7 Y
3 S4 O& [* |9 d& I) ~2 {1 J! D
& q+ n9 h; B6 y2 I4 ~" q* p
* {2 _/ e  y" Z7 {( }3 i! p# L& h6 Q
}
6 M; |& ?+ ?0 f. j- f* ]: D8 G' ~; J/ y0 R" q% E

. E7 B; u  ]+ y" ?只要你分的清楚 屬於那一塊的性質就好了 ; j; W- x. i. _8 j% ~3 A* K! d

/ J0 b+ d( m& T; e7 v! P3 ^4 V7 m* a+ a$ z
  {4 ]* _5 u: r, T, C, o+ t

, ~. [! G2 y3 x  y1 }: i% s* ?  j: g0 v8 s$ B2 h# G, K
作者 : fushunwu(fushunwu) 3 V0 k5 o8 @) ~; O1 B; o5 }7 V! `
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    1 t8 e! J9 Q; o, L: l
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
- B& @  z( J0 J! }. w2 B2006/9/8 上午 10:32:26 : t. A7 l) `  r# n
; z7 I) B# B* s7 Q, y; D
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
7 a, [- f' u1 K+ W1 N" r2 P/ a7 U# E; K
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin 6 p1 ]' Y2 z) F6 ]3 p
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 ; H, z; U$ S+ b" Q; X1 X
我在想是不是因為座標還是矩陣的問題 ? ! M. Y# u3 Q' x
' b) i2 f* ~' I, \& [
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 7 ~6 |) M& q5 Q! H' Z
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
5 K: e4 h  b0 S, ?1 q/ A& }& ^; _9 n1 K0 W4 A& u
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
作者: 海心的剑    时间: 2010-1-24 15:03
一丁点都看不懂。。。。。。。。 [s:60]




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