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

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

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

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

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

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

solidji
8 D7 i+ S5 ~- G$ X# w+ W
3 ]; ^" U# u1 x# B% m6 E; v 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
5 I$ J$ S( K4 r9 Y4 a http://aluigi.altervista.org/mytoolz/dllproxyskel.zip4 u; A% B0 Y  s( O3 D

' Y3 \& {- A& X; {" V( w8 v4 e2 V( A2 I. w 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。6 t5 L4 J+ L- k( e7 R  E6 F6 O4 A
 但是比较复杂,我暂时没有时间仔细研究。$ C5 \' [: n* a
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
$ f$ `* g- r9 _9 `$ X 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
& X! r9 C$ ]2 Z1 P+ Y! b2 q    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
2 z2 Y8 U5 y+ c4 I, C, O打不开页面,我搜索看看
$ Q1 a/ X9 A& D: K2 ~/ W-------
) X/ b8 l+ Y4 L* ~: E, ^哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号: [5 f/ p2 |4 J1 V
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
/ l* b6 a" H4 x& S通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
0 G5 u& Z# M3 `# u6 K3 [  {比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
6 X: v: p2 P( h9 J* s! t" l
4 C6 ?# v: n% ?: n4 O命令行输入
" P7 Y) |1 O' ?  ~6 S4 sdllproxyskel.exe <input.dll># x" J4 p- b/ T% X1 K8 h
- open file D:\\项目\\dllproxyskel\\input.dll
" x5 ?9 U3 O; r3 w( l$ |; u0 R  
0 o6 W9 u, S# o2 v% b8 T- z/ D' @. A' X
------------------------------------------------------------------
2 V- p; B1 r: m/ P我们需要额外添加的代码
, \; C! x* ~* l, H# F3 a#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
* ?2 y* [8 k, d* t//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
" S1 g1 t; d& T4 h4 p//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
- Z% x$ Q, j# o5 B0 G, yCALL_FUNCTION2(BOOL, ExtTextOutA,) K6 M; @/ w9 d- h
              HDC hdc,
3 R, d/ V5 a5 G, r* E              INT         x,
& G5 p( X; [6 X0 I; ~/ N              INT         y,& t5 c0 C8 Q, |- q# o
              UINT        flags,' a4 K' N) R6 r
              const RECT* lprect,$ Z. ^- e  F; Z- A7 o
              LPCSTR      str,
' k, r1 w% H! _4 q6 ?2 b( b/ o              UINT        count,
% V3 z' M6 v9 [0 r              const INT*  lpDx
1 e; e8 g: Y0 d& ?) {
3 K) X* |% p8 H3 H% g    //这里可以做任何你想做的事了,HOOK成功
7 X$ C' `9 x0 U) ]    outputdebugstr("HOOK ExtTextOutA suscess!");6 e; F" p& C8 H  I, W+ `
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
  h7 t! [+ H$ ]9 q       return(result);
6 Q3 p. p& k& {4 G0 M}  f( \4 z* P( r

' \4 }; U: {# Z2 z3 g7 Y注意,生成的代码需要用gcc/mingw来编译,) L5 H3 [1 r3 J; ~% f3 n" F3 L- M" _
主要是因为其中使用了gcc宏扩展( W6 j9 K$ W- S; H' b" s3 n9 j) m. y* b
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
8 D! A) w8 Q7 a4 ^8 W#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\. w- K$ s1 N% H& i
        void CALLING_CONVENTION  FUNCTION_NAME(void)7 e% k4 P4 x9 [0 g( c. F) `
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\0 t7 J1 d8 L  g6 |
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
- W* e" @  C5 o  r7 r. m/ m        PROXY_FUNCTION(FUNCTION_NAME) { \\# `" q+ F! c$ G4 J# D) l
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\/ D% z! o# I4 O) |! X- a9 T! h
        }2 X5 j+ Z6 |  R: N9 [8 K
#define CALL_FUNCTION(FUNCTION_NAME) \\
' m$ R" f& w/ F- o! M7 a  b        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
. U7 x6 Z# P) G4 q        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
2 Y' m% ?  o! l' s) V$ m#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\: j/ J2 h7 I* y+ H: U* D4 G: S
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
5 x# }, h  V# q) {( K6 C        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)3 k9 c' |6 j5 N! m7 e$ @: B
( k' o- G% u6 d+ v' j; W
' x, s. e' x& ^) `8 z% p
等我回头翻译到VC里( D/ D( [: z0 R2 A" A$ M/ c  P
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
- Z! s. `) y: f: _! n5 V) |那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
; D2 D9 t6 X7 r7 y3 w# j: x  W哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
2 k. E. J4 O( J4 L那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

: b) q3 z$ v1 J: Q  n- Z7 D* w$ j! @' c- M1 @( o. C4 U
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。  v8 M; {7 M) Q: U
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
, [% L/ U' t' y3 H1 ?/ {7 `* G/ N. b& z9 S( a. X
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?! ~, B* A7 |8 d: i& n8 o
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以) e( N  `' H" O6 y3 ]

9 s4 v* Q# K* w# n; o4 j这个我可以试试看,蛮有趣的
* D8 P; Y$ \+ A% B/ m是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,5 J) `" g% z; _
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,9 y  E5 k+ l3 g6 L5 R
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"/ b  R: n& ?7 o9 l8 B
( F: [) p: l' u2 |- z: u
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
$ Y; i7 c' T. l' u4 K; _$ O5 T+ ?哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 * a% k( ^" q0 G7 m
$ k: S3 P8 b# {6 p: c0 N
这个我可以试试看,蛮有趣的 4 d" K; _! d* `# \( v) h
是用hash链表把中文字"归类"吗?
  x; U5 `* Q, k% G) g5 \: K0 [1 {. m7 c- }, ^+ V8 c0 k
.......

+ v& q" W" F/ z* I. t
2 I9 ^( c% s/ H: c) ~5 C" x最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了9 }+ `4 N8 w3 v8 \
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
9 _: Y$ K0 T5 |# z7 p  h2 h所以无法通过 #define _WINGDI_ 来取消重复定义的问题, s% R: j! E: Q7 H0 L) W2 I
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout' ?' \* b: Y5 C" r! S- ^
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
4 q9 n1 O1 O# B如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦5 d( X$ v8 Y' Y6 k! T' q

2 J0 h4 o& O8 F, c* y我想的解决方法:
5 P  B; H4 m& p& i; a  p* f1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
& I2 E9 l' s  M( K8 e/ f2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
! b8 x$ O: e& b5 l: f" z    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n* F0 d& y* f! U% q( M
         DECLARE_HANDLE(HINSTANCE);& _* n4 S, B9 i! @* x8 o+ h
        typedef HINSTANCE HMODULE;; _6 t2 {# K8 W6 n6 M
        DECLARE_HANDLE(HWND);
3 C- k7 t0 ]; P2 h+ I9 \  l        #define LPVOID              void *
% e7 \: O- @( d# k  G$ R        #define DWORD               unsigned int) P) ~7 j" A+ B$ R. U1 p; F
        #define UINT                unsigned int
" s$ n7 o% M1 x$ \7 m        #define LPCSTR              char
0 o. q# r) ~4 W  s# z# [       #define LPCTSTR             char " R8 |- l3 @$ p+ B) f
       .............像这样用到多少自己定义多少9 B; Z. U* Z" j* z5 h; E

) r/ g+ b/ Q# h( ~3.改造def,使用函数转发器
; h' V7 H! q, ~* I/ J9 T0 {在.def  文件里转发,2 F& ~2 K! e/ |4 E
EXPORTS: h& A. x0 H' s  ?2 H
  AbortDoc=myAbortDoc @1! f7 {9 N' a5 P' t. S9 `3 t, e2 W
  AbortPath=myAbortPath  @2& w0 E) H7 d/ p8 O0 f
  ExtTextOutA=myExtTextOutA @222& ~. u& t# p% l9 V6 `, G
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
* Q$ [4 E+ ^" Z3 _3 v你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了2 M2 i/ T9 ]& [# @1 [

4 D( y; Z* b3 a4 R9 U/ X算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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