三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
8 I; c. |; \4 B5 t* S0 n3 {. i/ p
o+ R5 l' R6 ] g9 b" {. j编写需求条件:+ ^ M, |% X A+ B- j( X
* p9 r. n: _% D od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
, O; ~5 Z; t p) I* Q
2 `# x D, O0 W( q, g; E1 _/ J1 e$ T, M: }, d% {3 A
编写过程2 n, J& a/ s; D
# [! r7 D/ i6 Q& s" Y第1步:$ @5 G' J& W2 V8 G! z& N k
`1 o- D% ]4 D9 y* g1 h6 Y
用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
/ k) ?/ E; z, }" l z1 R; p2 L& T" w
, E! O- S3 d4 Q* o" z3 h% x8 l- L8 Z8 {0 P/ O
第2步:0 P b- W% S* j! {5 q& \
, [ R2 O1 O% U. H+ I# y 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序, a# v b/ p. h0 L1 v6 r
8 [* p4 I/ _( o/ o6 E$ q s1 W; v
启动客户端进入游戏(后面要用客户端)7 I6 j9 m0 U& K$ V$ {6 x6 k5 p; s' ?* G
# J2 D. m" b7 G* a$ A L 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
$ R \$ H& U) j! d9 S; c- a4 K& m! G
在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序
1 F! N1 d6 O" e$ }: U- l. H8 b6 @* U; p8 ~! H& Z, U
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
! [( b7 T+ A( C$ ~: U5 [1 p5 `- t {# C! I4 E# ~
od停在
* D6 ^2 }7 I% K z' `
4 i! t: S9 U5 { 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "6 w, r) \" G7 N$ X/ d* |
p6 }/ ~3 Q4 T1 t
双击这一行 再次看到od定位在汇编代码显示页面
7 w, h' L) T% d' ?' x# K
6 ]* M, r; T. j, c6 m9 d! L0 _; r& U) D1 P a- B" _8 V w6 Z& o
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
0 W) @& ~. m9 z0 T( H 0052A0CC . E8 C7A5EDFF call 00404698 9 I2 o- C) T5 [
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
8 M* H' f8 J5 c) X. v$ E+ G, f5 v* K 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
# x* R; A: D9 P" K& P8 \ 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
# G, P" G, _; J* j9 b1 H$ h7 G 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB86 E: I2 P$ A. j! g
4 i4 O1 U% H( l2 H6 H3 Y/ R 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????% u, X% B3 F0 {! B" ]- R) L
; i: ~5 u& ]' Z, }) Z 这时od会被中断, 断在刚才下的断点处, 这时按下F8
& g* ^4 ~- d9 N2 C- V4 P: K, V
9 | o6 O+ P- ?* H7 l7 q 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
) v/ K" l/ A- s* |) o" D$ R. I7 C4 l* x, V8 u$ z7 x6 B" ?6 T
同时发送数据给客户端 W+ ~3 t6 s' Q i7 i
% R" v3 A4 ^* q* ] 4 N7 N: A* a, H( B
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
7 t& r# @5 r: U( m h , w$ j& D5 z5 S4 h
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F). b8 O ]- X4 R9 s/ r9 z
0053BBFF |. 0F87 41020000 ja 0053BE467 H' {; b6 W6 A2 u& M5 y8 m
6 h% i* h: ?4 S, Q
eax 这里是3 一路F8比较下去到下面这里
" m' ?( W8 ]3 w0 a$ D9 X& [3 q5 Y6 f9 Y. H1 D9 A8 j% ^* H
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
! F* V& ~ u2 J8 p8 [& o7 c 0053BCDD |. 66:BA 1F00 mov dx, 1F
8 m7 z* F B# U 0053BCE1 |. 66:B8 1F00 mov ax, 1F
' p* J: w1 Q; X9 m3 s [* C 0053BCE5 |. E8 EA54F2FF call 004611D4
, b+ X9 A/ t) d/ t$ [0 ]7 A1 k0 [. J) g& V- h9 m
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
; |+ }) m1 E2 T L+ O! M }4 U 9 \8 {! {' n, d3 F1 U8 H2 P
call 004611D4 就是调用 winrgb
' c. N$ K, i9 E( a) l. U; R3 x; b, y! I' Q- \/ O1 d
5 J. n" K! h' M& O( c
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在6 y4 u! R6 a* x; _' q7 y) \4 e! a
" y- c* N2 J) k) ]4 H+ [ dll里面进行内存地址读写6 Y, H7 W% D: t8 P8 ^8 \. m4 a# A
# r) S+ T& @2 F$ F* n# C o/ R 我是在% X9 r" O, ~! Z9 _/ i5 e2 ^
! X8 y+ b; Y% z: @( g( c 0053BBFF |. /0F87 41020000 ja 0053BE46- Y1 e4 j, y6 c# W5 t8 X: M/ `; M
6 v4 T. z2 }: k- o A% D' h s# L 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写1 V, c5 f8 C, G
# ]( W7 D" ~+ H9 ~; ^: t procedure InitDll();
% v# D% {- S! _" {" Z var0 w1 ]( B& b2 c% ?& {+ ~
p: Dword;# W* t- t+ u- v
begin" s; z) ^3 }! ]6 G I
p := $0053BBFF + 1; m0 \$ i x/ k; |! M# z
PDword(p)^ := Dword(@proc_0053BBFF);
% v3 Q7 p2 m3 u2 q6 q end;2 n0 @6 a. m: }& g8 y3 v
9 F, x N2 F' [2 L 在自己的代码里面写一个色彩增加的函数判断比如
9 j2 h1 c% ?' ~- I
2 x; U3 t6 B2 P/ ^ delphi代码:
0 [1 P( c; U2 ^1 X; P- a, F7 h: m" c' f; ^
var$ Q6 A7 D" f: A& {; v3 a. ~
EndAddr1_0053BBFF : Dword = $004F470C;
0 p9 K3 X( [/ [ EndAddr2_0053BBFF : Dword = $004F44CB;
1 D7 z6 L2 n& t, X4 p& w( N EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
J* i1 s/ p4 I$ u+ R) [: x; V* R+ u
CallAddr1_0053BBFF : Dword = $004611D4;
' N6 h8 a" Z6 c3 d' L5 R CallAddr2_0053BBFF : Dword = $004611D4;
1 [- b5 y! Q4 q2 V; Q7 [) J1 o1 r: _! m
procedure proc_0053BBFF();* m# f1 G3 _+ o' w
asm I: b, O G: y: U8 ?; D! J/ }
cmp eax, $10 //与预先设定的 最大17比较
1 o, A0 X' J5 S& { X9 m JLE @OldCor //小于就跳转到默认16种色彩赋值 Z* d T) f! N5 t
, z7 a. s9 Q6 g8 @- H j; V cmp eax, $10 //比较是否等于16! y1 C. ^* V: D4 O0 u/ s9 A
jnz @Seventh //不等于就跳转到第17种色彩判断部分
- S2 i1 j2 g5 a
6 ?) f4 ]7 Y* {7 L mov cx, $A //字色或背景色? 没有去详细了解请自己测试
9 I' w; c) }3 c# ~ mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF9 k3 M p P j5 D) Q7 c2 J& z
mov ax, $A5 Y+ J, |# `# x5 H
call CallAddr1_0053BBFF
% C9 }+ K2 N2 I: t9 d4 b7 i* ^9 h mov edx, dword ptr [ebp-$14], m# K6 y+ W8 T& b8 E8 d2 O
mov word ptr [edx+1], ax: {1 N Q; _+ ^9 \# |7 U* w
/ _1 f$ }$ I x; A' r5 b
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试8 ?" N; ~ L% U+ p& L! Y! R W+ F0 K
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
. ^" X' Q5 T* O. z0 P- { mov ax, $10" ]; E: Z- N5 Y) \
call CallAddr2_0053BBFF% g# k7 f3 R$ d& \6 z5 t+ M# f
mov edx, dword ptr [ebp-$14]
* z4 I8 ~+ L" B) z8 H3 L mov word ptr [edx+3], ax
7 M5 ]3 _+ C8 b; _ jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
0 u) S9 [- Y& u5 l0 {2 u5 G8 x' B# R" t
' f, s- r1 s$ u* F( ^' v# z @Seventh:6 q' A3 e l+ q# n B
cmp eax, $11 //比较是否等于17/ R% |; ]( ^4 N3 n9 C4 V3 n
jnz @out //不等于就跳转到默认部分
2 Q1 o5 C3 R+ |# B( ?: {6 ]& ?, C3 u6 N- } O
mov cx, $A //字色或背景色? 没有去详细了解请自己测试9 c$ Y$ `6 w- m6 ~
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF l j, E, ~- @ o! d/ z! a
mov ax, $A
- z8 J0 M* Q( J2 M* b call CallAddr1_0053BBFF
# C2 D. M+ Z- u! J+ E4 f mov edx, dword ptr [ebp-$14]( |! m( r9 l4 I2 I) F
mov word ptr [edx+1], ax' s0 S% `: U( s; k8 y* E
$ \; Q5 A* k6 P
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
/ t2 {% B/ \8 l& h( l& i mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF0 k5 p8 l" M y4 Z
mov ax, $10
7 g* U. U9 I/ _ } call CallAddr2_0053BBFF$ _* ?) j% i7 d" }0 J. H
mov edx, dword ptr [ebp-$14]
+ T- h& S T+ J2 B$ @ mov word ptr [edx+3], ax$ o7 k) _1 f, P1 x9 r: n
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs2 m. l# n: P& r0 I3 l
//
+ q/ a! ?" \. E0 J4 a4 { @out:! j6 Y4 r) m& z* T3 w4 P" D
jmp EndAddr1_0053BBFF //这个是跳转到默认的点* S" h' x* E+ M' d" B' B
) H$ F9 P! E M, \
@OldCor:
S# X8 Z4 G; o4 z& e jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
) @9 n0 n" o3 e end
欢迎光临 三千论坛 (http://www.3000y.com.cn/) |
Powered by Discuz! X3.4 |