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

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

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

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

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

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

solidji
$ E4 ]; \7 x6 F0 Z, I
  e; |# t( _7 ^# r1 b. R 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
1 _9 j6 t0 z2 o& \9 |! V( I http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
* X5 q8 M" o  H3 S# e! E  I& E$ G8 r5 T9 }% N; r- \8 M
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
2 F8 @+ N9 x8 b8 Y2 u- e. E 但是比较复杂,我暂时没有时间仔细研究。
$ C! q# B# B: X  L 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,! h2 Y6 z% \- s6 V) v3 p
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。! U. |3 D9 p+ w( G
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
- Z! Y  i$ C* y打不开页面,我搜索看看# d& X- n+ i+ x( a2 E6 w; n  l
-------
3 ]2 A( x1 s- T5 Q+ n4 c哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
! l# U: l: z, ?' N; H  @然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,$ }( X8 G" L# e! m
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_1 O  ^9 B3 ?) R9 `9 p. ~+ w
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作' t3 S) c" d. V2 Q, A" E

1 E+ w4 a4 m5 [" s* M, Q: B4 }5 G命令行输入; j* M# G! T. M, w, M# G
dllproxyskel.exe <input.dll>) o. `7 k% P# a, j  Q
- open file D:\\项目\\dllproxyskel\\input.dll
* ?% m4 \1 F: M) ~# u2 e6 M  
3 {3 z* j! H  i! t4 J2 {/ m$ L+ j2 b1 a" I' h
------------------------------------------------------------------
! O- J4 ^7 s7 C+ M- B7 E我们需要额外添加的代码
8 x! z& z' L- ^- g) ~! r#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
% j7 C  [0 p! |  ^- L- C//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2+ d: |( e: I; ?7 F0 w
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
: O3 w( T* s" X- U3 O4 H2 e. s8 kCALL_FUNCTION2(BOOL, ExtTextOutA,
" p/ D( ~1 Q- P) i8 f' F              HDC hdc,
: B0 Z4 q; j/ O3 \5 z8 C" O              INT         x,; p. |: z! O5 c* k+ y
              INT         y,; E" J( I  S. d5 j" i+ ]) V
              UINT        flags,; w! W; ?5 M: Z# k' k  V: s
              const RECT* lprect,& r& X8 o! @  h9 T, O- t( M. H
              LPCSTR      str,
% b/ m) f; [1 z              UINT        count," `( b, s6 M1 A2 e2 j
              const INT*  lpDx/ y1 W: O# i  W
) {
" H& O  O! A: u( R    //这里可以做任何你想做的事了,HOOK成功
0 N7 R* ^+ i  M6 H3 _    outputdebugstr("HOOK ExtTextOutA suscess!");6 L4 X; v. h9 W. P3 }: V
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数" }7 \1 M, m& a0 C2 e
       return(result);
) C* Y0 Y# E/ i+ T2 ~! T) |( j}% D% O, A& [% a5 C/ ^
; j/ g6 Z7 r5 M/ G) r- {1 y! Q
注意,生成的代码需要用gcc/mingw来编译,
4 ?  w$ c6 T6 D2 r9 G3 M( C主要是因为其中使用了gcc宏扩展
/ U* ~+ G* K7 u#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
9 r* m" |; v& Q0 h" H#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
7 [% q% I; Y* F+ R& l- `; u& Q        void CALLING_CONVENTION  FUNCTION_NAME(void). F7 X/ @0 o/ M0 H# A! s$ [
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
. g# ]& g& c3 G. L        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\3 M4 C5 S) @( `' x5 a
        PROXY_FUNCTION(FUNCTION_NAME) { \\
. ^6 `0 M; ]" [  x% C6 k2 E            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
  ?3 L  a  F/ X" ?        }' e2 H/ c- l* n
#define CALL_FUNCTION(FUNCTION_NAME) \\/ F+ g: J( P; ~* K
        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
6 ~1 a' o, q/ ]8 p) u7 P        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
' k  i0 N; Z8 m1 j#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
( J" {- ]% Q* A& L3 v; q        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
0 z) D  d+ z7 R        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
  M7 N( z1 ]7 {7 @/ k0 C2 ]) D! s
1 w) \: g& O) C9 M) x6 X* U$ }. ^+ X6 E* q0 [/ z5 _; L# L6 n6 |
等我回头翻译到VC里
. e( w6 h$ ^- T) E, \6 ]待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧& v# b* v; O- v- C7 M3 }. @4 ~
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : : [! D7 f- v: O6 L
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
& y8 A9 e8 b! e$ a% w7 J, U4 G1 y那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

+ K* U+ r" f% p# d( Z
- Z" C. x8 \# m$ ]. nwindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。/ Q/ |5 i1 R& p
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
! r# T" @4 v' z; v6 h+ N: M) L/ M  @  g9 @" k$ e
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
0 i. [1 p) h( i: P我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以! F( d0 M5 \: A
8 H9 e7 D0 B4 Y) o& u
这个我可以试试看,蛮有趣的. R" Q: C9 _5 I+ w0 d2 ?9 p
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
- \# _7 D+ D: K* n: e/ D2 O1 N  N+ R因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,# |3 y- n' C  c
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
: R- H9 r! K: e; K
+ |! {" V1 A" @9 |" @007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : : a5 q" Q  s. v% [
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
# @& S2 r2 H( r  P! f- f
$ j- Y$ N/ _3 o7 y: \: j, B1 q这个我可以试试看,蛮有趣的
5 ]" F( F9 G* @8 B是用hash链表把中文字"归类"吗?
) U5 r* N# B; b2 P1 G
) \& C# o, c  N) p/ m- B' h& [. Q.......

  M1 e- i! S; [5 V1 U& b2 E
% w9 l2 h% `* `最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
/ I, t# a- m3 }. K- r另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
% B- h/ q! N* v/ ?7 P- s. @所以无法通过 #define _WINGDI_ 来取消重复定义的问题
% I5 c7 M9 c% Z说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout. N9 ?, y8 ]8 t9 ?8 U( R7 K
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
' W: n) i" i  h/ {如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦6 H& O7 i; d# c- F; n" G: W- d

" O! ]/ i1 f9 U9 m. T6 O我想的解决方法:
; {) n+ S/ J+ N, s8 ^* i1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接5 s( T. I6 m9 s' C( d9 I
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
" T# D6 K$ ^2 m, Z. N    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n( K" H; Q" ^# K8 z4 e2 T7 L
         DECLARE_HANDLE(HINSTANCE);! r. s& t+ N# l5 Y& {0 a6 y7 V
        typedef HINSTANCE HMODULE;
7 v) X: V' `( U8 E* }5 n3 X        DECLARE_HANDLE(HWND);
$ ]! g/ |. K  ?6 b        #define LPVOID              void *
* W; @- p" ~- o9 w5 [5 F        #define DWORD               unsigned int
: L4 r1 B0 t- v: i( [; D+ B) @        #define UINT                unsigned int! W- T  I$ r) c
        #define LPCSTR              char+ h- r' c! T; o) h' j
       #define LPCTSTR             char - k( r7 h0 ^9 x5 I( T' x# b  U# [
       .............像这样用到多少自己定义多少7 B3 @  B, n; L; ^( `) ]

1 l6 g( O/ l% \0 g) R0 t- x3.改造def,使用函数转发器
  s0 a: x" @( w在.def  文件里转发,
, j7 N* z6 Y6 \1 gEXPORTS
/ ], T1 `! ^8 e& C2 O3 S  AbortDoc=myAbortDoc @1
' a6 y( F5 b* `4 Z! |  AbortPath=myAbortPath  @24 b) L9 ]" M, Y; Z0 r3 e2 q
  ExtTextOutA=myExtTextOutA @222. R4 T  o7 u# q2 |# e! n) j
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
1 t. W; G9 A$ D* L你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
6 n) e: I4 o* b% Q) P: k  O. `
/ U, m; V5 O) K! b" x- E算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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