三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
8 V2 R$ Y- k. V- s7 A
; R, z, h6 ^- P编写需求条件:
; ?" d. Y4 y3 Y S2 o% x. L; x5 D3 g5 Y
od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)6 B! Y% [/ f% d9 K! N& ^8 m/ P
+ J9 [" u6 e# c, }2 a9 |
+ r: z. |8 m! x/ Q* |, A" M6 |& W, H3 F编写过程, p% i1 i- H' g4 p
5 k/ W2 ~) `% n& x& p7 O
第1步:
8 i- m t$ _8 `7 L9 P; J7 c- P$ p3 a1 W n
用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面' H/ l! W9 [; y' R& r4 O
0 ~6 [- ~2 [: } Z: e
% m& _! K# \3 q$ n3 y0 }
第2步:5 x d5 {5 A0 Z3 G
4 s2 u; P0 b" N1 |
打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序; X. M: b7 E2 I# s* [
2 k$ c: u: q% q# M \
启动客户端进入游戏(后面要用客户端)
4 h; K, R. S+ c+ ~; ]; s! D, Z3 b# y. z% T- T
调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
8 j, f+ u4 l; t0 g/ i; O4 e
+ ^/ I0 r$ u6 b 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 . z+ |2 J7 ^% b8 W9 c# n! U y
/ X; x7 j0 Q I: k
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
/ g- N: E, g. ]9 @/ `1 @" h$ q( A1 y, [8 B# k- Y
od停在
5 ~. h& B; V' B& @+ @- Y! a( s$ T8 {: n4 X. x& ^, N
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: ") D9 U5 y8 ]% W4 M
1 k5 y/ C; w9 p7 U. H4 m: i& T
双击这一行 再次看到od定位在汇编代码显示页面
8 L% W" C6 {* g8 H2 Y; n/ `4 U' ~, T9 M4 X% i$ V
( g' g, q4 q% l: ~6 q' ] 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " & I3 Q' ?# e6 k% T2 h
0052A0CC . E8 C7A5EDFF call 00404698
4 C# W& s' ^# d 0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
" n( \1 m0 ]. A; H. u9 S# T 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用7 ~7 z" T T! A, X8 K
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
& U! r% O8 L6 Z! l5 ]3 N 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8; B" e) ^8 [8 f+ M8 ~
! f! O. p) L( k& M* R6 @
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????, \1 K9 ]1 u) g3 d8 C
+ T) n, K: q! [ 这时od会被中断, 断在刚才下的断点处, 这时按下F8
' S* @+ x9 k7 L0 h& ~
1 N- X* X& @ I7 _/ w, D0 C 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
( y: n+ H1 E* ^6 x& `7 g4 t' R6 @9 G$ t- f. n. {( p1 u' C* F# ]0 d
同时发送数据给客户端. B; y# r) K# G( X! S Z# R5 M
4 |1 u5 i, A/ s) B, k+ ~( u
& r0 `, \6 T0 S
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过" N d( `$ `" y6 K5 n
% h2 i* V( i+ i" _
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)6 D: W- s% L8 [; e
0053BBFF |. 0F87 41020000 ja 0053BE46( M9 @' o5 r, g" n8 W, Y( K4 C* z
# U+ j4 g! P5 }! }7 v$ s: O* V& ^ eax 这里是3 一路F8比较下去到下面这里
! X5 N) U) O# {$ M- W }+ S+ ?# g, v9 M. B' P0 I# e
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
! ?) K3 w" |, W+ ~" f; m4 H4 M 0053BCDD |. 66:BA 1F00 mov dx, 1F7 E' _6 w4 ?, ]$ H A8 n0 J
0053BCE1 |. 66:B8 1F00 mov ax, 1F- p/ @$ R6 Q: u; ]7 I
0053BCE5 |. E8 EA54F2FF call 004611D48 } [2 y( M: K7 o/ p5 y) j8 g. w
- G* A0 A) c. n9 F' k: N
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
3 T1 H1 I+ d9 Y 9 I0 E9 L5 @+ ~- e' M1 e" x- s9 W
call 004611D4 就是调用 winrgb
' b1 R; c% L9 d. c6 l
2 B+ m w4 I4 d5 r! y2 T
1 L# h. L0 [4 s2 f% \* B上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在8 s6 i4 D2 Z) e' }
6 e: r5 e5 B) u }5 D' ^ dll里面进行内存地址读写. r& D; t+ S4 S# {0 C- F, f8 r
8 d- ?0 u$ J0 L3 {" j* e" z* [
我是在
/ u9 y9 X) O, P% p2 q
! a8 R7 ~& z" W3 f. q- _# ] 0053BBFF |. /0F87 41020000 ja 0053BE461 K3 v5 y( a* s; S4 {- ~
$ Z- ?" d) K3 ~/ d+ B- E
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写& ^8 z! U5 l8 y2 f
; c0 _. o5 s! @) \; a; G+ k$ |9 c8 v procedure InitDll();
7 V( ~# _2 c/ |4 g; S1 ? var
+ M4 D: O6 ]3 d% }8 |) c p: Dword;2 S! H3 t( Z c* X9 i) X, e
begin4 D9 f: ]3 j% ~: E7 N
p := $0053BBFF + 1;# Z$ i; I8 {) s8 ?+ \: h& r, i Z
PDword(p)^ := Dword(@proc_0053BBFF);
0 y5 l6 b1 H" S) ] end;- k9 T* q* F" s* J9 X/ C4 t
. X) u& U# ^$ L) {+ a% V+ S$ O 在自己的代码里面写一个色彩增加的函数判断比如
' K1 t# c1 r* M/ k2 q. M6 N4 C
; W3 S$ Q- u: n! Y% ?/ P! j# E! \( { delphi代码:! P- n5 u2 h$ Q$ v! N
: W+ |8 d3 q. k& u0 E0 {
var
) ^" Z$ x6 Z& I1 E0 _ EndAddr1_0053BBFF : Dword = $004F470C;
0 R* z6 c. J9 X S% g$ m* Q EndAddr2_0053BBFF : Dword = $004F44CB;
a3 j @8 L' \ EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转# a% l9 p- c. x" s
5 C% i' m. Q1 k9 S1 X) P0 U3 G. D CallAddr1_0053BBFF : Dword = $004611D4; a7 @7 g1 |& v) a
CallAddr2_0053BBFF : Dword = $004611D4;
4 p. g) A- x; J/ u0 [ D
0 K1 S8 `% ]7 g* T1 l procedure proc_0053BBFF();5 C1 n p$ p I. ~& f
asm; ?6 i; o5 o7 n7 g; [
cmp eax, $10 //与预先设定的 最大17比较
5 h7 {# I% L3 W _& u JLE @OldCor //小于就跳转到默认16种色彩赋值* E; B" V: K: }6 k4 @# [
: v1 z/ R" R$ Q C1 [ cmp eax, $10 //比较是否等于16' N( h8 t- M! g& W2 s: c
jnz @Seventh //不等于就跳转到第17种色彩判断部分( L1 y6 \6 n: W
3 |2 P3 ~6 ^' b+ E# \6 n mov cx, $A //字色或背景色? 没有去详细了解请自己测试3 t. q, S/ {$ } O9 G9 I
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 ~2 g" N/ x3 l6 h
mov ax, $A
5 w, O, M) w. y3 g call CallAddr1_0053BBFF
# Z8 y7 Y/ W1 O8 I mov edx, dword ptr [ebp-$14]
0 ]8 u6 [% g; p! u6 v# l* C mov word ptr [edx+1], ax
2 p l# B& W3 O- z- d0 p- y
" d" Q6 `) ~% i! O7 k mov cx, $10 //字色或背景色? 没有去详细了解请自己测试0 A; O, t1 ~3 P: n' M. B
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- u6 q8 C" S* r7 ?: C& c1 M x mov ax, $10- K6 m1 f, c- \$ Q, m P
call CallAddr2_0053BBFF) E( p5 a" I# T9 ^4 k# W
mov edx, dword ptr [ebp-$14]) V& P; Q- D0 e5 z
mov word ptr [edx+3], ax+ ?5 C! t! z# @, s+ N0 F
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
3 e: [- F6 ]5 C( j8 o
, d* A7 d; \+ C8 ^ @Seventh:) t* S" ^- k9 |# m
cmp eax, $11 //比较是否等于17
7 ^6 k9 X( E8 [ jnz @out //不等于就跳转到默认部分; c1 B+ n: \5 F" }9 a
8 J- d# s7 b( K
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
5 [' e* C' |5 R% M6 `" c* V mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
' h3 c+ ]. v4 P5 J" { mov ax, $A
$ J! n5 u/ `% ?- d( s2 O% C/ O1 K: I call CallAddr1_0053BBFF4 W% Z; p/ z( {( n Y& |' D
mov edx, dword ptr [ebp-$14]2 M& F$ U7 e4 K4 v) x) W! _/ h/ D
mov word ptr [edx+1], ax
; R6 j, h+ G \) c0 j
" J; f5 @8 W$ ]1 [ mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
+ ^* L' \& C1 ~9 G/ Z mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
# r G% U Y) w# [# x1 d mov ax, $109 r( f0 x8 q5 q5 b) l7 G! D
call CallAddr2_0053BBFF
4 P, O$ V# m& A. Q1 J' @ mov edx, dword ptr [ebp-$14]
W8 z4 |1 K& M& y' ? mov word ptr [edx+3], ax
! @4 c, U# \0 e+ w jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
# B* w% e0 p) r //
: ]+ V( S, e# M9 O0 i b @out:
3 |4 m4 a4 R' b9 {% q8 E jmp EndAddr1_0053BBFF //这个是跳转到默认的点# `3 O5 J! V) R+ E# b9 c
S; r& `; J; ~5 U @OldCor:6 w$ A8 R9 c: ~! d# _( S5 x6 t
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
) c2 u- {' r4 O7 @2 y/ _/ v& h end
欢迎光临 三千论坛 (http://www.3000y.vip/) |
Powered by Discuz! X3.4 |