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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 0 ?% y8 v+ q/ W7 A6 T( E
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
  [- d1 S( r0 j( j1 A, ^9 x
+ l6 ~, }/ C7 T% N0 v
4 w& F1 O: q) E
原文
  |% C* l1 L* D8 w- I; zhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
- K  Z0 q% Y- ?! |1 P7 s4 q, ^# v( K
大家好, . p" j8 Q# z) V* G) ?
, `# U+ U, M, U9 t7 l6 m4 {
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable , E- I3 c' p% I, _) Y& L
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... * g4 A" R4 b$ m. z7 r; y; j. t
4 y1 z# j2 N- c% @+ _4 e/ _# o
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 * C) T! I3 `$ Q/ L. n8 H7 G
但是BMP圖放在wglSwapBuffers卻顯示不出來
. x; _6 A4 y3 I" k* Q2 V3 c/ E  ](2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
% w+ d. G/ N9 z2 P/ w" @樣的時間字串 & r# n1 Y. j& s& `
3 l6 w8 S. x3 V4 g/ L& ^
% E3 x9 H& t6 C; h1 h5 n$ X
" S/ f  a$ k$ H) N
作者 : fushunwu(fushunwu)
) |+ s) e- F1 j4 w$ l1 S: A) D[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
1 S2 P9 W4 Y9 u: H* I. _[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]   ^1 v. r) X/ h2 b
2006/9/5 下午 03:21:34 ! ~- |% F$ O, M! r5 W# p
$ F3 S- a6 ]% I( i
sorry,按太快還沒打完 ..
4 v6 _- B* @+ X# K5 |7 @5 C4 ~4 [3 ~: F& v
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 9 e2 l4 V, g6 a# E* s
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) . \& L3 \/ o8 q' N

; J! b) }# o' f" h(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
+ w1 M, {$ f  y5 V(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
2 i9 J* j) J8 {. _1 g" e$ h- r# m! X' I* K; F
想請問各位高手,有沒有一些好方法可以解決 .
$ o4 F( k4 R, y- U8 o
4 {% o4 ^0 _% a& q5 L) u2 [下面是我hook opengl API的code : # h; W, K) G4 ]( R. i3 G
// hook wglSwapBuffers的code; hook glBegin的code也一樣 2 k/ y. |; w9 ]9 A/ t  d1 a
void WINAPI wglSwapBuffersCallback(HDC hDC)
9 p2 N: L2 |, M2 B. Y# q{
( Q* P- Z- w% m9 L5 z$ ]) M0 k2 U& N: s1 A# [( Y
if(!ininstializedfontshit) 4 }2 c9 n8 h! a. I( e) E( k' {! c
{
" A, w7 A/ S% e3 Dfont.InitText();
" A9 M1 y. I! ]8 N* C8 S+ Y- Bininstializedfontshit=true;
+ T0 O9 a2 |! N0 v' B# ]5 C+ b- }}
  ]4 l/ I7 V+ S5 {+ B/ I' H, R3 v- R+ B0 R9 H& v& i
SYSTEMTIME SysTime;
2 H. h2 O# i# x6 ^GetLocalTime(&SysTime);
2 ~$ i9 t2 {  W. fglPushAttrib(GL_CURRENT_BIT); % L& H% I( @6 U5 e1 N
// 顯示現在時間的字串
$ i: H: @5 A1 zfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
& l) Y8 G, H1 c0 Z8 [$ r! K" w5 H' i7 B% i5 B
// 顯示BMP
: p6 R! ~, m3 l7 F+ ^4 S. V
7 N: O- }+ H; l; Wbyte Texture[]={IDB_BITMAP1}; 9 c' R3 k" S, x, ?6 ^( l8 O( J
glGenTextures(1, &texture[0]); ; ?0 q7 B2 m/ ^$ L% @2 I! ?
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); 9 P" v/ }8 S  A

: u* U3 }9 ^8 a1 Q2 s9 x; gif (hBMP) // Does The Bitmap Exist?
; |+ I6 N9 p  X{ // If So...
9 v: S5 a3 n  L! V, ]- J2 _GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
' l; I, _8 ~( y  G/ R// sizeof(BMP): Size Of Buffer For Object Information
  O1 }4 @0 ]- O7 _// Buffer For Object Information 3 p) o: \1 _4 Q+ p, l: L7 I
glMatrixMode(GL_MODELVIEW); # l8 O5 \: f4 c8 v% U' ^0 ]1 d& |* s
glLoadIdentity();
" O9 O- s* G# T; J! q" \glTranslatef(0.0f,0.0f,-1.0f);
5 u- U+ H; [8 B! ~9 b6 ~4 jglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); ! G0 l" r  ~4 X7 }3 t; F
// Bind Our Texture
) |' P& i1 [  Z* b- c* gglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
" a$ N; W! s& ]6 A  ?: JglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering ' F8 I2 ~' Y: _- P& Y
9 G7 ~' t1 M% B/ i# o" ?- y* p2 y
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
, E5 Q; I' y$ I6 M- }% _- DDeleteObject(hBMP); // Delete The Bitmap Object / }$ X) Y1 ^/ K, F/ d/ k3 W9 a  C
}
3 J; ~* e4 v5 u, s0 o5 }; c( rglPopAttrib();
+ F; o$ Y0 H& v1 N' Q* c; s- [6 {& R  x! y

$ I+ x2 @6 Z- ~/ \/ \/ a}
: Q! W6 `! h5 C+ u0 ^wglSwapBuffersNext(hDC);
; {' G$ \( O6 d}
6 l' o& @6 n  k: ^1 Y6 ]' d% m
6 {% M1 h9 E4 c9 @, W  l: \) t4 B- ~/ S; w# e  R
' N; P  m% _1 J
: E' t6 E/ O, h! I  s: y

& F0 s4 Q3 n" B' G' ~0 ]# d0 h+ g0 ?5 D$ Q- e
作者 : dorkas(aming)
' y6 I- b5 |* ]5 q/ x  e) j' A[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
0 n* q3 G! n2 m: }$ C[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
' `* |% z" X- B+ @! M) k2 _2006/9/7 上午 10:30:03 2 y! x3 j( t/ Y
& a! y* h/ A. i. P; W+ k
1.貼圖動作錯誤 # `2 Z% E1 |/ X( c. g/ R
( h# x! R. M, s" F' V
2.
! q# W* _1 w; L. ]每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 ' i5 T+ N9 b2 \) ]5 h9 L
  H; Y8 {5 h: V: B) q
7 U* V" T2 i% f
struct MyTime
3 D/ u; i7 T3 V0 v3 o7 d{
1 _% A( ?2 X- a- ^: Fbyte Texture;
) T9 Q1 x: E& |7 S9 r; lFontGL font; " s7 c, b. J4 T( w9 b
void initial(void);
2 Y* [- E, q6 [& f" t! pvoid finish(void);
( q9 \* D% O) C+ u' D( G- dvoid draw(void);
+ I7 L* ]8 k$ K( O3 O}; 8 a3 k/ t4 b. g
void MyTime::initial(void)
; h. s1 s5 F* H2 I. H{ 5 M+ l! z& e  n
// 載圖 初始字型 & o; D8 ]8 u' `* u; |
font.InitText();
& i0 X; S, T3 U7 b1 t3 R/ RglGenTextures(1, &Texture); . Z9 g2 ~9 D1 j5 A# d7 s2 x
}
+ W+ L9 P' C" H. }6 y0 b0 V  C" d: I/ K' b1 zvoid MyTime::finish(void) ! b3 ?% i+ @' w5 n& `
{ 9 D& e+ H6 [, r1 J# F& @
//釋放圖形 字型資源 8 w( n* H2 Y) s( k) m% I, s7 Q
}
6 ^$ O1 J2 @3 h! L" \9 V% f4 d# Y1 w5 U9 o3 {0 C
void MyTime::draw(void)
0 E) u  d# H8 E  t  t2 p) F{
& G5 f, a, e; u- R& @/ n// 顯示現在時間的字串
  c! T/ i0 N. e5 p2 B3 ?/ Ffont.Print(......something...); , K5 B8 r( \# u. ?
// Buffer For Object Information 1 [. N) I6 D* r
glMatrixMode(GL_MODELVIEW); ' s" f- D' K, ^  |) {
glLoadIdentity();
  V$ Q6 [% g, L- \2 S6 D$ RglTranslatef(0.0f,0.0f,-1.0f); 4 q" P' j) ^' a
glBindTexture(GL_TEXTURE_2D, Texture); + m( k1 A! e2 n; f

& E! B5 D6 j; W; o..... DrawSomeThing & `) q$ r6 D5 g2 [* }
; Q  V5 m  n0 H
} 6 A  a- p8 |6 ~" j3 J  ?
4 f2 B. G* T7 T& H" A

! m( q2 k  X, o- U" z' EMyTime time; * ?- h# u9 P! J9 W: j6 s
void WINAPI wglSwapBuffersCallback(HDC hDC) 0 ^% F* Y( z. G! Y; h5 |
{
/ f* Y/ A: k  u8 r% Q/ Ptime.draw();
5 a1 U; i; Z/ F+ dwglSwapBuffersNext(hDC); 2 e6 |7 ~+ N$ d
} - f& \+ j+ L& d* Y

, B4 z3 I9 C: M6 T' U! ^& P你只要掛進去前呼叫 time.initial(); ! R1 G1 _( P5 f% w2 x) ]9 O$ K
結束呼叫 time.finish();
: c, z6 U2 t6 W  t: \' ?" r" ?! C+ \( o$ h; B5 v

: \; n3 {. c6 Y& q  p7 {3 d% G' H% Z+ a) V+ i

7 l6 P7 E- |. A5 D  U" r, d作者 : fushunwu(fushunwu) ; [( n5 A1 ?, M* q
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 3 N) m+ s# j) e3 @8 W
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 1 c% v: i$ ^5 F4 w, r7 N3 |
2006/9/7 下午 04:19:31 . F3 J' U7 L# m) A4 p
; M1 ]6 p7 ~0 N# i) g
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
! h8 _. K4 E- U. ^& P: C8 I  |5 x. h$ j* V/ W: H
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
% O: M" x! B2 Z" o3 d時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
: w8 N' v) e* ^4 L6 T3 g! a) C% [像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.   y4 Q0 q1 B4 A4 p, O/ c
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? % U( c, j  i4 c; j, O
# j; B. a. J$ K  `+ l( E

! d% F: O% F' _8 V/ |(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut - s& V, c5 E7 a
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
2 Q  |$ o0 [! F2 S這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
) r/ ~( F& m8 K, B1 |1 _- X8 ]) [8 j0 w+ E# S' N  k
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 3 r6 |( E7 j, B0 w$ G$ X# s4 b
8 ~* B/ N) C1 x7 B
, F3 A5 h/ ^  z, Z

& |7 H7 V6 z3 e- `+ Y
+ ~5 w- r7 Z/ e+ E" b0 D: C0 `6 u1 o- |, V2 Q
作者 : dorkas(aming) * Z6 M6 \8 L( r8 i3 z* q
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
3 f: D7 b- T  X) C6 G4 m[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 1 b7 s5 ^* L; Y4 U) N$ V2 ^
2006/9/7 下午 05:31:01 , ~; o# [9 \4 K0 v/ w5 k
: f& B( Y& }5 o1 h. ~
1&2
% P% ~$ ]4 W4 o1 q$ ?& U5 o我對OpenGL不熟...
6 X4 [3 ]. P" f7 |8 b4 J
% k% j" @5 E7 a/ F+ Q0 P9 I+ _% R>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? $ u; @2 x3 {  H% z5 d4 H
0 D, W) j5 L' }/ p. c8 ?+ I& \
6 y; z" I% o$ f1 v
初始跟結束都是做一次的就好了
. M- f3 X# ]; B( g7 l0 l$ J9 D你高興要擺在迴圈裡面也是可以
. _. f2 Z) W" s) l9 m% v
) {1 i$ F: e) [& ]2 a7 S" d' H程式的要訣就是 起 承 轉 合
  x# p* n, f" y1 A- Z; e0 r# Xinitial
9 w7 y' _, W( a0 O1 ]1 O. C4 TupDate ( Z+ z% b9 y( G1 f" p" \
change 6 x# v+ Q5 O8 H
finish - H/ t5 l2 k0 v$ f
物件也是起承轉合
/ y8 ^+ N" B+ |! W7 N) i9 [函數也是起承轉合
' O2 ^% _; t) I0 v/ R+ w9 R' u迴圈裡面也是 起 承 轉 合   o+ ~& A0 @3 j

) B/ S8 S/ W$ z* j9 [. Q  S* N
" d3 d& @# |$ e" c/ X& Gfor(起;承;轉)
3 b/ ?8 y4 {8 V0 m3 A) Q# o{ 4 k* s/ `1 t: m* r9 g
# b1 k- j* b3 {2 ?; e7 t
: B& J6 x! ]# o8 H% m% O% m7 Z

7 g9 A" M( _* j, y
! [2 D8 J8 \2 S9 o  Z- d! p: ~7 U}   y( H- y' H3 @

+ ~% l# `8 }4 }. W0 K& I% ?$ Q& T" J* K. D
只要你分的清楚 屬於那一塊的性質就好了 ' }: |+ M0 ?. d( G
' F. f9 m5 R+ N9 R# k# r

: }8 @, s" f/ A$ X
/ d- ~1 \6 v1 ~$ {: K4 g9 ?; n# B1 j% p+ }# f: A# _3 Q
# A! v; w) o* A0 L
作者 : fushunwu(fushunwu)
( A0 q! {! M& y* X4 `[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
2 Q% E7 c* ]. Q% u3 p3 n7 i[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ; V' q; }- y" A8 e% }! h) G- x+ D9 a2 B
2006/9/8 上午 10:32:26
! x% i/ a% C6 q3 @5 `2 F. O0 K1 p+ ?3 [' g$ ~  C+ N8 ?- @, w
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
# |0 u( C8 j. e2 a8 x" t, |: P8 ]
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin ! T7 B! A+ f9 ^/ A
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 1 K* W- R# R9 j& l4 v, z( [
我在想是不是因為座標還是矩陣的問題 ?
4 _/ X& @+ q! u# O  r+ i9 O7 @
" {7 m5 _) V4 a6 V/ H- C" r但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?   G4 ~! ~2 |( z8 T3 B- k, N
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 4 {6 S8 j, _2 x) D
5 z2 J* S9 Z4 j7 _& m- K
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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