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

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

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

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

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

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

solidji5 ~; v- |. V% P: Z, C* R4 F
% U4 \- S; e) o% @% v
 你好,先给你安排一个小任务,这个任务对你来说应该很简单。# Y' P8 C$ L# N5 s  f0 Q
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
: I& o6 ~. H% G  o+ i% a( ]: Q3 Y# r& [. ?1 F
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
4 g# L0 _3 W  y( f/ k 但是比较复杂,我暂时没有时间仔细研究。
$ }' i1 J3 ?3 B7 U3 ?* q- A) S 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,5 ~7 k6 h8 C, M- y! F  H6 G3 ]1 Q
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。+ U1 l4 P* Z# N; p
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista. w: j$ {1 [0 K2 v
打不开页面,我搜索看看
2 n) z6 N1 w& c9 v$ G-------; J9 D) E/ O& Z; o4 ?9 U3 m
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
' c3 B$ g! V4 M* J; {9 q然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
# P; ?9 }- M& s% e0 x通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_& P2 Q8 x# {  D" i% v5 C
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作! o( l1 N4 s7 e; k8 t! S

: ]/ P  s# x/ S8 w命令行输入
1 j/ f" D' p: g  l+ S/ ~/ Sdllproxyskel.exe <input.dll>
, L9 E" s4 }  V( U& T- open file D:\\项目\\dllproxyskel\\input.dll
- `8 o& m  e( F: C* B0 w/ C: |  % A  Z5 Q, s( I* n  l/ o6 E

7 }: F4 D% a) q: m; l8 i------------------------------------------------------------------. U8 ?% \7 Z3 E6 {
我们需要额外添加的代码- @+ p3 O0 Y6 B8 B& H
#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要: u; z. j- f3 u1 n
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
# ]+ R# `0 ~( k& ?//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
9 S" f8 ?) t6 v% S: t8 _CALL_FUNCTION2(BOOL, ExtTextOutA,
0 \* }8 I; n& M/ a$ x2 J, `* h              HDC hdc,
, V+ m' @$ ~" a$ W' L- G0 b4 M0 h              INT         x,$ Z1 R3 H) D6 s
              INT         y,6 p  x; D% ^0 T( {  `$ ]& c
              UINT        flags,3 _5 y; p  }7 L
              const RECT* lprect,
0 S4 h- ?6 }# \, z) h              LPCSTR      str,* o. D5 i/ o" r* [- h& s
              UINT        count,& T' u. z1 B$ j* ~! @: r
              const INT*  lpDx4 J* ^) F- y% ]( B  t4 ^# i" A% v8 z
) {
) @1 N( Z" n4 ^6 q6 @' e# K. S5 o    //这里可以做任何你想做的事了,HOOK成功
7 y5 p3 a: ?7 X    outputdebugstr("HOOK ExtTextOutA suscess!");
$ R2 z9 b; Y8 K" K/ |       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数  T' p5 x2 [- R% R8 E
       return(result);% r: l; P* Z; [7 g5 K* t% M, }- F1 i
}
6 ^- }. n$ g0 o! G: z
) A7 a# i: v: f- [$ r" q1 u; L$ P注意,生成的代码需要用gcc/mingw来编译,
; j. R$ w/ w/ q* q' ^主要是因为其中使用了gcc宏扩展/ s! {8 A( W' y
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs2 M1 Q2 i+ s" f3 W) b4 B1 r( e
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
3 G1 ?! J0 b9 b& q' y/ _- ]. \& t+ V        void CALLING_CONVENTION  FUNCTION_NAME(void)" O8 a" Z) b7 A" U' w5 V
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\2 C3 r% O' u) X- r; h7 ]
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\3 k$ K& D, Q& f% n! _- L9 o
        PROXY_FUNCTION(FUNCTION_NAME) { \\. X* x$ u/ T" ~7 m% \9 l
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
( \. `" _. c9 k9 D3 b) _, J        }  o- V5 S+ S. H1 z! z' w
#define CALL_FUNCTION(FUNCTION_NAME) \\
9 Q" ~3 ~- c6 s. F2 Z, L        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
& D; d9 ~; t! @5 Q1 o8 a        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)* |2 ~4 V4 L( b
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\' y7 k* q7 q5 z# ?
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
- Z! v& k0 b, ^/ o! z( W- M9 d        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
5 E9 h/ q* f$ Z* v# P7 U. o4 h% ~1 x  S( A+ U

3 `" F. E, O# S" C% `等我回头翻译到VC里1 v6 j! D( _7 p- B  u. N
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧- V6 l1 i: ^' T, b: O; `! C9 y2 r
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
2 A  m: Q5 f7 {2 i哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 6 q4 l* H5 T$ N
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
& ~3 o" ~( `. p8 ^; v4 d2 r

9 ~! ?5 w8 X; D1 ywindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
3 V. Z; x8 Z0 V5 I这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
8 I# }  \. F  l) |1 j7 u+ g+ w7 |
* t% m, }( B2 t% g, d: }对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
* ?3 H. H3 R% U5 l. I我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以: X: U4 }5 \% W" }: Y# ~

. H; e& ?3 x4 o$ N4 l- X1 {- \+ Y这个我可以试试看,蛮有趣的
1 H, f$ D5 i+ n; O/ c7 D是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
! V9 q# I7 b8 h% t9 R) [5 C因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
; S/ q! b+ k, S无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
3 k) a5 L  e3 d' r1 m% u, l  G
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
' ?" M2 y/ D; X2 ?8 ~4 q哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
+ E* J7 F3 C; u6 Q& E2 I( ?% ]" I% L8 M, R2 {6 T6 E
这个我可以试试看,蛮有趣的
+ x+ M. j# a, N& I  s9 G  R是用hash链表把中文字"归类"吗? ) p4 f( f4 V0 s, k) U1 o

% j& l  x3 I0 V1 m" M, I.......

# W  u2 b1 W7 O5 H# e' |" ~5 ]* x6 F4 O6 t
最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
# `8 F( S( e' |* j7 W# |& p4 ^0 D另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
1 }/ M  r$ q# }/ }2 X所以无法通过 #define _WINGDI_ 来取消重复定义的问题
& f9 b! Q2 q) Z# [- e5 U说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
4 o/ O1 S! v1 `+ m  \! M' @7 p可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
, {# s- ^  h% F! V# r. t如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦) T0 T+ |4 _  e, l! x

; a: _1 X" x2 X: F0 N5 b我想的解决方法:
; M: ^5 L( _2 C# R1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
$ @+ c4 n9 G; I0 r+ L# e) p2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)% G) p5 t( s* [! {8 s3 V5 U2 P
    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n+ L0 n' \. s* c- K1 a3 G; l4 e, d) D
         DECLARE_HANDLE(HINSTANCE);9 R+ q/ M% x( E. C* I/ u* u
        typedef HINSTANCE HMODULE;
, E' M! |( ^6 t2 y' n        DECLARE_HANDLE(HWND);
( o1 t/ a$ E; g        #define LPVOID              void *
7 |+ N' _5 h8 N7 k: [! `' ?        #define DWORD               unsigned int
7 ^& L& m1 {4 y3 G* M+ J5 N1 [        #define UINT                unsigned int" R* T( \9 ~1 [$ ]) g
        #define LPCSTR              char! i6 b" m/ z& @0 x* C* T2 q  Q
       #define LPCTSTR             char - W8 ^  Y+ w  F, D1 ^
       .............像这样用到多少自己定义多少
7 J" }0 Q) i( c1 R$ ~4 n7 \4 ?* k9 B5 i6 t/ E5 V9 E4 E1 n) ?5 y
3.改造def,使用函数转发器$ r* O) @; N8 P" b* Y6 D
在.def  文件里转发,
6 e  ?7 ^2 v1 H: e6 E9 |EXPORTS5 H, A) N' b5 E: ]
  AbortDoc=myAbortDoc @1# s9 n) G; D! `! k" }
  AbortPath=myAbortPath  @2
. m% L; c+ S. F* w3 \. x  ExtTextOutA=myExtTextOutA @222
7 @& n- s+ I8 H然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA   N8 @+ Z( D1 B- a. H4 a
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了) y, f, d0 A7 k4 v+ r
2 ^* S9 @# g+ [, e9 p1 U3 g; @
算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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