本帖最后由 异仟年 于 2022-9-5 20:28 编辑 # @) D( t$ x* _5 t5 o% x
. o1 b; [/ ]3 r* Q编写需求条件:
' e8 s, ~' w! G+ S: u; {
1 T. R8 b5 G: C* e od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++), _9 s- e- Y( h" ?+ U/ ^/ _4 B% E
" c$ g, }, n" p% I& \* ^& |" s4 a' \1 X2 ]' N( m7 K
编写过程9 W' ]: {+ u' C( ? o ?' m. Y7 ~5 M
4 a! O4 W) N8 q1 E4 y( J, P7 D
第1步:
" e$ z4 w6 C! Z J6 m% t4 e+ B; w9 s+ S, G( x2 l7 V
用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
/ g: Z/ A; S6 \, F% k+ A3 m M# C9 Y, J$ a
' \8 W5 A) b) @. ]5 Y第2步:, L6 M! F% P7 l1 Y, T6 Z+ G
( e0 N3 U( C+ ~; z. q" f 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
3 I- C$ n, z" a9 X+ n7 N6 ^
$ d) {/ Z0 t# t. k ]1 _# U) S 启动客户端进入游戏(后面要用客户端)
* Y) h+ i" D4 J: n$ G. [+ W
6 C. B. ]' x3 J1 N- |# L( C7 Q D 调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
" i9 R# |3 s: U/ ^4 b: G7 c+ \( z; i6 U5 m! \9 E2 t
在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序
1 l# P4 T7 t' i" Z# Z
) e& M+ I; d8 `1 J% P. k 提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
% z; W+ R- E! E# f/ z( g
% Y1 V* g! W# j od停在
5 A; u s. R' A! \/ p
* V+ V+ j1 z8 a; a. O0 x6 A0 F 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "- I# u5 s Y) r4 C: U" s
5 F4 g1 f* e# q8 G# j: O 双击这一行 再次看到od定位在汇编代码显示页面
! S( x) z; d' G" J$ d5 I; C
; f, k5 }6 W, l* P
' A+ W" t, {, F& Q) e 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " + T9 q! m5 p+ G: R* r" y. X
0052A0CC . E8 C7A5EDFF call 00404698 + H# y% _5 V4 m0 }3 u" p; D6 W) ]! s% |
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容# _3 F$ |9 d( }0 l! n$ c
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用' R" @$ m$ O. p
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
# o9 A) i7 z G4 ~ 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8& S* X# \$ v; `1 ~
+ E. n: m- H" `3 q
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????$ J# F2 m$ d! G" I9 n, `' L" d. z' E
7 i$ [5 |# m2 J) }$ I b5 a 这时od会被中断, 断在刚才下的断点处, 这时按下F8
$ w9 x+ Q G' A" d
" ? c8 `2 D- F4 M8 } 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩3 f/ e- K9 }$ d1 g, c
$ M+ _! g- x) U; S' @# r; X* {
同时发送数据给客户端1 O: y. w2 c3 ~6 G1 a$ j2 G/ A
9 I P! B3 C. \4 m. H
7 p9 |, _) y- m
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过( }1 n, V9 \9 ~) B2 W3 M, r% |
( N5 B- s7 E2 C d1 l
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)4 H# d5 |% s) R% o( I6 \/ t
0053BBFF |. 0F87 41020000 ja 0053BE46& p) I& W1 S$ k! l5 e6 [* s* @
8 j9 Y8 I3 _4 Y" p& y6 O0 j
eax 这里是3 一路F8比较下去到下面这里! U) D7 j% W+ z8 _# q$ \
! B; U2 C6 u7 i% j5 j7 K" S
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
* ^: b! ^0 ~1 x( s8 M+ k. n) l 0053BCDD |. 66:BA 1F00 mov dx, 1F
0 Y, [0 }6 y1 H3 R# U7 } 0053BCE1 |. 66:B8 1F00 mov ax, 1F* r* K/ U! u% ?4 e3 Q
0053BCE5 |. E8 EA54F2FF call 004611D4( h/ w' F( [* H
9 ^/ ?# i/ W# q s' L
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 " s+ x \" o0 F# _. M
. G$ A2 \6 o; I0 u% r5 U# l: h call 004611D4 就是调用 winrgb
' R: t; U& ]4 Y3 s F) G1 M t- d/ D, f- O, g2 Y) u0 G
1 Z0 @1 v1 {5 v
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
5 r4 A7 \4 z X6 m! r8 `2 O8 Y$ T
dll里面进行内存地址读写9 v5 D- S( O# R
! E3 y/ e3 e7 \' z6 C4 P
我是在! m$ p% w5 z8 N' A( h
5 r, B) k3 q- q' r8 m! o! a9 n2 s: N
0053BBFF |. /0F87 41020000 ja 0053BE46
' j$ V: ^1 e7 c( M- M5 m1 ^; q8 S6 m& g: R' P2 x9 N& b* p0 f
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写& Y, q6 F- w8 Q& J% o9 Q! `+ u
3 Z5 l$ G+ h1 p' w, C3 w procedure InitDll();
! [' d* J, n0 W& L: g. R* ^ var
. J: K; C+ N9 {0 X: q( q p: Dword;
+ W1 E; [9 s' [; m& s- G begin
: `& C8 V3 f& }: O# Y9 X p := $0053BBFF + 1;
' A2 f, P& _) P9 O8 ^( Y ~+ S PDword(p)^ := Dword(@proc_0053BBFF);) P8 m# U' Y' U2 N8 J' C3 m) y
end;
: v2 ~0 m! A# B& Z6 o" S
8 M4 o1 Y7 G! J6 n; ~$ I) `% S 在自己的代码里面写一个色彩增加的函数判断比如3 H* }8 N, K4 F% N, f
$ r3 V$ K$ S+ U) W5 \; ^ delphi代码:3 z1 v! V$ c! l. Q
% B p6 o# @8 M' e3 G4 c) T$ V var3 g1 K. X2 E9 ]; {0 G
EndAddr1_0053BBFF : Dword = $004F470C;; b+ V$ }) h- |% g+ i2 u
EndAddr2_0053BBFF : Dword = $004F44CB;3 G. R, f `+ h% x9 u' H& N
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
4 n1 K* z& b* I* j/ y3 {# S- w) a; _8 v$ f# n
CallAddr1_0053BBFF : Dword = $004611D4;
Q; W9 b* C" l1 O/ L4 S CallAddr2_0053BBFF : Dword = $004611D4;% W' p* o A+ j* A3 i+ J
. f! ~6 S5 ^3 ]* e. j
procedure proc_0053BBFF();
! ~! t) x3 { Q: w9 Q( _( ` asm
; {5 r2 J6 R: @1 B+ ^9 c5 y cmp eax, $10 //与预先设定的 最大17比较$ b. g$ r4 P4 R3 t
JLE @OldCor //小于就跳转到默认16种色彩赋值6 q7 c" `1 H' V4 V# e
4 i1 J: Q9 U( W- u9 C5 Y
cmp eax, $10 //比较是否等于16
f' k) P+ Z1 Y5 H jnz @Seventh //不等于就跳转到第17种色彩判断部分
5 @4 D, u* W, b! R% y" Y! p# I. ?+ w \+ Y5 o; Y6 Z
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
' K5 T. a. w5 K mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" {+ U- ~6 X% P. l. c9 b4 ` mov ax, $A' _5 s; Z' _* E; z& D
call CallAddr1_0053BBFF
% L; H \9 T) u' k) C: @7 V mov edx, dword ptr [ebp-$14]2 \4 z, \1 h9 b+ @
mov word ptr [edx+1], ax2 v1 M% i6 F7 F2 a( c" b8 l# G
6 |& K' R, j t+ C* Y/ @+ e
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
A& u' b) p+ i; ~' ]- J mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF4 K/ h4 h9 V; O
mov ax, $10
3 w6 \9 |6 U+ h3 M8 Z; Z# u call CallAddr2_0053BBFF
8 ?- @& j$ N; h: B# t' P mov edx, dword ptr [ebp-$14]
. q3 e2 A( o/ K' L mov word ptr [edx+3], ax
! s# m# e3 ]4 o3 y4 h jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs0 p- p9 n9 n* ?# J
' D4 F5 v" w$ \0 j/ R8 p1 V% R- g
@Seventh:6 H" F7 X" o: r4 Z
cmp eax, $11 //比较是否等于17( |- ~4 q( ^/ p( k+ B4 e
jnz @out //不等于就跳转到默认部分
! @( d! k! Q+ m4 O. i0 ~4 r
( v w* M- h, O* g6 e* v6 N mov cx, $A //字色或背景色? 没有去详细了解请自己测试" C; U- g! J: p
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
5 Y7 F$ @) m0 c5 k* q6 v0 C mov ax, $A
( E/ s# U8 P) J& m9 ? call CallAddr1_0053BBFF6 w& k# A/ n/ f9 C0 T$ i
mov edx, dword ptr [ebp-$14]
7 B' I( S9 J W& S1 G0 S mov word ptr [edx+1], ax8 {# S" ]% u, s! K8 L
, ]8 J+ v" q2 Q3 j; j% W mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
$ Q( N) i3 p; g" \6 v. c mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
3 ?3 M' i! z4 i- f9 }2 F mov ax, $10
9 F. P! y* }/ }. C& J0 [ call CallAddr2_0053BBFF
3 F( [2 c ?3 p( @: k2 Q mov edx, dword ptr [ebp-$14]" ?+ l4 _& b9 K& N* y3 k6 ]* U
mov word ptr [edx+3], ax' Z( B, f; F0 s6 Y+ X1 X* g; ]5 W! v/ W
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
1 p4 q) B: r$ e6 l4 s' {1 W //
( b/ y: c8 x0 E- }: J @out:5 b" n+ Z1 X' k' ~, |3 x# o0 h
jmp EndAddr1_0053BBFF //这个是跳转到默认的点
, Y$ ^2 J- J! {( N, k% J
9 E; E* V9 a/ r1 S( W6 C* C2 o: [: ~$ d @OldCor:7 o' V9 q I( z: q, _
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值! z8 C- g+ f4 y% R. P# U6 A o$ m
end |