三千论坛
标题: 初步了解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& w第1步: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+ F8 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 |