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

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

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

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

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

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

solidji# @7 Z/ V6 g/ i& a- p6 P/ U& C

6 K9 I7 Y; r- ]- ]( h" \7 S, R; f" \ 你好,先给你安排一个小任务,这个任务对你来说应该很简单。5 l6 G5 Q# ?+ L4 ?( t. U( u; R
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip+ ~7 l! @' d, h! @1 \# U

4 a$ b/ n; N5 | 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
) j5 _+ \+ L  v- @* x 但是比较复杂,我暂时没有时间仔细研究。
% l$ j$ X6 l3 K 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
( E. Y) ]( x& b' O 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。5 H: L4 x8 t$ ^6 g
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
3 J! e4 ~; O/ q4 t0 f& O打不开页面,我搜索看看
1 m' ^! k' ?0 n  s6 j8 X( z-------8 ~' @; H+ o# O4 ]
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号6 a: o' i9 T9 p! ]7 T
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,; n, g; V' D& k# f& ?
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
. K2 o3 E% z) `5 Z7 E4 l- B+ c& W2 y比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作( a+ `: U) j1 c

: ?+ q' f; T4 A1 B, t5 f命令行输入4 P! D" f$ n' D) q+ x: g$ D
dllproxyskel.exe <input.dll>
6 C. ~. i7 J1 k! o8 H2 p9 B& q- open file D:\\项目\\dllproxyskel\\input.dll
: @6 [" x/ e3 ~3 L3 c5 X  
( n' {4 ~5 p, g
& V# i" ~+ f4 l/ O4 x# |' ^9 Y------------------------------------------------------------------
+ ^4 W% Z3 c$ W& s" P我们需要额外添加的代码
) H8 z: t! ]% a6 ~( f" A#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要1 K5 u& f9 I4 [8 _* d) c
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2. v  m+ J, m- ?/ x! c/ w
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值' N; Y/ E/ Q$ o$ W
CALL_FUNCTION2(BOOL, ExtTextOutA,
, j0 E  l. A2 S/ R7 R              HDC hdc,( Q7 t# V  b7 U/ i) h' {! J$ o, s
              INT         x,
2 }  M( F, b' @; v8 `. y2 g              INT         y,
. K4 D% V2 q, l! M6 ~% E4 ?              UINT        flags,. p  G, D- H9 {7 O- a. ]
              const RECT* lprect,, s: }' G+ R+ j7 J7 d! J
              LPCSTR      str,4 {1 W- s) Y& r( x6 m4 F/ q, k9 Q7 X
              UINT        count,1 f- V0 F% N$ _3 p
              const INT*  lpDx' }9 M+ _% Q2 \/ j9 ?1 p
) {5 H4 s# B4 ^. [7 _9 v  k/ o
    //这里可以做任何你想做的事了,HOOK成功& R; j- y. ^' o6 ^4 w2 l
    outputdebugstr("HOOK ExtTextOutA suscess!");
4 Q4 G7 K8 I% {  i7 H       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
) u8 J4 L' X6 d2 s; X! E& l       return(result);8 {1 O& h3 X0 Z# `  m  ~
}
8 m. {( j  [9 Z7 q: }9 W  V; w: h( P* p4 l
注意,生成的代码需要用gcc/mingw来编译,
; n' C; X  A% w8 n* ~主要是因为其中使用了gcc宏扩展
* Y9 U$ F$ B9 `( ~1 H5 ^) E5 U$ Q$ Q" H#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
8 D; g" F% M3 {# y$ Z#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
, E1 L$ u2 t" L; \4 B, C        void CALLING_CONVENTION  FUNCTION_NAME(void)
) J! V6 c+ Q! r#define PROXY_FUNCTIONX(FUNCTION_NAME) \\0 i4 J9 r6 R# X. d9 A
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\) J# `3 T9 m2 x3 v9 x
        PROXY_FUNCTION(FUNCTION_NAME) { \\! o' q6 _6 T( ?: o2 `! G. z3 a% U
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
2 O/ e3 t) ?6 j7 O        }' }$ P3 B8 z$ |# U6 \
#define CALL_FUNCTION(FUNCTION_NAME) \\
8 Y) R3 p$ ~; Y. b  J9 ]5 O2 t: D        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\9 V# d  c. u) e4 Y- o. G
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
) B& |- `  q" l' a7 _#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\7 K6 n* ^+ ^/ X% f* y- P$ Y! o: f
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
) }+ ]3 V  o9 ?  U        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)7 \2 _7 w# M+ G% q! V7 D. m

3 n1 E7 K: }$ U* V$ c0 ~
3 y) k2 y/ f, z2 Z0 [  ]: r等我回头翻译到VC里
' M1 K0 k. Q  H* I# W待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
9 v- C: `6 ?/ n2 e7 k+ m( N那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
* x* p( a5 G8 o9 J: Y* m哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 9 G! L1 _( H0 h" ^! }5 r: C
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
) y. q( s$ Q& m

. W5 o* }5 a4 B# P4 l" \+ U% \windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
( a$ z3 F3 k; E% C9 Y2 q这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。3 Z6 g6 S; U% z( F3 `% e5 H: Y6 B
6 z# z" ]& G2 u% v# n: Y7 }8 e6 v  q
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
2 P& Y4 q: F( l6 P3 u我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以& m6 d( ?4 R) w7 h
, H0 y3 i" c, U( K5 O
这个我可以试试看,蛮有趣的6 p! x0 a9 Z! |
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,0 J! y- ^$ N9 V. M+ i$ n
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,3 @7 o. w) u- |
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
6 R+ I0 X8 Q' T! ?/ C6 P9 ?+ v, S! m, J$ f/ x3 Z( K0 G; u! a
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
2 X# e7 a! F5 _) {1 ~# k1 i哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 . `/ F) i0 i  d4 U. ?: n: ^1 g. P

- [" l1 I/ P8 ~! g, |9 [5 _$ u4 n( f这个我可以试试看,蛮有趣的 - _% O3 g" j) D' o- N) D/ b7 N
是用hash链表把中文字"归类"吗?
: a- v5 k& c5 C  j7 Y: E$ Z. N& z
, O- F4 n' F' B3 l5 N0 R" N3 \.......
/ b2 S( M0 |* _

! s  j! i2 x8 ]# g. M: r0 L最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了- t6 v+ F% z' c: Y& l: L. l8 s
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA6 y+ c/ G- t( Q, r* ^
所以无法通过 #define _WINGDI_ 来取消重复定义的问题
8 J; g/ R( C8 _2 }  X3 P2 I说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout6 F8 i( e4 w: t- R/ y# V
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
  N* C* {" h* ~, j如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦. f$ h# b1 [) v
; M" b1 T( B9 \0 a: }
我想的解决方法:. u& X* S9 n% L5 `% H# l
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接7 R9 T  Q: e; ]8 W; I; n1 U  M
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
$ V3 }- ~( a9 {    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
9 i  l: o% ]0 Z: O6 x         DECLARE_HANDLE(HINSTANCE);1 e5 ^% i: b! t7 N
        typedef HINSTANCE HMODULE;
! g5 i, j* G3 @  O8 N  x5 |        DECLARE_HANDLE(HWND);( A: o$ g) `$ k( K  j  N7 a
        #define LPVOID              void *
$ X+ ~7 T& T  P        #define DWORD               unsigned int
! n& k: q" }8 o" ]/ K1 Z" Y        #define UINT                unsigned int
9 r+ A' P" g$ N! k        #define LPCSTR              char, g+ s1 B: `( E/ }
       #define LPCTSTR             char
, [. k0 _2 ^: k2 M5 d0 W       .............像这样用到多少自己定义多少
; U0 T3 K, y* i9 v* H, @* M" J4 h  ]- v- R+ W1 l  A& K9 `  e. u- Y
3.改造def,使用函数转发器+ @. h4 ?: @5 k1 I' R; D
在.def  文件里转发,8 n  [. `2 I2 c" m. K, ?
EXPORTS2 z) N! O* m/ p0 E
  AbortDoc=myAbortDoc @1' \5 j8 e0 }( o7 O+ |1 p
  AbortPath=myAbortPath  @2+ C  k5 z! @9 y* |) g0 l- i
  ExtTextOutA=myExtTextOutA @2222 P- F. R& x1 s7 K
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
4 z, ?; z( b' u$ z你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
5 m' x( [/ m, D: z2 h" l% k2 {
. m& p7 o2 `7 x/ L3 ], Z算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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