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

汉化任务 GDI32.DLL的代理DLL(solidji 请进)

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

[汉化任务] GDI32.DLL的代理DLL(solidji 请进)

跳转到指定楼层
楼主
发表于 2010-4-9 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

GDI32.DLL的代理DLL(solidji 请进)

solidji3 i" c' k4 V3 o7 e0 f3 c
# R6 q" e# ]& i! v. F# k
 你好,先给你安排一个小任务,这个任务对你来说应该很简单。( w8 m3 t6 I1 A) U% U2 o
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
2 G5 V5 Z. u1 W, _1 C# H% x. O/ \, ^* {" e- ~6 N! q
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
/ r  g5 s  A$ C5 O* g# h' m0 X3 z1 @ 但是比较复杂,我暂时没有时间仔细研究。
6 e9 |" q- Q) n, d" x5 D 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
  c2 ^; h% X2 O! Q% V  ] 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
4 ]3 a( b1 K; G/ [& a    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2010-4-10 20:41 | 只看该作者

dllproxyskel.c

显示AlterVista( G  l" f  F( w! z$ M
打不开页面,我搜索看看0 @- m; M0 G- W8 L. Y
-------
4 C) y+ I+ e9 A2 P4 Y2 z( V+ T# z哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

板凳
发表于 2010-4-11 00:55 | 只看该作者

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号' K$ x5 y- C: y( ]6 I6 g; L, N/ j
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
' k( G. ~0 ^3 E1 m通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_& d+ i" Z. g( V& `
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作* l1 Z% G, ^: [( a9 g3 B. Y

$ [( d1 l( \0 o# d( i3 M命令行输入
4 H  I& m% Y( o* y, X  M, Ddllproxyskel.exe <input.dll>; H. t0 [* T, s8 }4 M0 j# r
- open file D:\\项目\\dllproxyskel\\input.dll
: \8 s  f5 N3 H2 q  7 l" `: T! K. f, b0 Y$ ?. S

- b( S" u& _% M; `; l0 u------------------------------------------------------------------  {( L1 o1 y. j% o# q
我们需要额外添加的代码
2 B) [3 ~' c1 v& m0 A' w#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
) L' u; S% ]0 N3 |4 j9 t) F//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2+ K( ?: U+ Z$ l
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值; t) f0 ?1 X( a1 k7 ]
CALL_FUNCTION2(BOOL, ExtTextOutA,8 m- P6 k( v; {. W- _# T: L
              HDC hdc,: h5 _# h& w  {$ K. Z) R
              INT         x,, l5 [5 i" {# P
              INT         y,
! c. {5 L! p' d  Q) h0 r              UINT        flags,$ G3 [' v. E4 i. F3 b* f8 w
              const RECT* lprect,
) q' J( m' g0 w              LPCSTR      str,9 Y% X& d- A$ h* b
              UINT        count,' ^! B. u* R6 T0 k- Q
              const INT*  lpDx
% Q- d. `5 H' i  ?( ]3 F; P) {
0 w7 x$ Q' {6 d) p/ \  H: T    //这里可以做任何你想做的事了,HOOK成功1 [) x- f) X0 h  z, J" O
    outputdebugstr("HOOK ExtTextOutA suscess!");
& D9 V5 c4 i% `: j* ?" j       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
  ?, [2 y+ j7 t! [& B2 `! K; t" L       return(result);3 T/ _2 X6 m: v1 M
}. R4 h) [) J+ V) ~: w( Z
6 I: C2 k( e5 f, `3 j
注意,生成的代码需要用gcc/mingw来编译,8 u1 s% y: J5 \
主要是因为其中使用了gcc宏扩展
4 u! q* x- Q) f/ U* z9 F#define CALLING_CONVENTION WINAPI       // default for Windows DLLs( v$ m8 i- E& m% [+ o  J; G: {
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\$ c2 s- S/ l9 C4 a8 {* O" X2 j$ O
        void CALLING_CONVENTION  FUNCTION_NAME(void)
" ]  H( o/ ]$ K1 n. |#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
6 W3 ^3 Q6 W* E" n/ Q" W        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\4 H+ h6 ?: C' y& F5 e" M
        PROXY_FUNCTION(FUNCTION_NAME) { \\& o# a4 ^) @% D
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
! ~9 `" Q  ^" ]! e        }8 u0 ]% d! Y6 A% ^
#define CALL_FUNCTION(FUNCTION_NAME) \\
. k, |/ {# Z% C" I4 D% I/ g/ p        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
9 }- f5 b6 z( m1 S7 I& Z% g        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
5 y0 l5 z0 {; p$ O8 [4 l#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\, _" C( D. m4 G5 W  i7 j
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\/ B6 Y2 S; G9 S* K7 [2 X# e
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
8 O* r8 A2 r: T: e4 k$ W, r$ F5 O/ z! L; }+ s0 l  ^, v. H- h
/ ]' I' Y$ n: h0 `8 f) p% @
等我回头翻译到VC里0 {* ]5 [, T+ N" r: _
待续

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2010-4-11 06:38 | 只看该作者
收到。等待你的vc版代码。
回复 支持 反对

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
: _! {& M( z) [7 f$ \那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
& S, b3 ?' f  r5 N3 C哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
) o: o% n( t8 r0 H. m7 f" f& z, q那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
; R' g, V1 Y. i, k4 b

$ s$ x& w+ i5 |8 I* Fwindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。& S+ V% [3 g) M" X
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
0 v% P: Y. a& T8 a# p0 s0 w) j$ ^  g' V3 B) [; J1 A
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
& Y- a! Z8 `4 g' e3 z我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
. ]$ c& v: t5 @# t  z8 g- b% X& h6 \
; E. f  g" V& q* s9 x8 D3 {! j/ v这个我可以试试看,蛮有趣的  c. j: w& x, _$ E5 @# M  o" M. n& `
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,$ l; z* q1 m9 i. t# N
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,# C" t6 |! n5 _' B
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"3 D& r; G; Y4 E) u2 O
8 j7 ~2 ^: E6 ^: }8 c/ f6 j
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : & i  s0 t% G  F. W, H/ t. B) ?" o
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 ! S! ~! |6 S! E* y. D
5 [1 ], h( Q- Q3 s2 c
这个我可以试试看,蛮有趣的
) F8 |- F0 I1 W7 T是用hash链表把中文字"归类"吗?
' ]; ?" e+ T, M+ I! ~) t1 q9 N, V$ V8 p' ]
.......
0 P7 Z' e* F! t( c

+ b4 B5 g4 v4 M最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
& }5 q) l2 q! C! B0 {3 V# w另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA$ w) R" n7 H3 i/ j: `/ C% Z: ?% N
所以无法通过 #define _WINGDI_ 来取消重复定义的问题& e& I+ T3 |+ r1 l
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
$ o0 U+ i# a; x7 f! ?可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
; l4 L2 Y4 F# R如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦+ E: Q+ ], f) h6 s3 |

" s  y9 c- A4 [0 f我想的解决方法:! V: L$ L) ?3 k4 y
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接# {: W9 Z8 J. {1 Z
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
  h9 N; z, k1 Q- _3 o9 V5 @) Z4 r    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n4 N" v7 Z$ ~# Y, T
         DECLARE_HANDLE(HINSTANCE);, `% A  ?# H! E: E; a0 D$ h6 n
        typedef HINSTANCE HMODULE;
1 g  o% T( a; N- q4 u- A        DECLARE_HANDLE(HWND);
# Z) s3 ]2 n8 t0 y1 S4 d        #define LPVOID              void *, F) \0 i& t+ i8 i* v# g
        #define DWORD               unsigned int2 q5 R7 a2 y( ?, S5 n3 r, A
        #define UINT                unsigned int
& t  C" ^" E, ], _! s2 @* e        #define LPCSTR              char4 E; c' f, z# l# }: s" `* A
       #define LPCTSTR             char
. s1 E1 h# R  b4 b* ~& @) ^, _       .............像这样用到多少自己定义多少
8 g/ C$ \/ K) p, T" O) ]
1 u, P+ A4 ~9 k: B  Y1 S5 C3 R3.改造def,使用函数转发器
: X" Z% Z; w: h# I# C* Z在.def  文件里转发,
4 k- [% a& x1 _2 z9 xEXPORTS
. ]2 ^  o1 j8 ~5 @' ^: W% R- }3 z  AbortDoc=myAbortDoc @1
' X! ^4 a: b. h2 L) V# o; Y# `8 M& j7 ~2 d  AbortPath=myAbortPath  @2
3 m0 \! }8 O1 j, f- o+ W  ExtTextOutA=myExtTextOutA @2226 [$ r* Q( B( T& E% x. d
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
4 M1 p$ Q# k/ a* G/ V1 h你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
; Q( E/ b2 t9 p1 |& D; S& k
: T: b" [$ m6 p; d: D算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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