三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑 / }2 V8 C& \- j. d: d5 }8 G6 j/ n1 C
$ w' G: b( b9 K5 e4 U
编写需求条件:
& Y2 F# ~: Z6 C h) L8 L' g8 q3 B6 Z6 E$ A8 v) z
od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
% A/ J8 C# q9 o3 a& `
( _; d; J! L8 [) ?$ b0 }, l9 J2 O) R/ n/ j9 n- c9 ]! c
编写过程
8 T% \2 P5 N$ `/ x
/ d( }8 o/ K7 d0 A. X, Y8 ^2 @ L+ M第1步:
7 t8 g4 m r4 S% }7 u
2 n$ h4 J3 D2 N- u 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
% P+ _" u( ]+ _
2 }; u) ^ u( r. U5 P. j6 ?
3 ], t* |8 }4 @第2步:
4 J4 j+ O5 B1 U, X' h! J! `5 |
|( j- v) w- `) W$ p' p( P1 Z; I 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
. h! d3 u/ a+ A% s" Y" X" J% @, T0 O/ f' c
启动客户端进入游戏(后面要用客户端)5 U* f, M. h% s( n
' ~: M. M# L. k- H7 O9 v5 f. y 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
/ f$ ^0 \+ q+ J. P2 R* n
" h3 l ]3 D! B 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序
+ P+ c J _6 j1 G! s/ U
0 w& f0 q# Z0 |' o) Y3 E* h0 ~1 P 提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
1 ~) s$ b1 r% C
2 B9 @ _* U) g. R od停在
) Q6 ?* Y' B3 n, N5 J z1 Q8 \' y2 {$ T$ S
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
! Y) _1 G. `1 e; V
6 q! ~3 U$ R$ x- @; r) F7 Q. g 双击这一行 再次看到od定位在汇编代码显示页面/ v& o B, p& P) e
% Z* y; d& D( v( p
' d9 y# y3 G1 F( s4 } 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " 0 g1 _3 ^3 Z+ h
0052A0CC . E8 C7A5EDFF call 00404698
8 v+ U# g* i) |9 W; \ 0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
7 S+ K+ }4 T5 w+ G 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
+ Z& H3 G m* S9 @ 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 4 Z* Y7 Z0 V( b' O
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB85 Z: \- L* T7 v! K' G2 o6 F3 |
9 F& m& c, h7 ]# h4 f( o6 ~
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
1 R" m ?% Q, x- ?6 Z/ r5 r, u/ c
! q; _8 W2 j/ d4 _* [ 这时od会被中断, 断在刚才下的断点处, 这时按下F8
, y" o2 s9 r1 w" S! B* |) Q% Q
" v' v: p' P$ n7 z# U& N4 d) \ 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* f/ I9 J' o: b! W9 T
/ F& ~5 z6 ^' m9 X8 j* V" W 同时发送数据给客户端
( F6 p1 j: M2 e& P/ V* P9 S
- ^- M4 D9 }% o - ?: A* x0 Y3 N% P' T- f
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
! z& Q* n" n, S! J 7 ~) J' j1 i4 z: z2 y
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)# M* Z+ W8 J& C* v+ \5 M8 J
0053BBFF |. 0F87 41020000 ja 0053BE46
$ w% W" x' h) t4 Y: x, Z9 B
3 J |" q* u' u0 K4 _! |6 l: V eax 这里是3 一路F8比较下去到下面这里
% [5 X& b4 D" e! w% O8 _' ^ P
1 z9 x- V, O+ e1 e9 T0 O 0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
2 D4 B7 e7 C( ? 0053BCDD |. 66:BA 1F00 mov dx, 1F4 l' d8 Z& a5 E* ]' j: r* y7 h) b
0053BCE1 |. 66:B8 1F00 mov ax, 1F! d8 D$ Z1 e& c, g2 q
0053BCE5 |. E8 EA54F2FF call 004611D4
* {3 F% t6 Z& I, l
2 j8 u; m1 O+ Z- N1 x0 u* U2 h" S 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 ' ?* l3 U# P2 @0 G2 J' W* |- S4 h
' y2 U3 }4 Y1 ^- f8 Y call 004611D4 就是调用 winrgb
6 H7 z9 _' N, G' Z
3 J1 ]+ i8 K( t/ L) @( B* Q i" ~2 p+ X$ m! X- i) _/ t
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在6 V% b# b/ F! j6 g5 O
/ O' H' r8 |: g' l1 N! b
dll里面进行内存地址读写* U8 Q1 F. Y1 @4 t! }: i' y$ |
. D5 [' P2 j$ M' a9 B+ B" y$ D 我是在1 h- M5 I# D) r% a/ d' R" n
) C$ d( ]# D8 B+ j0 X 0053BBFF |. /0F87 41020000 ja 0053BE467 U/ ]; d: I8 Z% V+ p
# N+ E# ]% J& E8 P+ p5 c' I1 o
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写% E% J' H) r' d$ O& l( @- s, e
~2 i2 u% B9 e' z+ k# t procedure InitDll();. \- ~. ]' F& P9 y5 V
var1 e- [* n" i$ P3 \: e+ z* l
p: Dword;/ s& o0 C# n4 [
begin. \$ e3 N4 _. A0 a
p := $0053BBFF + 1;3 \8 w5 K8 ^6 U: ]# @
PDword(p)^ := Dword(@proc_0053BBFF);
) v" a8 `2 r% E9 ~% F m% K end;5 P+ p+ }9 V9 M
3 ^& ^$ P% v4 ]- @5 I! A
在自己的代码里面写一个色彩增加的函数判断比如* T9 ~5 H5 O' c! V5 b
) p; y# i+ J+ o5 I delphi代码:
$ b& e5 Y& b( S1 q
! g. s0 N1 F" S1 M+ Q4 B" _( R var
! t. Q5 s+ t, h7 r EndAddr1_0053BBFF : Dword = $004F470C;
! d9 v) A* S2 a X. A4 \ EndAddr2_0053BBFF : Dword = $004F44CB;& `; R4 I0 Y- F6 z8 G
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转: w% e. u( q% E' f1 W7 g* L
% X3 r8 r9 I: `, s
CallAddr1_0053BBFF : Dword = $004611D4;
" q% @! ]% g8 G* a CallAddr2_0053BBFF : Dword = $004611D4;5 [( H q, k2 a
! d! z* G! `% q
procedure proc_0053BBFF();# E6 E0 w+ l$ T* m, k, z" o
asm
" v9 T8 D$ `* L; c7 N7 K cmp eax, $10 //与预先设定的 最大17比较
( g# j$ R @; j1 F; q9 f( Y JLE @OldCor //小于就跳转到默认16种色彩赋值( m0 Z' f/ t( k, c; v
7 W' }# K6 H6 Q/ }2 e5 J* r! Y
cmp eax, $10 //比较是否等于16
- v! {5 ]0 X9 L jnz @Seventh //不等于就跳转到第17种色彩判断部分
( Y6 C, g7 _6 o8 @$ j9 s' m6 \- j8 @! e2 Z
mov cx, $A //字色或背景色? 没有去详细了解请自己测试3 B& c' V' [( e
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 ^* K7 t5 M+ i8 ` F' B3 P8 z mov ax, $A
4 e+ S% Q4 S- m4 V1 T call CallAddr1_0053BBFF* p, s! M* g0 @7 ]5 [6 v8 w
mov edx, dword ptr [ebp-$14]
" o, Q; y) X5 k4 @& ] mov word ptr [edx+1], ax0 a! b( h" Z5 p' V% W3 ?
( ~- Y) T- s) v4 F6 d2 W/ k9 K
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
. Z/ }4 t; M: Z* }6 h mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 V5 n0 ]0 E+ a6 `' i% L1 {
mov ax, $10
W' i% m$ k# n: `+ E& D call CallAddr2_0053BBFF
4 ?4 [; s5 n1 G# {- Z' a+ T+ g mov edx, dword ptr [ebp-$14]
R" x, L3 K9 A4 K6 m+ {' I mov word ptr [edx+3], ax8 [2 G0 I. w! e0 Q
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs/ \: D; A5 E3 W. y2 I" O
, C% ~4 D& I" O7 W4 O
@Seventh:/ Q; r2 u$ g! l
cmp eax, $11 //比较是否等于17; }) e, @" h" Y8 c* i x
jnz @out //不等于就跳转到默认部分0 p$ ^( ?. m& I; `7 v
3 N3 o8 ?2 C: [ mov cx, $A //字色或背景色? 没有去详细了解请自己测试# b" ^" e# O" \5 Y5 A9 d
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" P& Q! E' r- c4 }6 M4 n mov ax, $A6 x$ e' k7 x4 B
call CallAddr1_0053BBFF' D; l- B+ \8 u8 \4 I
mov edx, dword ptr [ebp-$14]
" U5 M' u3 v" E. F mov word ptr [edx+1], ax* a( F V9 G8 c+ _5 i9 g& {
+ u# I, ]% g, B1 T! \* K0 Y
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
* Y5 s+ y: y* Y; \2 c! @9 N+ M mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF; W) O k3 [! ]
mov ax, $10
1 W- G# ]/ n3 z, h call CallAddr2_0053BBFF3 q" a6 b5 H" E/ `1 ^
mov edx, dword ptr [ebp-$14]8 a' k7 g# k( _: W8 _, l4 J! l
mov word ptr [edx+3], ax
" u3 }+ }& k1 I" l" f jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs2 I1 B: G7 T5 q# b* }* h
//( x3 J2 Z! f7 f$ P& v# T; d7 N
@out:
4 u: b, ?# [% r* w) ?2 }7 t \ jmp EndAddr1_0053BBFF //这个是跳转到默认的点+ ~( u% M) V4 _ k2 F- i
6 a9 x/ g, W7 h8 O @OldCor:1 G9 i! K# d! K! ^
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
* p+ n% r* U* p# S end
欢迎光临 三千论坛 (http://www.3000y.vip/) |
Powered by Discuz! X3.4 |