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

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

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

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

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

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

solidji) |( L, A6 ?/ C4 _3 I% A

1 B1 Y- f% @& y% K/ i- f! E) K 你好,先给你安排一个小任务,这个任务对你来说应该很简单。4 {4 F  c0 [" `+ @) Q5 q
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
$ ]+ w) m4 l8 K9 \6 }8 }! ^( a
: W/ L' o1 [  X( v% ? 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。; i* w( g& h" ?- y2 h; r# W
 但是比较复杂,我暂时没有时间仔细研究。
2 [" a& \8 D0 v. F 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,' t- i2 l* u( l
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
+ q3 d- k+ c& E- e, s: f    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
$ B. o+ m& k# T+ y, w7 o打不开页面,我搜索看看
/ \$ N8 v5 G4 v1 @* x2 R-------
  m. g. X4 c) ?: H哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号' ?2 V+ B; }/ i
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,$ b, g9 N0 v# q
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_- a' P! H' I, w: Q% k" U( q
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作6 d$ `, r* ?* ?; d
: v3 s) f2 p* E5 e
命令行输入
3 Q0 |" I5 e. Zdllproxyskel.exe <input.dll>
; j8 I* K( [! V- open file D:\\项目\\dllproxyskel\\input.dll
1 A& q' X$ b" {- J  " x! [! N& Y, A: G& L

2 E- h/ P& j5 C6 {; f8 S. P4 @1 ^! l4 ]------------------------------------------------------------------" ]1 ]. t3 F* W- N: Z
我们需要额外添加的代码
' g% b3 I1 Q0 W5 \# O#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
2 h+ n  {) B/ b; j2 I//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
- Z/ {/ |4 H# H) g7 e) C1 I//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
0 o* Z3 u* y" Z, @5 CCALL_FUNCTION2(BOOL, ExtTextOutA,, x( }" f3 G9 t9 `% `
              HDC hdc,  p# `9 }2 @- K( N" k5 W
              INT         x,
. j) t5 V; @5 E8 N- Y8 H: J) z4 T              INT         y,
2 B' U# ]" X2 f# _1 B5 e- C; Y& z              UINT        flags,
8 ~. k" Z* J0 V9 q: G; e              const RECT* lprect,0 W. C6 m: R0 }6 _5 q
              LPCSTR      str,- S+ Q! _/ s) t/ i  U
              UINT        count,
0 C1 A; ^. d1 q! E7 n              const INT*  lpDx
$ m( G' X9 e; G$ B/ s+ G' Y) {
9 G; a9 h- f# I. j, K& t    //这里可以做任何你想做的事了,HOOK成功. N5 h7 {: M  Y5 `9 D! V+ f
    outputdebugstr("HOOK ExtTextOutA suscess!");6 @5 H+ Y1 U8 M
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数! y" C( J: t! x& Y  S& j5 r+ Z
       return(result);6 l9 _/ u0 g4 O! F3 d
}
! M& P' z- `% P; c
* ]3 E. |2 p( [( O注意,生成的代码需要用gcc/mingw来编译,
1 E$ f! Z* p9 v1 m% J( o8 s主要是因为其中使用了gcc宏扩展
  J0 U$ d4 u! h% X1 d/ o  h) v#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
+ i' A' q# R# q+ q#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
! q+ A* O& X7 [8 x: a8 z/ C        void CALLING_CONVENTION  FUNCTION_NAME(void)
, N+ c9 A1 @" M9 ^9 {7 q9 R#define PROXY_FUNCTIONX(FUNCTION_NAME) \\: z& h: _  f% W+ Z& _
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
; `6 |3 `( p  U6 A        PROXY_FUNCTION(FUNCTION_NAME) { \\' K8 G3 q; W" {+ [% f0 Z5 w
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\# D, i7 U! Z: A) N  O
        }
6 M' n5 z! n6 h$ j4 Y#define CALL_FUNCTION(FUNCTION_NAME) \\) l9 O/ i) L; K
        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\; ]& V& S3 s( A" h8 ?- v8 m% o
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
8 p* c6 Z# X, @& \0 `#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
" v7 j; x: \. U- T/ T7 D        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\( z2 a& j: B3 \/ L% c
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
6 S7 L: G  ~5 ]: p" c' i' a8 H
; |( b- Z3 J; ^8 F, M' l* F; t0 d' m$ f, Q
等我回头翻译到VC里. V) r! l0 B+ c$ B* O9 ~
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧: X% m7 U+ o" i$ D5 C7 I4 G/ Z0 I0 ]+ l
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
4 Z* q" C  }* L/ r6 ]0 r哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
$ J9 ?0 e+ {; x" r那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

' S3 w5 O. O) G' l3 I% K/ u( N
  B- P( M, |8 b! vwindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。$ a+ y' Q, W. h5 e  j( {" Q6 g, I
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
( |) ?: n/ S" [* S. V9 }: |% w1 T. F
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?$ S! g: e, t+ L6 L9 q  q6 B* c
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以2 p, N7 D1 e# G, z3 s$ T+ F( j
1 G: k: F$ p8 k' N3 \
这个我可以试试看,蛮有趣的% U) ^9 k6 F) [  j- l  o8 ^
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,9 |1 r- a1 N# }: T% V' S( ~0 T
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
1 p3 y( B- f. ~) {无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法". F. G& K6 z+ a- _, k( C( D/ W
% \6 @7 H3 _7 z2 k
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
( k# n  K+ B) r! Y: y' J* C  b哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
2 m. E2 V9 S3 |9 Y  |* v6 M# l/ Z% ?) P6 I
这个我可以试试看,蛮有趣的
, p3 c' w$ \- x1 S8 ~是用hash链表把中文字"归类"吗?
/ B; t/ ], z: r8 k: i5 q
$ C7 t/ E' e* M. w0 V.......

, W- S- G* ?: G& `8 j# ]; z3 G4 }9 o8 N  x* r5 P7 {
最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了" [! h- g6 a  c* s
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
4 `& I# v' N2 x6 D" q5 b( |所以无法通过 #define _WINGDI_ 来取消重复定义的问题
. Q8 t) e0 S; t: E说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout4 q5 N% w* f0 S( ^& @0 n
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了. p0 v3 P8 |! n/ e
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦
+ |+ G+ G; P0 V7 c0 k' r# I7 Z- Y8 @$ Q' v/ z
我想的解决方法:$ w* d5 y1 D- P% T4 U: {
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
% m/ J" g; O- l  ~2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
$ h, I1 R: f$ ^) z    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n+ k6 H* u1 Y$ Q& H/ y+ C# L# |( T
         DECLARE_HANDLE(HINSTANCE);
. r- W1 }9 q  j& F( n5 F) t        typedef HINSTANCE HMODULE;
( Q- X8 [: e& q( @        DECLARE_HANDLE(HWND);
) Y8 H, x% R' d! k0 `        #define LPVOID              void *+ d' E1 U9 W: Y4 {' ^
        #define DWORD               unsigned int; _" c& R5 k5 K* \8 q" U; t
        #define UINT                unsigned int2 _: D' E8 D$ W& t7 [5 a
        #define LPCSTR              char3 E6 F9 Z9 Y% f9 s+ \# s
       #define LPCTSTR             char 5 _1 l2 H; O0 M( o4 E: F" N5 A
       .............像这样用到多少自己定义多少
7 ]7 ]- s  _( I3 \  O. T+ M
# X. ]2 n" R" i% f3.改造def,使用函数转发器
' V7 W; r) q6 r* V在.def  文件里转发,
) I. ^( b) l) l6 |; kEXPORTS+ p3 v2 `* h4 f+ S- o$ g
  AbortDoc=myAbortDoc @11 D2 c* _# r" I' X3 P, a
  AbortPath=myAbortPath  @2* w, L3 U0 p3 q) V, i5 g
  ExtTextOutA=myExtTextOutA @222
! x9 [3 R& H' Y, Y4 q$ h然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
/ B+ o7 U, v/ }你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
" {- A  ~# R, x* |4 B6 N# T" g' |+ @% k9 [( B0 u( W$ w
算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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