设为首页收藏本站官方微博

【汉化资料】Hook OpenGL的問題

[复制链接]
查看: 1643|回复: 0
打印 上一主题 下一主题

【汉化资料】Hook OpenGL的問題

跳转到指定楼层
楼主
发表于 2009-6-6 15:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
& V( l* V5 ]3 k. f! c" E. G- x* A所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
( @3 A' b8 U& z$ C6 C% C: C) E- f
' H) q3 _/ t, P4 O& g+ u) d! i
- r- @3 p! N6 V" _
原文
& l1 b* I( L! L! O) Qhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html & k2 g. ]- f, M: W# ]+ r+ M8 u

4 C! }; R: C- M) h, g( l5 z+ B大家好,
* S  p. S& @; ^- [7 D) k' D7 O1 B% k0 T* q& O: g
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
8 z: I8 [! C% T6 x  M,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
- ]: Y8 c4 K4 i+ x3 J9 W$ {; Q8 c; S  z- l3 ]. z1 ^
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 % p) w; M9 c8 s  G$ u
但是BMP圖放在wglSwapBuffers卻顯示不出來 ) p; j- e/ f4 W
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
: I0 t& A9 Q' Z& e7 l  ^0 M: v  H樣的時間字串 8 L- A8 X" e' U! ~* @0 }$ N7 J  i

$ u* f9 j5 Z6 ]% ^: f  o, ?7 y: o4 N; E: C& E" s: P. w! u
. W  Q5 _% q7 G- }! T
作者 : fushunwu(fushunwu) 9 ]" ]2 G' u& y" f$ H9 t
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] * h; P) v4 n6 P$ g) ~) `
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
3 v; K! L. C/ G0 D* y4 l  m2006/9/5 下午 03:21:34
9 L" N& K, z7 o2 p# k2 A
' I8 u# x) [+ s% Z: `3 n& Rsorry,按太快還沒打完 .. 7 H, u% C& o* C% S( [
0 p  f2 O6 h) V1 O2 r
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
, {* n" m% _) r7 ^) [# A( U* i' C,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 0 v( t! g1 q' S! P6 Q
+ Q: p, N$ w' Q+ o3 g1 h0 d
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
3 f; l" L; r! d+ a$ H(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.   T. U) O* L0 [/ @$ l
9 O6 z$ b' H/ W5 s$ o
想請問各位高手,有沒有一些好方法可以解決 . + ]- ?3 T' E: q: M  k, v% P

% ?7 P( j7 ]+ A; r# }& v0 n下面是我hook opengl API的code :
9 X4 J$ T# I1 f( G8 ]6 d. b( T// hook wglSwapBuffers的code; hook glBegin的code也一樣
: d9 }0 s& V1 i. Uvoid WINAPI wglSwapBuffersCallback(HDC hDC)
6 y1 Q' k& F7 L7 I' n* |0 T5 ?3 n{
) E! Z- p9 d7 }: b3 C) b" s# ~% ]0 P3 y- X# {
if(!ininstializedfontshit)
: o& a! y8 M% x  a; o{
& a( J% R7 C9 [5 yfont.InitText();
( j- s4 f- O( P. v4 y* zininstializedfontshit=true; " ^9 @. i* E9 z* \
}
6 c8 m4 W% r( y0 Q! R8 e* ?- W6 P, j$ w
SYSTEMTIME SysTime; 1 o8 M6 @; m' m* E: B
GetLocalTime(&SysTime);
/ Z% j; [& P; K5 B' J. O" uglPushAttrib(GL_CURRENT_BIT); 2 ]$ Y( G- n- t( A' v& Y
// 顯示現在時間的字串
4 L7 V: N9 D/ o- }, W" |font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); % Q$ D2 B4 ~, r- m" k$ b9 O

% x, H0 X& L1 e// 顯示BMP . v4 b% m- I0 I3 e$ b" t8 ~
: f: y4 n: M' R. W; @: f9 e
byte Texture[]={IDB_BITMAP1};
2 D' K5 a  \5 e6 j& S3 U" qglGenTextures(1, &texture[0]);
) j, r6 w& T' D1 B1 mhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
' |$ \7 n) `0 U1 T& K! Z6 Q8 x$ \( \* P2 b5 }2 e# W
if (hBMP) // Does The Bitmap Exist? + G% ~" e6 z5 f. e
{ // If So...
9 S4 {( g; W( ZGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
* \5 Q/ \6 }5 [+ g// sizeof(BMP): Size Of Buffer For Object Information 5 B- y2 u4 O0 @
// Buffer For Object Information . G% x* x. _$ c$ X1 I
glMatrixMode(GL_MODELVIEW); * Z9 F3 `* Z( B, M6 R9 b  D
glLoadIdentity(); " M. c" B: {, A
glTranslatef(0.0f,0.0f,-1.0f); 6 g; e2 `' g7 q7 {) I
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
" Z# p1 D0 Y, y6 Y9 Q: X4 X* E// Bind Our Texture 7 P$ j; y0 D& l: v$ H$ B
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
) H% @9 h4 M& h3 @5 DglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
; J$ f. T$ z6 W! B, I4 `0 n' m
0 \* [4 ]2 a8 k+ B& R( EgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); 0 }# ^1 [+ _0 A' G$ `
DeleteObject(hBMP); // Delete The Bitmap Object
, R, O" H( @5 ^: u' ^! J} " p: k7 s) l8 X- f" a9 ]
glPopAttrib(); 4 S; W4 U! a8 b& Q3 I( t6 k
, i$ a0 d9 @) p& {" B
! G: Q2 {* a, L% u+ R
}
( l$ i0 i) m9 Q# z$ awglSwapBuffersNext(hDC); 6 H  J2 p9 N, N( Q2 j9 o. J
}
) a9 \, D- t/ e3 s0 a
* O7 @" m3 W" d! z8 `# ~
0 w  e, N& B+ U
, x( K$ ^" n: R" m& v; @: {! b  A3 r+ \/ _. _% Q, j) _# s& y
, o4 \! c5 T: ~$ G2 c

9 J( K. a2 [  C: {作者 : dorkas(aming) , R. g3 X# O2 t5 d  m6 Z
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] ( p8 m" G" B, W
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 J& i$ w0 k, v1 I/ W2006/9/7 上午 10:30:03 % X3 }, q7 n3 u6 Y% W& }) D9 R

8 C4 ?5 n' O, M7 w7 C1.貼圖動作錯誤
8 k* P; d4 T) _' R8 u& N9 Y5 U$ B* @6 a8 G, c. r" b
2. & g. B7 S# W. ]* r3 r8 ]
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
6 e- t' T; t* g6 }( k/ y
& R' q; v) ~7 t( b2 `' P$ K- Q5 |8 Z; H' Z+ o9 X3 X5 J( D
struct MyTime ( S$ O2 P2 n! `6 S: G
{
7 A  J2 t3 C: |% t' mbyte Texture;
1 ~! t3 v4 p/ K+ T6 ZFontGL font;
4 `+ M( \7 [& S! C8 |void initial(void); % Y/ ?' o. H3 r
void finish(void);
5 {0 C$ ^% f$ }void draw(void);
1 c9 p) l4 Y3 n' g4 n6 R};
- J# ~: [$ ?2 h% }! U8 N0 \void MyTime::initial(void) # }4 Q# i" z: z4 y2 S
{
3 C+ v- \- K  S" g// 載圖 初始字型 " R# }4 e. l: D3 w+ a
font.InitText(); ) q9 Q3 r, }8 i1 ^+ w, o# E5 F
glGenTextures(1, &Texture); - Q/ Y3 P+ Y/ p
} : v* E  A  s# l7 c2 u! f! _! t/ w9 X, F
void MyTime::finish(void)
) a1 J& A; c4 R- O; F) \0 V{
, N% r) G+ n8 y& s  [//釋放圖形 字型資源 ) ~; S! L% V9 ]
}
" L$ _4 X- \+ k1 g0 C
* w- q; a. C( ovoid MyTime::draw(void)
5 G! o+ W6 ]) T+ I{
/ x, }/ n; V4 ]. {/ p( U) A// 顯示現在時間的字串 / n- W$ g9 j! G0 ?- y$ e, v: \
font.Print(......something...);
' y/ |+ h; N2 U) o. L5 u7 N  i// Buffer For Object Information
- c. e! [2 n& p* W& Q5 ^glMatrixMode(GL_MODELVIEW);
7 X* w" @, E/ u; R, aglLoadIdentity();
, r5 p  b! j# W  g2 OglTranslatef(0.0f,0.0f,-1.0f); # f# P; e/ `* ~/ }8 j2 V7 O
glBindTexture(GL_TEXTURE_2D, Texture);
2 A( e$ k& a, N$ L: d
4 G7 H# b# d$ n, W/ |..... DrawSomeThing 8 }- R" T" V& X9 h
" g5 i" J) j% S& U% Q8 m
} 4 Y% G9 \. F8 P2 B
8 I) C7 f$ b# ~5 _3 ]5 O* k
% S9 \$ I3 _, I
MyTime time; , ~% N6 R% K3 k% g* G
void WINAPI wglSwapBuffersCallback(HDC hDC) 2 u5 s/ H* H& C0 g
{ % B8 s) O9 Q, g, c3 z0 @% L( u
time.draw(); / ^! H6 c/ R& q! H
wglSwapBuffersNext(hDC); $ h( ^! S+ a; D& P* u0 I- [. h
}
) C' ?; L/ D/ [7 b$ i: I, R+ S- d0 Q; P7 E/ y
你只要掛進去前呼叫 time.initial();
  z4 s3 n' f1 P  ~; ]結束呼叫 time.finish(); 3 \7 A+ |+ \' {, _4 P3 _

# M6 U, M6 Q7 s" A3 H- T# I# C1 L9 z2 X

( ?' [6 S; @9 x- N+ Z& a
8 B6 |$ t# q( `0 ^. N( M9 r+ ~; g作者 : fushunwu(fushunwu) & `- ~, r. ^" k0 ^  y4 X! h
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   t1 ~" x) W" O" Z6 S
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
  ~  ], R9 u+ q% Q6 y2006/9/7 下午 04:19:31 ! s( G1 O+ ?# `2 ~( `! w

, l5 }6 W8 V1 K% R; {6 f( T謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
; @1 {: W# a% F: _4 `2 D
6 Y" I$ @7 p% U2 N3 g; R+ ~(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
2 }# p4 @9 C, B6 e; J2 S/ v' v時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. + x  ?* ?% I3 {8 v- A
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
0 T; o* E1 _7 j/ R- J5 P+ f) h所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? " y) m( [: v# J$ p2 j3 y

- t: m. v/ k1 E$ H. D# l( S. q8 b" Y% B1 }2 Q
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
- B* k; |$ z' q8 O# R1 `! m來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
/ l/ D# d9 u: u# W" M3 ]# D這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
$ E2 [2 H% B5 Q, Q
2 D& e+ _( l! z/ u% z  l  B(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 9 c  c2 g* K  Y5 A% O, d6 f& i
- G& ~* Q* |& b
, t* E& B+ u4 K( D9 L
) U# O" s1 e$ o4 f; }  D, L

, c9 h" F$ |' _. }; ]7 @0 @# Q- t. Q, y4 l9 i4 D% v$ e2 _
作者 : dorkas(aming)
  ^* \2 R& @1 k, g/ O/ ][ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] ' z* |# F. I  K7 u. I, v
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
: I' l! Y4 V% B6 f2006/9/7 下午 05:31:01
/ S$ C8 b! j! H- _" y1 L6 V9 F5 L: ]6 S
1&2 : ~- V  N4 k6 p3 z2 F. w
我對OpenGL不熟... + e8 i$ ~+ m" `' Y$ h
/ p, ~, `3 s* R. [
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? $ Y) f7 K& [* f  V8 x- G
* w, v# K; z6 k9 T' p- s
$ M! t# A& \* Y. E. k
初始跟結束都是做一次的就好了 + S" u1 H% t3 q4 S! I! F7 T) v
你高興要擺在迴圈裡面也是可以
. D$ x1 l  X: j/ F4 ^5 s5 ?6 N! }) M+ i9 o8 _4 [
程式的要訣就是 起 承 轉 合
/ l" t$ j6 x& Hinitial
5 m6 D1 o# T; SupDate
( U! y7 E/ e6 _1 ~+ |& G, D7 Lchange
. M6 l+ G5 D# A% zfinish & x! N- R" Q0 Z& _5 i% X, Z  O8 S
物件也是起承轉合 4 r/ u" }  I, `; w& c
函數也是起承轉合 . f6 W3 O4 y8 f6 }; Y' i
迴圈裡面也是 起 承 轉 合 - P# i8 n4 |$ n3 Q
! K2 l! l: }7 Y& ]* q* p  J
* S  M3 {. m' R0 C- [3 G0 @! K
for(起;承;轉) " K$ T# `& J# X2 ?; O$ L' F7 d
{
3 O5 q8 y1 y0 c) N9 j1 w" P& g" S/ J

! B: i) y$ a* V1 \8 ]
- q% O9 p6 P+ H0 ~
2 |' O9 h1 e8 S- w% Q}
% S# g9 k  l: J' a2 Z/ r: a$ w  r9 r& R  P2 X. w. h

$ h3 D8 {+ ~% u5 j0 y3 t; I只要你分的清楚 屬於那一塊的性質就好了
, L9 h; [  N% C( c/ T: c  e, J& b5 g9 X/ i2 T. P" k3 ?
3 [% a8 a+ q6 |; V* C
9 y# \: b# A1 i9 Z

  I( t. T: i7 d* a1 b0 @" h! X
/ a4 z  `7 j4 j作者 : fushunwu(fushunwu)
$ R; M) m; ]' W' n: M- V! U[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
2 i* O0 E3 `0 R- c/ e[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ! [/ n& U- ~" r: V" E
2006/9/8 上午 10:32:26 6 y- ~; J+ N5 Q! _, A- S& Z- G
5 e# |( b! H0 D; F
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ + k2 d2 [2 O$ Y" W3 n9 w' H
  N5 g7 |" x" G/ ?8 `& i' r
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
% U% F9 \0 Z9 J) u/ T) O+ U! S; o所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 $ _* M2 y! z( A2 ]/ z' x
我在想是不是因為座標還是矩陣的問題 ?
- u! A" u) W! q: N
! M! E  U0 z. x& R但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 9 V3 M3 M' B# V; ]
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
( z$ H6 X# o6 W3 Y1 B+ a0 y
  A% o/ P. \, P- U3 C所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表