三千论坛

标题: 初步了解tgs插件的写法 [打印本页]

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
4 }: Q3 N0 _( v# f* F
7 L9 I$ m1 e8 |- X- M6 d
编写需求条件:8 c# i4 t9 x1 b* D: M5 o4 m, u
" t& j, u' E+ W  t4 [' f
    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)0 r$ }, V! @6 X
1 [2 N$ F8 H1 [, v* k) E# ^1 B
% }- c* ^/ M3 T  t# x* E/ F
编写过程
: |$ ?5 {" Z$ T+ o. i& }
  J# S+ }& E. C. T' B: U1:
4 t& W2 Y/ \+ D' v( L
  u5 [* A# ^3 q( i& z    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面& [  y1 X- U( V3 f4 \+ p, R

+ J* n/ g+ G+ l3 H- Z) @: v+ I9 A9 V, ^4 B
2:2 N, ~5 i1 h" z9 z6 b

( p& |8 F6 t1 f8 _    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序5 o4 ^! N* [* D1 L# ^3 _6 p& n
* U8 c2 T0 C+ z- V! q6 N2 w; _
    启动客户端进入游戏(后面要用客户端)2 e0 E) e, c6 F9 \

& D9 ^& f3 ~" A& ]3 o    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe4 N/ P, R& e1 a% _6 o/ r- O. L

  N! z" V, c; Y2 u    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 ) W0 ?4 S" R! _" O+ e
' i( I1 `  |- _$ }5 I1 Z
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到& }: y* A( G: F, G1 r7 l
/ @8 r/ y+ ]  A3 u8 o+ d  @
    od停在9 V, S. ]; c& ]0 v7 l

+ v, G8 N" D2 `/ H    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "
* E" D6 A8 L2 f: b5 A) j8 Z2 F% A& l* H7 _
    双击这一行 再次看到od定位在汇编代码显示页面
% D, a' v4 c8 C- B) Y+ D- j4 f: r4 \4 \3 H) @. t, a+ T# b

2 b! h+ w# l7 o8 v; C        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: "
  a# W. a$ Y- @: n- Q3 C% ?8 |        0052A0CC   .  E8 C7A5EDFF   call    00404698                                4 X" Q# s) ~8 Q2 w0 p7 @
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容0 C' B' @) @. ]+ U% h
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用
( Y6 \! z8 E: o, _        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        2 l) F' n" S% @) l
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
+ u! u# c/ {# y* I2 F
3 V2 Y9 G3 P4 q# f8 U: q% y    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
1 x5 P& I8 Y% w    ; I. H& x( \2 [# L
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
3 ?" W! m( s( ]9 q0 }; ^: N( A* v$ [6 m# g4 p
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩& {) d1 `0 Q. v) M6 s, X
, U' ^6 E$ v0 w. V( H6 M+ u
    同时发送数据给客户端- k# @6 Z2 k9 L' h2 \" s* d9 p
0 }$ c1 ?; ^  H) q. J( S
    ( ^3 c' `# j* \0 e' G  n" c
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过9 l0 L! ^3 D2 v3 i
  
4 _- Q. W! r! k- e        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
* d- K; E: J" `9 n; \/ x1 S        0053BBFF  |.  0F87 41020000 ja      0053BE46
3 k* C# E& W) K# ?  P( l4 S/ g, l# N( ~) V8 s0 W( H
    eax 这里是3 一路F8比较下去到下面这里$ B9 b1 S! |: U* M. g
% O4 U% J  L* e$ [7 n* \
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC
) C' u; |2 ^6 C1 R        0053BCDD  |.  66:BA 1F00    mov     dx, 1F* J3 v- P' D, M8 q7 j, p
        0053BCE1  |.  66:B8 1F00    mov     ax, 1F0 P- _% \- n5 @" c( A
        0053BCE5  |.  E8 EA54F2FF   call    004611D4% u& I5 I- e- t$ a8 F2 h
. P0 f" P# y: q3 S) _
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
8 q+ b" u# @3 O6 f$ ], b) H9 u   
3 z8 x4 q1 O2 ~. f( C) U! {2 ^    call    004611D4  就是调用 winrgb7 _5 w0 z5 W* F/ J+ h
1 K* m+ }# N' D) o, L9 l2 Y
( b# J/ R" ]6 ?' P  P* B# ]
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
8 j4 ^& s& s1 C! P& e5 ]& t
9 M$ M, V* x# E! Y$ @2 V1 l5 d1 ]
    dll里面进行内存地址读写' |# A" z  J1 n8 y* A

+ V; D6 n; o7 v% X
    我是在  H& p: t& B" ~8 i% L3 z* D
   
3 G5 E' d) |! D- l0 R
    0053BBFF  |. /0F87 41020000     ja      0053BE46- ^) F# c# R4 W' k7 d, f

' Y- L3 a' B* t% F* }) @
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写( t1 i/ c7 N8 L1 X
" }: u  x0 m8 E0 A( d
    procedure InitDll();0 {9 _* V7 f, L  ?) ]8 U
    var
  W% o' J: l! Q( S2 N& [3 V  O
      p: Dword;
7 I# O) z% h  E3 I. {' `
    begin
4 B. a) ~: t6 B4 ~" N$ `' r. h
      p := $0053BBFF + 1;( i* N- P7 `' S) ?0 z) j  f5 ?
      PDword(p)^ := Dword(@proc_0053BBFF);8 ]# J* s7 ?$ M& o2 I! S! z- S* I
    end;
$ I  W& L1 U; s

  b; q/ y( z7 C
    在自己的代码里面写一个色彩增加的函数判断比如: L2 C( k$ m; D7 \) {% h
3 ]) H/ a1 X- j1 e6 q
    delphi代码:, ~! |% k$ {- A6 U9 T
8 ]- z9 V3 h  O4 }1 {0 H
    var$ w3 W! b/ i, n# u* s
      EndAddr1_0053BBFF : Dword = $004F470C;
* {) S0 P, I2 H
      EndAddr2_0053BBFF : Dword = $004F44CB;
, s5 Z* R# J. {( T# S+ @" ]6 ^6 |1 ^
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
" v* F. ^& R1 A  [7 g; R8 W

- U; M) K/ m7 B/ |  v$ C
   CallAddr1_0053BBFF : Dword = $004611D4;
6 ~  n- C6 g, n0 x7 D9 _9 W1 M4 ]) q
      CallAddr2_0053BBFF : Dword = $004611D4;
" V$ H% ]- b# m4 }1 u# k- I

. `& V1 j' I/ x! L8 K7 @0 e4 U6 F# B, d
    procedure proc_0053BBFF();& {+ W* d1 @5 |3 _6 x8 I/ M: u
    asm6 x1 \, x* |; v' k  U  B
      cmp     eax, $10                        //与预先设定的 最大17比较
2 [& w* r0 x# B; Q$ z* u+ P# g
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值3 A# k, S- e: {' F- [8 O+ w
- a# U0 U$ S- T# |* I7 x9 d! z# M
      cmp     eax, $10                        //比较是否等于16
% d2 v2 Z  |% k/ w6 O1 K4 M
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
; a. h# y, I1 l7 ?% _2 }( ~, F
7 m: |6 [7 ?8 U2 o! o: T5 i
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试9 ~' A2 g1 p" F. g% V. Y
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
9 H% w& |' A" j* J# @
      mov     ax, $A. u3 G$ h' N* A' G# b" x* q  ]
      call    CallAddr1_0053BBFF& W! u6 d. C0 f: f4 ^
      mov     edx, dword ptr [ebp-$14]/ H$ m$ S- q: U( f. F8 [
      mov     word ptr [edx+1], ax! f4 C* ^* E1 q* o
  G% e7 d' G! E) N1 i; V8 W, ^/ f
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试; H+ |# k& M! h
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) {* K% ~: M: p
      mov     ax, $107 g  _, f7 _# `( a3 b
      call    CallAddr2_0053BBFF
! P' ~: O( n+ A+ {6 _
      mov     edx, dword ptr [ebp-$14]
& _8 I0 j1 o# R2 ~* f4 _- K# n
      mov     word ptr [edx+3], ax
7 T. }" V( n" @3 t5 l1 I2 f
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs, L4 U6 @8 v% h
$ F/ d8 r4 Z4 g3 m. d' W
    @Seventh:3 y2 Q4 \* W% H& W' t
      cmp     eax, $11                        //比较是否等于17
$ d! n/ P% l, ~4 A1 O* F
      jnz     @out                            //不等于就跳转到默认部分
2 b5 p. {( C/ W$ N/ m
5 s, y2 ~" W, ]& V3 s1 y6 @7 r3 O
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试; V. q6 E% w1 @, z) |9 ^$ c8 v; u& s
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- p# ]  J: c, x' Z+ F8 s. t
      mov     ax, $A* V0 r( `7 b% l' ]
      call    CallAddr1_0053BBFF! P  \* g: U) n8 D2 C& w
      mov     edx, dword ptr [ebp-$14]1 @$ K) a# L0 U; p2 {+ W8 L3 [
      mov     word ptr [edx+1], ax3 |/ G1 v9 t  m! D1 G3 H9 X3 M

5 _! f& O  K+ o/ f0 S0 V
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试6 s1 k. k( u3 m( m7 }. w
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF$ ~! m- {2 }2 p- @1 y0 \8 B% z/ c
      mov     ax, $109 {6 r: \$ P/ @2 [+ U( h
      call    CallAddr2_0053BBFF; ?7 C7 A  x' [. S
      mov     edx, dword ptr [ebp-$14]
$ M0 W. d1 W; i7 B; R; N1 B
      mov     word ptr [edx+3], ax6 Q% ]) f4 U3 L' Z
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs1 B- K  u' x1 `# g1 p
                                               //
, Y6 w7 Z$ g  s+ ?$ ]
    @out:
4 x! \! r1 W3 v
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点6 Q, p& r' ~& g; Y8 Y

$ d1 }) X9 ], S+ b- C
    @OldCor:, A0 L& R% a! Y$ a! I1 p( B
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
: h/ w! J5 y' O
    end





欢迎光临 三千论坛 (http://3000y.com.cn/) Powered by Discuz! X3.4