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

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

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

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

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

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

solidji
$ p4 i1 X+ I( K3 ]1 T& r# c4 B7 M
+ ?6 x/ U/ u. x0 E# w 你好,先给你安排一个小任务,这个任务对你来说应该很简单。3 o6 q, z% N( m0 E
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
$ ]/ y# {+ f) V- s
: a) W0 q7 }% S7 V/ a' L' E 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。. t1 u- `0 T; d' z4 z. Q4 L
 但是比较复杂,我暂时没有时间仔细研究。" \- [; I# x3 L, o! @7 |
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
! M1 R: B! m/ M2 ?  M4 Q0 T 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。4 ~3 Y3 I' y1 X! {$ J9 R
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista6 Q' Z3 G4 R% j* i: \, }! y( x
打不开页面,我搜索看看* G# n; ]8 q$ I  V. g9 q. X
-------4 u/ s/ }2 x0 T5 g5 B/ z
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
6 [6 b0 I! r- w5 \9 n1 U然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,2 F" e/ e0 `3 Y6 m
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_# i* O" n0 Z5 B: M
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作: W% U" Y" p: z; ?9 b( Y
7 U3 L6 h) D' T! }( S! K- A0 W  _
命令行输入
+ e' V' s5 v$ v+ ~8 F* J9 Ldllproxyskel.exe <input.dll>
  w& g; \+ a' Y" ^) G4 x- open file D:\\项目\\dllproxyskel\\input.dll
9 E6 m% P7 T+ @; e7 \  
3 Y0 l  x2 v5 C, x; b( g7 W  D
6 g3 G. ]. Y$ L4 O( J------------------------------------------------------------------
! ]" J+ Y# g" g5 q) E我们需要额外添加的代码
; ?, E/ B9 n( Z0 f; s' P' W" d) h#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
4 ~  i7 x  H$ n9 Z3 F+ Y- o//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION26 R/ x* R" h2 v! C% _
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
) Q/ B$ r, f+ Z9 x$ |5 mCALL_FUNCTION2(BOOL, ExtTextOutA,
7 g, v- }1 _  Q+ S              HDC hdc,
2 Q/ \2 f  N3 ?( H              INT         x,
1 K4 S4 n& ?4 Z' d# B              INT         y,2 A" s' I- l+ |8 l
              UINT        flags,3 Q3 B) p! s1 m0 P; X8 U4 r
              const RECT* lprect,
) k9 Z3 M% v, N* P8 Z              LPCSTR      str,2 n' ?/ `5 Z& h# Q$ r, B# o
              UINT        count,
9 g5 g! w4 F: b8 `* n3 W+ N              const INT*  lpDx- O( z0 g5 |) u
) {
3 i! }# Z$ c7 t* _: E; w0 }    //这里可以做任何你想做的事了,HOOK成功
6 L+ e+ p9 O# [1 C8 g% S    outputdebugstr("HOOK ExtTextOutA suscess!");: \$ o( ?! U0 q  j
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数* v+ u$ |1 w. j& D- s- }) S# W
       return(result);
. V" I9 p: P% V}
$ a' l6 A- {$ I0 G* Z7 O9 Z; H
" q. @4 F, ?; l注意,生成的代码需要用gcc/mingw来编译,
6 z  X5 V. |$ }主要是因为其中使用了gcc宏扩展
0 h4 z5 `9 f4 j7 u* z& x$ d#define CALLING_CONVENTION WINAPI       // default for Windows DLLs8 {* n0 U/ |' L  A7 q
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
0 a# [) M$ m! I" f        void CALLING_CONVENTION  FUNCTION_NAME(void)4 b/ A# L+ [- j0 V$ }
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
$ w+ {6 ]9 C4 `- ^6 k% `& _3 p4 y        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\+ N% ~# V7 \) C& v
        PROXY_FUNCTION(FUNCTION_NAME) { \\4 Q) i! J8 M3 H
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
& z$ {4 t0 d; T" {+ P9 p* u        }
- J8 Z- O! W. v0 c) u#define CALL_FUNCTION(FUNCTION_NAME) \\
2 `, v0 {3 i0 t& O( k1 K0 _8 {1 t  ]        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\* z6 d1 m: k  Z) Z6 j# v
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)  b  d) l2 n6 E- `0 b
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\5 N. j& j' [% O' d4 w3 \) f
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\/ b0 V+ B: r# O0 P. X1 O
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)' `' @- N$ |* k$ v5 F7 g2 K
, l  h& Q4 @1 _$ F

& K3 z8 o, D* x6 S等我回头翻译到VC里
& X9 x5 n+ e) a4 S待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧% l6 Y$ b; h0 x( w2 Z9 o  D- I" [, X
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : 6 N- D5 i6 |7 Q  l6 f5 ^
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧   W2 F/ [! t* @% y, \
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

& X$ n4 J2 C( C% Z2 A9 u, d2 r6 ~6 {# j0 c0 L  \) t
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
9 X! y* _4 I* @: @" k这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。" r. n- g8 m% \9 T+ V4 v

, n$ H. S; n& w: I; [) N+ M; Q对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
# u( n  b* r4 ?) ?: F! O我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
" ~1 J' @3 q0 \5 ^' F+ ~. C% v9 p& C* J$ _7 G, ]
这个我可以试试看,蛮有趣的
* ?; v4 \3 k3 U& ^& ?是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,3 E# Y9 i/ X# w; S( U; P
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,( W3 _8 T5 X+ D$ [( X; M
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
- k0 ?6 l) V) F( ~2 Z8 x0 }5 u
' u1 ?& Y; M) g5 W* G007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 7 G% f3 S' a& C) `5 c" G; T
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
5 P9 |4 Z; O% O" s  u0 {7 ^; f$ s5 `+ Q0 }: N, E
这个我可以试试看,蛮有趣的
" J/ @0 r; p. d3 ?# \1 N是用hash链表把中文字"归类"吗? ) s  _3 Z, `. v+ c1 z4 o2 D; l

, @4 ]; _6 E) |7 ]; Q8 j.......

! L( D' @: {* d% R" \: z4 P9 G
( Z* @* G% d) E  W7 x最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
; ?) e5 W4 r# {+ z另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
5 j5 \+ r1 t4 K; [5 y所以无法通过 #define _WINGDI_ 来取消重复定义的问题, d: f4 M7 j" [
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
: \/ d; P( q6 Q! H7 K- i可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了6 s8 w% ?! y  b2 m, S, q
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦
" E6 X3 ~/ D& k" M+ I- |
+ k) R9 c* a: |( z$ V3 L" _我想的解决方法:* ~; L4 ?/ i5 I: X0 [1 x7 K
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
6 @! E; x" r" f- I6 u2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
; A7 Z6 l' ~. e6 v: H    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
) `) ]. V! [' S, R$ j7 X9 V5 W5 t         DECLARE_HANDLE(HINSTANCE);
' p6 a) h8 X& e: B; y- M6 u        typedef HINSTANCE HMODULE;9 P7 j8 r$ e: p" V: d) S3 d: i& I- N
        DECLARE_HANDLE(HWND);' B+ @  v. u; o( X1 {3 \% Y
        #define LPVOID              void *
* O$ b  ]9 `! I        #define DWORD               unsigned int
. w+ b* x& T1 s  O$ {2 {2 v        #define UINT                unsigned int; x7 q; D1 Y6 P$ m; ?1 K
        #define LPCSTR              char' H; B: i/ K# F  N& O, c
       #define LPCTSTR             char 5 Z; L. M- \- c& u) M1 y
       .............像这样用到多少自己定义多少
& V' N4 ~7 R, r4 x9 ?3 h6 @2 i0 `, ?' d% y
3.改造def,使用函数转发器" z7 M* x" ~- ^+ t- c5 e! g8 t. i
在.def  文件里转发,0 `1 g2 W- J, R
EXPORTS
& P4 w4 s3 g" c/ T  AbortDoc=myAbortDoc @1
0 F9 h7 A6 Z! B. I  AbortPath=myAbortPath  @2" p) f! R3 U' N8 c1 t# q
  ExtTextOutA=myExtTextOutA @2228 _* ^5 U3 N, ^2 @' p( u  z
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA , e0 c: W  B$ l- G. N! R
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了/ d3 H0 ^7 q' i/ i
+ X( g: s6 z( B3 _8 D
算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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