三千论坛

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

作者: 异仟年    时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 % p9 D/ W6 ^- A
& l' T1 Z2 W3 A; D: N/ G: W4 P4 J
编写需求条件:
- A3 a, ?, W: o2 ]  A# ~
$ ^7 N/ [% n2 A& H' l  {- [! E: w4 y    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
6 f! O$ f0 u% b  p6 U; F; g
/ d9 Q& j- U: Q8 N% ]. x3 S: d
" p$ _3 K- C0 A! @5 F( v编写过程$ ^& h) u, I6 e* T3 S( @, k

* s" n- b, a5 E& w1:8 A6 C& m( x- e+ A

5 |1 m, _4 e4 H/ e$ D8 Q% \    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
! N" @* W/ M7 }( a1 w0 f
7 A  s6 \4 T" w2 G0 I$ p) O% B& J2 \! E+ W% Y
2:8 [1 P4 G! R4 r& c: d

% b+ V# q% W$ h, I) c& a    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
" l3 H, F9 h+ r
& b9 B* ?9 \: ]    启动客户端进入游戏(后面要用客户端)
) f- R: C/ \: [4 k- Q2 c6 `: b, U% R& L. r# g! Z/ n& R! W
    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
: `& b: }7 G" {% B, o
: }+ @5 p+ v( G# H    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 9 x0 i) y8 p$ M4 z6 U' c

0 [* Q1 J* {  q    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
: D" o7 D$ W4 b3 H3 _6 H
. K4 J$ N* y+ S. J# t, g/ b    od停在
# x0 e, n1 h4 b# q2 ~9 z; M4 W# x3 Q3 T$ b0 D. I
    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "* r. q- o! k! ^: O  J
% q' P% J0 B0 ~
    双击这一行 再次看到od定位在汇编代码显示页面) {. N0 ^5 r$ u% G/ {* Z
: p- y. Y( \- _  E1 R

$ O1 q: S1 I- F. W, m6 @4 Z9 l        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " 9 V  q( Z3 A; [) L* u0 ^
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                
3 w5 v* I& p4 W4 v        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容
" t1 \; A0 m' y$ [; @        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用( G! [# k5 W' P1 C$ |1 n4 h2 A
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        
: q2 g0 n! I% s% Z1 _+ P        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB8
- T  ~4 Y, j- G/ W) p) o/ v+ l+ R  y" p3 c" i3 X0 N: e
    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
" U" b. e3 U- {( `( I7 l9 L0 L. {    ; a! X" _8 n8 }" f7 k
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
' Y$ b& W$ t& f1 S+ C
( d# I& U/ i, n6 [$ D: _" y    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩4 o7 V  ~% G/ D
  D" D$ E3 D: y8 ^5 ~, `
    同时发送数据给客户端4 A3 u/ o" u# L2 D
+ ^: A! L) H- c: x% f5 N( M
    , p1 L' q* X" W. ]' ?
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过( W+ a. e/ k" X7 X+ Y
  
; ^1 P) f$ f, f9 L# F        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F)
, ~7 U5 J: }* l9 D; @  V9 b        0053BBFF  |.  0F87 41020000 ja      0053BE469 A/ [# {, `0 V2 }) l( W( {
# ]4 s3 b$ `$ A; {
    eax 这里是3 一路F8比较下去到下面这里
& u& q# L" X" {8 r5 e  Q* [9 ~- a& t. V/ y$ k
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC# b" I$ V) [( P
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
( m5 i. B2 g/ d; t        0053BCE1  |.  66:B8 1F00    mov     ax, 1F
0 L; f- [. J# @/ s' G. O        0053BCE5  |.  E8 EA54F2FF   call    004611D4& C! |8 c( t" W( y, J
" c. P% z- H4 A* D6 R6 v7 A
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数 $ b" h1 N& L0 A" b% |& A* d) W
   
) P: e7 q* o; ^+ Z- b- [    call    004611D4  就是调用 winrgb; C7 A5 d; {/ R0 {; }

+ ^: \8 q7 t& Y8 P
! p- u# p! x7 n  I8 P/ Y& a上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
* w  {7 e) q2 c

+ ~9 v5 s( N, Z
    dll里面进行内存地址读写
8 z8 H# a# c! A8 K

2 V1 U  p$ N8 c+ K
    我是在
) Y7 `- T$ o6 n8 M- d. N/ s
   ' p/ l  w6 \" u7 J
    0053BBFF  |. /0F87 41020000     ja      0053BE46
9 j8 y, ?0 G; b
) }  @. o8 l8 P# w5 o! h6 ]9 l
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写" X% C. G9 e$ t8 K) K2 P

& ~- ^3 }' W0 D4 A. w. y) Z
    procedure InitDll();+ T! j8 x3 S3 \- ~8 I* ^0 i2 A
    var
, s, Y) ^5 I0 q1 X2 J
      p: Dword;
, z9 j( f! L0 f5 R$ m9 R, z- H
    begin/ B4 l7 N5 c! A5 v4 p; S* h
      p := $0053BBFF + 1;$ U5 T) u$ X+ ?1 k1 a
      PDword(p)^ := Dword(@proc_0053BBFF);$ V9 v3 o2 W% _  }+ e
    end;# b* x2 \1 t2 [* R# Z, v# a% |

+ Y* F5 n/ R/ k4 E
    在自己的代码里面写一个色彩增加的函数判断比如/ n$ R6 z6 ?9 a

* C- [0 z# J9 v& N! S
    delphi代码:
$ \3 g" z' j! `+ X' H
% ~7 [' X$ N' [
    var
2 w( D0 F- y* f. B3 K5 a- ?
      EndAddr1_0053BBFF : Dword = $004F470C;
0 @) K0 C$ O! h- z! q% p. ~
      EndAddr2_0053BBFF : Dword = $004F44CB;1 `3 ?* W+ J- s' |
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转% L% L+ _' Y7 u1 _& ~
1 X2 j" ~; U! K& y" M; U5 W
   CallAddr1_0053BBFF : Dword = $004611D4;
% `$ H4 W: e1 ?. V- k
      CallAddr2_0053BBFF : Dword = $004611D4;* Z* H; _" [0 X. V" V+ n
6 \) ^1 s: S$ N" n6 {
    procedure proc_0053BBFF();
  w' g# g. ]% @" W  D) }. m# b
    asm& q; V5 x( L" R. N+ k+ T
      cmp     eax, $10                        //与预先设定的 最大17比较
- J; S6 m) Q* O& F% w; D
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
4 C3 p3 \% _* Y7 r* R
# _, V' q' i: I0 ^1 [1 b7 ^' L
      cmp     eax, $10                        //比较是否等于16
! o4 w" ]$ S* c5 {: Z0 Z
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分2 j0 }* @) [: L1 u

% X  y) g" e% h  z+ q9 y
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试# X- @# b- _4 I; l9 ?. ^
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% R$ b- j" b. ~7 a" [
      mov     ax, $A& r4 r; Q* W( A2 b8 O
      call    CallAddr1_0053BBFF' k: I/ _4 T% u8 ?% R9 g& l4 R
      mov     edx, dword ptr [ebp-$14]
: \2 m+ R7 s* f, p4 V' w) A* f# R3 J6 u4 D
      mov     word ptr [edx+1], ax
( M( w' G# {; U0 Y/ B& B+ F
8 T+ r3 c: c2 y* @4 x3 ~  {( k
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
6 v4 n; N0 w* i! e3 K9 Z) v
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF' [& y3 y; I( U$ \# M" E
      mov     ax, $10
6 o5 Q+ s1 p# B
      call    CallAddr2_0053BBFF# j6 C4 E  G+ t# `1 i. P
      mov     edx, dword ptr [ebp-$14]$ b0 H: i7 T; Y
      mov     word ptr [edx+3], ax; K$ Y) [9 [  d3 e
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
, e4 m6 s. H1 |3 c5 v, t. _

9 ^9 H2 `3 O1 V% |1 q
    @Seventh:# G, m3 |( ~+ _4 w: u
      cmp     eax, $11                        //比较是否等于177 a4 p' [2 n$ X; g7 [$ o7 U1 |/ _7 b% `
      jnz     @out                            //不等于就跳转到默认部分
, I" a& @2 F* E

: x- D' m4 b2 G6 o/ l& y
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
7 F# [7 g! R* y
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF& n# |1 h; m# v& u; S# m) R8 g3 t
      mov     ax, $A$ H/ y" b) }$ z1 |$ M3 I! A
      call    CallAddr1_0053BBFF1 \9 q; z7 T8 ~
      mov     edx, dword ptr [ebp-$14]
6 _! Y& s, p( [2 l
      mov     word ptr [edx+1], ax8 X* |3 g6 e+ U$ Q" z% ]% y% r+ L0 w0 ?

0 e# s  s% ^* u. l
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
/ l! D& Y) `% G0 H" m; P
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF. T  o3 _+ u- g  L8 y
      mov     ax, $10
7 v$ J2 H/ E- V) ~( z
      call    CallAddr2_0053BBFF$ w) V. B# K( z; ?- [) s
      mov     edx, dword ptr [ebp-$14]/ s" Y% `+ G" o- }! v, [
      mov     word ptr [edx+3], ax. x7 e& z! F+ P
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
% Z& g2 n# c: _
                                               //
$ T# @- z, H. n* O9 ?5 J! J
    @out:
" {) f/ G" N& h! y, ~2 b
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点# ]% Q% s$ J% O4 Q$ n9 P4 u

3 i5 O, }. E( m: f, @0 \) i
    @OldCor:
/ b: f* P( \. U1 t' W& A
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值( t1 ]  ]# \1 Q3 c
    end





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