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

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

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

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

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

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

solidji
+ \- d2 z' u9 V; V
" m# U- q( {: T1 y. W$ [  V 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
( |# P& b3 L% B http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
- }! T0 [/ F! ^1 ?  a" F, x* E! `) V
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。% u) {+ p& w! U  n# o+ w0 r
 但是比较复杂,我暂时没有时间仔细研究。0 [' @! I; d' X8 L; I- ]3 C
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
  x9 X. a0 G7 ]/ ^% G 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
4 a6 a# J8 Q1 R. @8 C    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista8 n/ H2 g* w8 T/ J! m" ], ^
打不开页面,我搜索看看
; B1 b5 V7 H# `# B+ p/ o-------5 N+ S7 Y9 ?+ W/ a' L. a5 t+ K
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
) m% v0 y# R4 a1 q' G然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,% x+ r0 C2 h1 Y: N0 F  w0 t! p' B
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
0 a! a7 C* x2 U0 q比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作4 ~# G7 ]- V. u: v& E6 r
+ F% e6 g( t# m9 C5 ]8 J
命令行输入  _1 t4 \; v+ G$ q7 h
dllproxyskel.exe <input.dll>
/ t! y( B, ]3 {- open file D:\\项目\\dllproxyskel\\input.dll
7 S7 h8 m3 {# m# E- Y" B5 n& r" u1 Y  
3 H$ d! y# z: m4 ]! b: k
' q4 u7 p( R, J$ a; O+ [3 ?------------------------------------------------------------------, I9 d1 m: B9 l9 T0 K6 A8 V
我们需要额外添加的代码
0 A' l  r8 S6 w, a#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要7 q8 [0 J. }) X" O4 }7 B
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
8 w! j7 C- t( O% C' w//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值% k* p1 S& J& t; H" O6 `  p
CALL_FUNCTION2(BOOL, ExtTextOutA,. Q5 |; X4 O8 K3 f- ]. P5 L
              HDC hdc,
0 N4 b% h; }  t. d0 N" h4 G+ \              INT         x,1 M  N/ ?$ G5 @$ ], c; {: @9 m
              INT         y,
) R& _+ ^- S( ?# H              UINT        flags,
5 E- o" T# y7 a! T              const RECT* lprect,
" f: r! U# q1 l9 [' L# P" j              LPCSTR      str,  @9 }+ H( B/ q2 V6 G
              UINT        count,+ A6 F+ ?. W1 v( h
              const INT*  lpDx
1 F* }3 t! d  [: t7 _3 o: z6 U) {
" Q) {6 h7 K# m    //这里可以做任何你想做的事了,HOOK成功3 l: T6 X5 ~8 P6 W) u$ l
    outputdebugstr("HOOK ExtTextOutA suscess!");
% f( D( z& P- s/ R5 F: }       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数( x4 U6 ~9 b# L$ J! j# Z
       return(result);/ q9 @( h4 c3 b. V0 s# q# O+ F
}
# J% Z+ e' Y: y4 p, V1 K5 E$ s: @' t" k/ W  L
注意,生成的代码需要用gcc/mingw来编译,
% [2 o6 [3 r9 n' t主要是因为其中使用了gcc宏扩展6 r3 [3 s" W5 D% W8 S9 j& K9 w! L9 Y
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs4 U/ N" A5 L8 r1 x9 r
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
! X2 u1 {+ U) z# e  a5 P  _. u        void CALLING_CONVENTION  FUNCTION_NAME(void): J/ @* p0 n7 Z; z
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
4 d  `* E6 X" }$ m$ S( k7 \        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\- |! U& ?& e. g$ L6 h
        PROXY_FUNCTION(FUNCTION_NAME) { \\
. H7 w& J2 X! q/ t1 J3 P( W2 m* Q            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
- J: n/ a/ P, L* Y        }. L# x0 T# o% ~# Z/ _
#define CALL_FUNCTION(FUNCTION_NAME) \\
5 r, V9 K1 {  u' ]: B7 D        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\2 f0 a) T( p" T0 E" c0 H
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
9 r9 h) ]7 [" K: ]* ^1 @#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
( I5 ~* z$ Q: R/ J        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
: ?8 Y* l. o$ {' a        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)+ I+ Q! K1 }+ `3 c' Q8 S

8 B; |4 I1 ^. h. d
& |2 C1 R# b- U  p" ?等我回头翻译到VC里4 |; q  M6 f  X7 x; b
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
: s6 s# j4 I& E+ E2 Y那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : 6 ?1 V" u- y- T4 j) N0 ?
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 9 m3 j  k/ g  P) |- I
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

+ ]& O0 a, J4 p+ m" t( L8 S' f- ]8 G, \2 i7 r
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。$ y+ S5 `1 A, ~
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。# Y$ b! x' D, j+ {; Q+ W- L" U) Y
& y  }" r. X; w$ z
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?: c0 M+ F1 T" h$ N; `5 M8 U
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
4 x% M3 m" k- w
( R9 J- j% j2 L5 \4 i$ h这个我可以试试看,蛮有趣的& ?' e  u& J' e1 u8 d0 e% k% s1 `
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
9 v& [( j# t8 k( |0 e' f因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,6 i6 V+ _. g- P' p$ K: a# H; b
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"* Q- j. Z+ d' q
5 i/ O+ f% V* B6 K6 M3 `+ C
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 0 B3 O  S6 o) h3 G' S5 I" n4 I. n
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
! C6 }8 _$ u1 X
+ B) p5 A8 _3 N  |9 l) v这个我可以试试看,蛮有趣的
# P- l0 j# h' e; G* s9 u是用hash链表把中文字"归类"吗?
" Z& \6 @. F* `9 h1 f8 p  S" N; z0 c& b- k$ R. X% f0 M
.......
+ X, F3 v, ?3 e* n; K, B

- w$ V3 d6 u0 C8 f' Q最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了+ f. a: n5 q6 L* S. X
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA4 _8 B) X9 {5 j) ]$ b% j' V
所以无法通过 #define _WINGDI_ 来取消重复定义的问题7 [, a5 [( r7 E) u+ A2 k2 v
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
4 c. P3 D# J* W% v2 f3 |4 y  ]可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
# I  q5 N: ?. I: G如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦
% b+ d' V0 U. L- {0 Q4 w2 v
* w& p, |5 M/ a6 o我想的解决方法:
/ W( r% S% b; i6 X3 @1 d1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接5 f, G, T( K/ b. {: g5 m, T
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
: T! g: s& P8 o    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n$ H: q8 p9 R. _+ H. z1 i3 B
         DECLARE_HANDLE(HINSTANCE);8 E! ]9 o- `5 ~% |
        typedef HINSTANCE HMODULE;! f8 K9 U& ~* o3 @* X  l5 d( h
        DECLARE_HANDLE(HWND);* f7 ]4 V: t+ B
        #define LPVOID              void */ c& Z0 P( O6 R& ^" G5 h( }
        #define DWORD               unsigned int: N8 t/ s2 K- G" Z9 c
        #define UINT                unsigned int
- g% s: R/ i7 Z        #define LPCSTR              char
& I! X) O( @% g) b& x' U       #define LPCTSTR             char - L: m2 @9 r0 [: m& i: D3 }6 o
       .............像这样用到多少自己定义多少
4 T# q5 B& k% B% g; g: L% P1 W& _. S4 m! F" \  J, z% \$ ~2 k0 s  C
3.改造def,使用函数转发器" r1 _& `3 t4 l5 j
在.def  文件里转发,
1 c' P/ C& ]3 K- d- j" c1 wEXPORTS
) _. Q. A2 M2 \8 t- r8 o  AbortDoc=myAbortDoc @1
- w. C2 J- H: r/ \  AbortPath=myAbortPath  @2
. t# _0 m7 d7 W! f- s3 I+ G  ExtTextOutA=myExtTextOutA @222; v% V$ }: m) T  C# P
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
* m" V1 _. w& }- j1 b% c你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
/ P1 G" J) m$ x7 U
6 N/ j( e) c2 p3 I算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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