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

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

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

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

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

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

solidji
$ X# Y3 ^6 G' H6 g8 K7 A5 T6 N( i9 @% O5 f# e1 O$ b
 你好,先给你安排一个小任务,这个任务对你来说应该很简单。8 K8 C& G6 ^' n# d3 S$ D
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
/ G. l" F+ r# e6 Q  ^7 T2 D5 Q7 {4 ~* Y+ W; C7 f4 R- a
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。/ E# q7 O/ H0 A) s3 V) \
 但是比较复杂,我暂时没有时间仔细研究。
  U+ z. \6 U0 g 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
: k( w  ^$ B# y0 E& n1 Y 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
, `) q7 x; G0 Z7 p! J9 f# P    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista5 d% a  D2 B5 [; _, K  d
打不开页面,我搜索看看* E# _7 O  B5 b. C9 Y% y0 |; a
-------. t5 @' U" p% n' ]0 a
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号( ^9 W; ]  t. g9 s3 D& F* B( @; \
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,0 O, D9 n* L  j# i2 c1 x; `4 P
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
6 U8 Y5 W) E5 o# c' m比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作, T4 a! V2 _) [& T9 J+ P5 J
  d! M& r; }0 y; I
命令行输入9 t8 E3 _: v8 t8 G" e6 X
dllproxyskel.exe <input.dll>
$ C3 V( p6 h7 y0 m6 N# @+ L' N4 {- open file D:\\项目\\dllproxyskel\\input.dll) i* Y" ~. ]5 Q9 X' G; w1 W
  ' M9 S0 h% }! b4 t0 l" w

0 b7 z- A+ @& s2 Y7 J% z( L------------------------------------------------------------------" _: X) p0 [) Z6 C% X# n
我们需要额外添加的代码
' p5 Y) y! b3 C4 u2 \- ^#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
4 B3 Y& C# Z( {% h0 h8 b, v* |//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION25 S, _& t# o$ }! |1 M+ M
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值, Z- J* |% c+ i
CALL_FUNCTION2(BOOL, ExtTextOutA,
5 W- `. Q0 C1 |  ~3 I0 ?$ k3 |" E# }- O              HDC hdc,
5 N+ @" ^, _$ a4 ?6 o0 q- H              INT         x,5 p( M1 V+ D# J" g  h
              INT         y,
8 b0 r' C$ ?* `1 X! a              UINT        flags,% H1 ~" |! C+ J- g
              const RECT* lprect,6 Q. M0 c( i9 K2 b
              LPCSTR      str,
' V# [' L. l& E% T7 s- H' j& j              UINT        count," O4 C0 k% X2 S$ H8 m
              const INT*  lpDx" D4 d4 @2 z: P# V8 |
) {
0 E  n% |2 A& y" @0 e6 I# H    //这里可以做任何你想做的事了,HOOK成功
# A! t8 D# r1 O, u3 ~' ?! v! h/ G) @    outputdebugstr("HOOK ExtTextOutA suscess!");
* r2 ?4 x& I5 Q" Z& N8 R       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数. i: R1 E$ Z- `# s( @
       return(result);9 S0 b5 C; ~% g/ N) g
}+ y% k3 b& b. L; l6 R- _5 M1 s5 Y9 W
, \3 r. P$ V, @! \6 }5 b2 `; V
注意,生成的代码需要用gcc/mingw来编译,7 }4 v% c. s/ ], C4 T0 x0 {
主要是因为其中使用了gcc宏扩展# {7 F5 T/ |( a1 i5 f! [+ X
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
( G( a( C4 d! [: G( K; ]0 C#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
+ q6 |; y7 w  K9 u        void CALLING_CONVENTION  FUNCTION_NAME(void)  k$ W$ O$ B0 s! M& u
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\! X, ]+ ~! v9 L: ~$ Q
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\' f2 i+ M. }) I# B: y) i% [5 c
        PROXY_FUNCTION(FUNCTION_NAME) { \\
$ e/ i- [" y. g* X" I) D2 |: b            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
$ m, P% }2 W' j0 V/ G  Q! g        }
, v4 h9 r% G' Y: o  p. g#define CALL_FUNCTION(FUNCTION_NAME) \\
) O7 d, S0 f6 `7 j3 l        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
$ j& `7 f0 C; D) U8 S$ {- q        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
* `! y- S  d! X/ d#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\% W# T& O$ Y2 X& V% n
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\/ I: ~9 \5 [/ p& l+ X( S
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
5 S- E2 r3 _0 J3 n. f* g
# O  N: ^% q0 F8 e7 ]8 f4 u' ], \
, Y+ f' t1 ^% V- s等我回头翻译到VC里
8 l/ E1 Q7 t& f2 V待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
# G) k9 |+ ]: W7 O2 \; g) s, G( P那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
0 t. `/ \; R% G. u) j哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
- f- y- o+ K) X( ^! j) E那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
7 g) n9 ^; k# k' x) K/ }

) z2 w$ R& S% b8 X% n$ W! }windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。. l7 M) K( S# o. u6 \2 Q
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。/ |3 f  P/ O, N( E( X

/ d# m/ i- S7 L- [对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
; \. B6 l& s  D: e我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以0 k3 R7 T7 k+ X3 V; ?# u- W& U4 G

+ M# |1 U8 ~) A  \这个我可以试试看,蛮有趣的
  h  J7 _: C0 k; x$ ?, X是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
( b( k8 r% v& x因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
) S5 I6 t& J0 f) n) {无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
$ k" |' k! T) P4 U
$ r# g' r6 j# ^+ T( Y5 S007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 9 S' Q7 P  t* A8 g( d
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 , A3 t1 z: R- T$ B: o. J2 y
- Q4 B1 k5 J: j- }# t
这个我可以试试看,蛮有趣的 8 p2 z6 e" j7 t% y
是用hash链表把中文字"归类"吗?
/ G( H, s2 U- _; @7 ^4 n
8 }2 n6 q$ R6 L& Y) u.......
# W" n. U+ u: A1 d3 G4 F
3 ?' z! W+ B% q
最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了/ @6 N* [9 D* U3 r" i2 Z
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA, H% D- I- {  }& T" `2 ^5 T" r4 ^/ B) C
所以无法通过 #define _WINGDI_ 来取消重复定义的问题; W4 F. [8 I' Q
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
& y+ f/ O$ @) L. X  _, F% G可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了  a# Y4 [# g, g: V& S9 b; r
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦0 C2 J3 S7 y6 R
7 r* |1 a$ U+ r$ H5 K5 @' C
我想的解决方法:
3 R) a; E$ Z# d' Q7 P/ I4 H. p1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
1 C& `, r. t, O8 h% e2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
7 m5 `' \3 y; I( `% h5 U    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n7 D* L9 ]0 E- U! I
         DECLARE_HANDLE(HINSTANCE);' g4 N7 [8 D0 n7 a' @" D
        typedef HINSTANCE HMODULE;) p* h$ \* `- T: K& b6 R# h1 c  Q/ m
        DECLARE_HANDLE(HWND);
& p$ A+ b; u+ h* S. ]: q0 \        #define LPVOID              void *$ P# x. e2 l  k# c: w: O
        #define DWORD               unsigned int
, ~$ g1 L2 w* [/ k! B  O        #define UINT                unsigned int
3 I1 u' w: U" u5 Z# s& o0 z        #define LPCSTR              char
& O# ^3 Q; O7 s- u  g; [+ w       #define LPCTSTR             char
- L# b1 Z2 U, c% V  s       .............像这样用到多少自己定义多少4 {  g9 i0 p- Q0 K6 h& m" l
+ U2 I) @6 d$ U; c) i! {
3.改造def,使用函数转发器9 \7 n7 E/ P6 l0 l3 z1 z" Y6 R. F
在.def  文件里转发,
% G+ }2 R. T! ~; D' l8 xEXPORTS
! d' j7 V! G, ^2 R4 g  AbortDoc=myAbortDoc @1
. T9 L( S  S! K* [, ^* s) L' _) g  AbortPath=myAbortPath  @2
5 n9 O1 t9 E; f; O% q  W8 v1 N6 E  ExtTextOutA=myExtTextOutA @222- s. O# M4 A( d9 c4 R, l3 ?
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
+ `' x& g6 y( \; ]7 [& [你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了! l8 [7 d% X$ z  G, w6 Y& Z) z+ p$ U

8 e( h$ ]& e6 R1 _; ?& H, N5 {' g算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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