游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.7 版主
8号会员,9活跃值,2022.09.01 加入
  • 127发帖
  • 123主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

初步了解tgs插件的写法

[复制链接]
异仟年认证商人 发表于 2022-9-5 20:27:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
: R  x0 S6 I. \* H% G4 `3 ]) `) E
编写需求条件:& S2 ^- N! p' {2 b% L

3 U8 k# b7 `# M3 ^4 S% f8 @    od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
8 L* e0 Y% c8 C* p, h
9 S1 Z4 S: N6 E7 k' _
; _$ C% p+ i7 K编写过程
. n. L+ z, o9 o$ }: A1 i2 [
% ]  O, z$ Y* n7 X' F9 X1:
, S  a0 l8 h  Z' {2 N. X/ m5 W- ?
) d" u- y3 C' B8 n  E4 \    用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面7 N+ _% Y. Q- J7 W

8 o' u3 ?, t' C3 T& d  ^' X. V2 N1 L% U3 j; N, |! {9 c
2:# k9 R6 K" U& |0 A
. B1 Z& S% z" Z% W0 M6 }/ l
    打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序/ n/ q: J# ]& l5 _9 ]9 g+ D! k
- L' Y, F: ]9 m  l3 o5 t" d
    启动客户端进入游戏(后面要用客户端)0 w1 m2 m; L3 t

( Y6 X3 e+ g9 q* {9 h( a' i% W- b    调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe& k1 V, r* m0 ?) x! H
. h1 ~# U" A! o; T  C. p7 P7 T, ?
    在出现的界面上右键 菜单->查找->所有参考文本字符串  od 会扫描程序 . R6 R/ @/ x/ m
3 y7 U0 g2 M4 [; ~5 n- B( c1 @: j
    提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
- a) z0 Q0 |$ C7 a
% V2 p; w; ^8 g  Z# x    od停在7 J* ~3 y* W3 H1 C1 \

% q  K0 B9 Q" f' i" w7 P( d" b, D+ t    0052A0C7 mov     edx, 0052FDD0   ASCII "<SYSTEM>: "- R. c* n& Z5 a3 a' i: ?4 X! b9 q
; {0 h/ M- u2 K/ b, t; a5 V1 J
    双击这一行 再次看到od定位在汇编代码显示页面
# c2 B9 M# k2 P' n" \+ q& ~8 N# q' Q7 H5 R+ L' `

3 \, _3 r, J+ Q6 [% W        0052A0C7   .  BA D0FD5200   mov     edx, 0052FDD0                    ;  ASCII "<SYSTEM>: " ' [7 M" r0 S# @; E$ _
        0052A0CC   .  E8 C7A5EDFF   call    00404698                                3 C4 S* k& m& A1 i
        0052A0D1   .  8B95 ACDEFFFF mov     edx, dword ptr [ebp-2154]        ;  赋值edx 为中间屏幕显示的内容* x% b4 \5 D- t! V( k
        0052A0D7   .  B9 03000000   mov     ecx, 3                             ;  这里是色彩的选项 后面会调用3 i0 ^) G7 J& S; z. F
        0052A0DC   .  A1 70855600   mov     eax, dword ptr [568570]             ;  这个是UserList地址 参考侠中道代码可以知道        " J' Z6 ]9 Y; c9 U  e
        0052A0E1   .  E8 D21A0100   call    0053BBB8                         ;  屏幕中间喊话的call 0053BBB81 O- K; R3 a2 c0 E2 r9 |

# ?' v) }( Q- @( t3 [6 F    定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM# ?????
0 y- v  E3 ^3 u8 u: u, v    0 p$ p% x2 m7 u  Z& ~# U
    这时od会被中断, 断在刚才下的断点处, 这时按下F8
+ t0 J  \# ~; [; a1 C. ^2 F9 P, n2 r! y2 z$ A6 I
    call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩  ], N: u/ G$ _! L" q/ N7 y

# ~9 Y5 h6 V# Y0 I7 j* w    同时发送数据给客户端: c' c* ]" o# v2 j

1 w8 n0 t* G' T% {6 b0 }    1 X2 A2 J# }5 j. q( A
    进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
* B8 B$ O+ R4 m; L/ F  
4 j, _5 d! c: [( N" C, `6 D* M        0053BBFC  |.  83F8 0F       cmp     eax, 0F                          ;  Switch (cases 0..F). R% d4 R8 m. Z& Q1 |, [
        0053BBFF  |.  0F87 41020000 ja      0053BE46; H: E$ Y* q" [7 p& H" @

+ @" \0 M' x* p  [" ]  Y* t    eax 这里是3 一路F8比较下去到下面这里- o: B' ~$ i# o& T
/ B3 G& x. B( A
        0053BCD9  |> \66:B9 1F00    mov     cx, 1F                           ;  Case 3 of switch 0053BBFC5 W( w+ Y% f9 L) T: H
        0053BCDD  |.  66:BA 1F00    mov     dx, 1F
5 P' U) i  O( Z% Y' `+ Q7 Y, t        0053BCE1  |.  66:B8 1F00    mov     ax, 1F/ t: K8 q6 q/ y9 w+ K
        0053BCE5  |.  E8 EA54F2FF   call    004611D47 O: ?9 _9 Z6 v+ T* p1 i
, |6 j; V4 ]7 q) D& l* Y8 h6 E  H& R
    这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 3个参数
7 w& J* X- ]4 l, t/ ?' s# P  k    6 v# n' {' W. Q  x
    call    004611D4  就是调用 winrgb3 Q! t% V+ D; A- N" F+ `
  M' N% I# g. o, ]9 g3 `
  O8 E; y6 d" _# P9 q; x
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在, f& e! e7 x9 W% g9 e- h" z: F
/ j5 w( N% k" @4 F/ j% I0 h
    dll里面进行内存地址读写" l! j6 @2 r1 f* S
! ]4 h- X0 T. o6 q# n8 W6 T
    我是在
* k  M. F' |, b0 a+ A- |8 k9 v
   
# Q1 D1 U* O+ }( O! X" ~& y/ X
    0053BBFF  |. /0F87 41020000     ja      0053BE46+ j( |% x3 I, ?% A) ?4 e# n* e( Q! ?
! ^; ?( Y3 _" J; [) U
    在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
/ C: j: [8 ]' L" E" r( h

5 y) B& T* \" |# C+ Q
    procedure InitDll();! Y6 D7 F: i/ Y" @0 g+ A6 H2 h
    var
0 F. J% o% b- l8 A
      p: Dword;( s- i, L2 H3 V" D. K  {
    begin
2 D& z5 ?$ h2 ~9 Y2 j
      p := $0053BBFF + 1;8 ?. c, y( a- A6 |8 _
      PDword(p)^ := Dword(@proc_0053BBFF);
# Q4 H7 C; ~6 |, L* k
    end;+ b6 e# L3 `- C% a
8 |' [' B& J9 B0 k/ v3 q
    在自己的代码里面写一个色彩增加的函数判断比如
& G- @# L/ j* h8 r

5 M: w4 r) \' N& Z; r* [
    delphi代码:3 r7 H8 V; g9 l$ o" i5 Q1 T5 @
1 j  }2 e% ~, ?2 S
    var0 L  \4 g- V7 p. a
      EndAddr1_0053BBFF : Dword = $004F470C;6 h" P: E8 I. ]  }
      EndAddr2_0053BBFF : Dword = $004F44CB;: V, T2 `; o4 Q( x3 e1 Z
      EndAddr3_0053BBFF : Dword = $004F4736;    //色彩彩赋值结束跳转
  B- t$ |/ G5 e; f* e) \* f

% i) l* [  y0 F
   CallAddr1_0053BBFF : Dword = $004611D4;
; z" ?8 @8 B: u4 a# K6 ]$ [6 k; F
      CallAddr2_0053BBFF : Dword = $004611D4;2 v  l) y. l% m. z2 |1 b+ Y; B
# K- M" H' c% X: p8 D
    procedure proc_0053BBFF();0 \. G/ d2 G6 I8 j& E7 }
    asm5 C' G; w4 j! M2 t! v. n. H9 q: K
      cmp     eax, $10                        //与预先设定的 最大17比较
+ a5 g- C/ M3 `& L4 m
      JLE      @OldCor                        //小于就跳转到默认16种色彩赋值
+ T' S4 L' H: U8 W

/ S8 Y3 ~5 m: P$ X% K2 \4 s
      cmp     eax, $10                        //比较是否等于16
4 f8 ^% c9 o7 E
      jnz     @Seventh                        //不等于就跳转到第17种色彩判断部分
6 `6 J5 R/ q: g2 F

0 p' w  }+ x7 K: |7 j2 P
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试  c1 c5 G7 E# V! F+ K2 K
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. f3 c* n! A% K% N3 m# Z
      mov     ax, $A
7 D4 y8 ~" C! f
      call    CallAddr1_0053BBFF- v% L" L) M" Q8 C$ {% `
      mov     edx, dword ptr [ebp-$14]2 d. [8 ?% B  ]2 S3 O8 X6 i1 ~
      mov     word ptr [edx+1], ax. a. ^/ W# H3 ^

- N0 C( l+ n; W- r. s. Q3 s1 x3 K+ F8 O
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试
* ~  c' g% i# U
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
( T. i' B* k3 e" T2 o' x5 [; R
      mov     ax, $10
* \! ]/ {& h( k9 q" _$ f, e
      call    CallAddr2_0053BBFF* R- z/ y) j4 z6 `1 ^8 d# R
      mov     edx, dword ptr [ebp-$14]
7 o) W: M7 e1 E
      mov     word ptr [edx+3], ax1 s$ T- X8 n1 t) \4 b! L
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs
' c) \% B& g9 p

1 f- U$ G$ \4 w6 ?: c3 O$ a
    @Seventh:
' c4 T/ B- H- ~2 H, ?1 X
      cmp     eax, $11                        //比较是否等于17
- B3 u, r+ K2 @5 t
      jnz     @out                            //不等于就跳转到默认部分4 @5 w2 g6 m$ s: X$ W5 W" R) M* c+ i
+ D; l9 `8 h! g1 m) @  n. H" ~
      mov     cx, $A       //字色或背景色? 没有去详细了解请自己测试
1 ?' s+ o+ [0 N
      mov     dx, $A                          // 可以通过修改赋值给ax, cx, dx的值 不超过$FF& [- H8 j* T0 W% {* w( W& x( j  o
      mov     ax, $A
# m3 u9 B5 A; m! `5 ~; n" U
      call    CallAddr1_0053BBFF: [/ q& t) o# @- J" s, n$ W! j$ I
      mov     edx, dword ptr [ebp-$14]
. ?2 |/ z2 a( \1 _1 @
      mov     word ptr [edx+1], ax
: e) g) A$ b, p, s- U6 T$ }

: j+ U, Y+ j1 a* w3 y
      mov     cx, $10       //字色或背景色? 没有去详细了解请自己测试  ]8 s8 w& [0 A. P2 Z# R
      mov     dx, $10       // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
: p2 P* ]. F. p
      mov     ax, $10) d0 t: l* T: s- |9 E3 X3 `
      call    CallAddr2_0053BBFF- [; Z' w5 T, M3 w0 T- n
      mov     edx, dword ptr [ebp-$14]. \6 n, B" Q' k1 X7 z3 T( y
      mov     word ptr [edx+3], ax
7 [& a# E. M% j+ t: o9 t2 Z' E1 k5 c
      jmp     EndAddr3_0053BBFF               //色彩赋值结束跳转到tgs. `  R& ]( f0 \: S8 Q7 W
                                               //$ s( ?0 d9 s2 i4 D* R
    @out:, x( B- I4 _. W7 l* V3 q2 j% M
      jmp     EndAddr1_0053BBFF               //这个是跳转到默认的点* z- r5 \, u% _
, h# u/ H7 M" f2 _1 U) N+ k! a+ a
    @OldCor:* @. |: p$ z) r9 {4 Z6 i7 i
      jmp     EndAddr2_0053BBFF               // 跳转到原来16种色彩赋值
: m1 O# e, Y) N# B
    end
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号