三千论坛
标题: 初步了解tgs插件的写法 [打印本页]
作者: 异仟年 时间: 2022-9-5 20:27
标题: 初步了解tgs插件的写法
本帖最后由 异仟年 于 2022-9-5 20:28 编辑
4 }: Q3 N0 _( v# f* F
7 L9 I$ m1 e8 |- X- M6 d编写需求条件:8 c# i4 t9 x1 b* D: M5 o4 m, u
" t& j, u' E+ W t4 [' f
od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)0 r$ }, V! @6 X
1 [2 N$ F8 H1 [, v* k) E# ^1 B
% }- c* ^/ M3 T t# x* E/ F
编写过程
: |$ ?5 {" Z$ T+ o. i& }
J# S+ }& E. C. T' B: U第1步:
4 t& W2 Y/ \+ D' v( L
u5 [* A# ^3 q( i& z 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面& [ y1 X- U( V3 f4 \+ p, R
+ J* n/ g+ G+ l3 H- Z) @: v+ I9 A9 V, ^4 B
第2步:2 N, ~5 i1 h" z9 z6 b
( p& |8 F6 t1 f8 _ 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序5 o4 ^! N* [* D1 L# ^3 _6 p& n
* U8 c2 T0 C+ z- V! q6 N2 w; _
启动客户端进入游戏(后面要用客户端)2 e0 E) e, c6 F9 \
& D9 ^& f3 ~" A& ]3 o 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe4 N/ P, R& e1 a% _6 o/ r- O. L
N! z" V, c; Y2 u 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 ) W0 ?4 S" R! _" O+ e
' i( I1 ` |- _$ }5 I1 Z
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到& }: y* A( G: F, G1 r7 l
/ @8 r/ y+ ] A3 u8 o+ d @
od停在9 V, S. ]; c& ]0 v7 l
+ v, G8 N" D2 `/ H 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
* E" D6 A8 L2 f: b5 A) j8 Z2 F% A& l* H7 _
双击这一行 再次看到od定位在汇编代码显示页面
% D, a' v4 c8 C- B) Y+ D- j4 f: r4 \4 \3 H) @. t, a+ T# b
2 b! h+ w# l7 o8 v; C 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
a# W. a$ Y- @: n- Q3 C% ?8 | 0052A0CC . E8 C7A5EDFF call 00404698 4 X" Q# s) ~8 Q2 w0 p7 @
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容0 C' B' @) @. ]+ U% h
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
( Y6 \! z8 E: o, _ 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 2 l) F' n" S% @) l
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
+ u! u# c/ {# y* I2 F
3 V2 Y9 G3 P4 q# f8 U: q% y 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
1 x5 P& I8 Y% w ; I. H& x( \2 [# L
这时od会被中断, 断在刚才下的断点处, 这时按下F8
3 ?" W! m( s( ]9 q0 }; ^: N( A* v$ [6 m# g4 p
到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩& {) d1 `0 Q. v) M6 s, X
, U' ^6 E$ v0 w. V( H6 M+ u
同时发送数据给客户端- k# @6 Z2 k9 L' h2 \" s* d9 p
0 }$ c1 ?; ^ H) q. J( S
( ^3 c' `# j* \0 e' G n" c
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过9 l0 L! ^3 D2 v3 i
4 _- Q. W! r! k- e 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)
* d- K; E: J" `9 n; \/ x1 S 0053BBFF |. 0F87 41020000 ja 0053BE46
3 k* C# E& W) K# ? P( l4 S/ g, l# N( ~) V8 s0 W( H
eax 这里是3 一路F8比较下去到下面这里$ B9 b1 S! |: U* M. g
% O4 U% J L* e$ [7 n* \
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
) C' u; |2 ^6 C1 R 0053BCDD |. 66:BA 1F00 mov dx, 1F* J3 v- P' D, M8 q7 j, p
0053BCE1 |. 66:B8 1F00 mov ax, 1F0 P- _% \- n5 @" c( A
0053BCE5 |. E8 EA54F2FF call 004611D4% u& I5 I- e- t$ a8 F2 h
. P0 f" P# y: q3 S) _
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
8 q+ b" u# @3 O6 f$ ], b) H9 u
3 z8 x4 q1 O2 ~. f( C) U! {2 ^ call 004611D4 就是调用 winrgb7 _5 w0 z5 W* F/ J+ h
1 K* m+ }# N' D) o, L9 l2 Y
( b# J/ R" ]6 ?' P P* B# ]
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
8 j4 ^& s& s1 C! P& e5 ]& t9 M$ M, V* x# E! Y$ @2 V1 l5 d1 ]
dll里面进行内存地址读写' |# A" z J1 n8 y* A
+ V; D6 n; o7 v% X 我是在 H& p: t& B" ~8 i% L3 z* D
3 G5 E' d) |! D- l0 R 0053BBFF |. /0F87 41020000 ja 0053BE46- ^) F# c# R4 W' k7 d, f
' Y- L3 a' B* t% F* }) @ 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写( t1 i/ c7 N8 L1 X
" }: u x0 m8 E0 A( d
procedure InitDll();0 {9 _* V7 f, L ?) ]8 U
var
W% o' J: l! Q( S2 N& [3 V O p: Dword;
7 I# O) z% h E3 I. {' ` begin
4 B. a) ~: t6 B4 ~" N$ `' r. h p := $0053BBFF + 1;( i* N- P7 `' S) ?0 z) j f5 ?
PDword(p)^ := Dword(@proc_0053BBFF);8 ]# J* s7 ?$ M& o2 I! S! z- S* I
end;
$ I W& L1 U; s
b; q/ y( z7 C 在自己的代码里面写一个色彩增加的函数判断比如: L2 C( k$ m; D7 \) {% h
3 ]) H/ a1 X- j1 e6 q
delphi代码:, ~! |% k$ {- A6 U9 T
8 ]- z9 V3 h O4 }1 {0 H
var$ w3 W! b/ i, n# u* s
EndAddr1_0053BBFF : Dword = $004F470C;
* {) S0 P, I2 H EndAddr2_0053BBFF : Dword = $004F44CB;
, s5 Z* R# J. {( T# S+ @" ]6 ^6 |1 ^ EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
" v* F. ^& R1 A [7 g; R8 W
- U; M) K/ m7 B/ | v$ C CallAddr1_0053BBFF : Dword = $004611D4;
6 ~ n- C6 g, n0 x7 D9 _9 W1 M4 ]) q CallAddr2_0053BBFF : Dword = $004611D4;
" V$ H% ]- b# m4 }1 u# k- I
. `& V1 j' I/ x! L8 K7 @0 e4 U6 F# B, d procedure proc_0053BBFF();& {+ W* d1 @5 |3 _6 x8 I/ M: u
asm6 x1 \, x* |; v' k U B
cmp eax, $10 //与预先设定的 最大17比较
2 [& w* r0 x# B; Q$ z* u+ P# g JLE @OldCor //小于就跳转到默认16种色彩赋值3 A# k, S- e: {' F- [8 O+ w
- a# U0 U$ S- T# |* I7 x9 d! z# M
cmp eax, $10 //比较是否等于16
% d2 v2 Z |% k/ w6 O1 K4 M jnz @Seventh //不等于就跳转到第17种色彩判断部分
; a. h# y, I1 l7 ?% _2 }( ~, F7 m: |6 [7 ?8 U2 o! o: T5 i
mov cx, $A //字色或背景色? 没有去详细了解请自己测试9 ~' A2 g1 p" F. g% V. Y
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
9 H% w& |' A" j* J# @ mov ax, $A. u3 G$ h' N* A' G# b" x* q ]
call CallAddr1_0053BBFF& W! u6 d. C0 f: f4 ^
mov edx, dword ptr [ebp-$14]/ H$ m$ S- q: U( f. F8 [
mov word ptr [edx+1], ax! f4 C* ^* E1 q* o
G% e7 d' G! E) N1 i; V8 W, ^/ f
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试; H+ |# k& M! h
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) {* K% ~: M: p
mov ax, $107 g _, f7 _# `( a3 b
call CallAddr2_0053BBFF
! P' ~: O( n+ A+ {6 _ mov edx, dword ptr [ebp-$14]
& _8 I0 j1 o# R2 ~* f4 _- K# n mov word ptr [edx+3], ax
7 T. }" V( n" @3 t5 l1 I2 f jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs, L4 U6 @8 v% h
$ F/ d8 r4 Z4 g3 m. d' W
@Seventh:3 y2 Q4 \* W% H& W' t
cmp eax, $11 //比较是否等于17
$ d! n/ P% l, ~4 A1 O* F jnz @out //不等于就跳转到默认部分
2 b5 p. {( C/ W$ N/ m5 s, y2 ~" W, ]& V3 s1 y6 @7 r3 O
mov cx, $A //字色或背景色? 没有去详细了解请自己测试; V. q6 E% w1 @, z) |9 ^$ c8 v; u& s
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
- p# ] J: c, x' Z+ F8 s. t mov ax, $A* V0 r( `7 b% l' ]
call CallAddr1_0053BBFF! P \* g: U) n8 D2 C& w
mov edx, dword ptr [ebp-$14]1 @$ K) a# L0 U; p2 {+ W8 L3 [
mov word ptr [edx+1], ax3 |/ G1 v9 t m! D1 G3 H9 X3 M
5 _! f& O K+ o/ f0 S0 V mov cx, $10 //字色或背景色? 没有去详细了解请自己测试6 s1 k. k( u3 m( m7 }. w
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF$ ~! m- {2 }2 p- @1 y0 \8 B% z/ c
mov ax, $109 {6 r: \$ P/ @2 [+ U( h
call CallAddr2_0053BBFF; ?7 C7 A x' [. S
mov edx, dword ptr [ebp-$14]
$ M0 W. d1 W; i7 B; R; N1 B mov word ptr [edx+3], ax6 Q% ]) f4 U3 L' Z
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs1 B- K u' x1 `# g1 p
//
, Y6 w7 Z$ g s+ ?$ ] @out:
4 x! \! r1 W3 v jmp EndAddr1_0053BBFF //这个是跳转到默认的点6 Q, p& r' ~& g; Y8 Y
$ d1 }) X9 ], S+ b- C @OldCor:, A0 L& R% a! Y$ a! I1 p( B
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
: h/ w! J5 y' O end
欢迎光临 三千论坛 (http://3000y.com.cn/) |
Powered by Discuz! X3.4 |