本帖最后由 异仟年 于 2022-9-5 20:28 编辑
* ^7 _9 |2 I. q' f6 e. b/ K6 Z. D5 @# x# P3 U5 L( G
编写需求条件:/ P8 {% ~# O4 a" X6 U) \
2 ^8 D$ s! c. a7 Z, p4 f
od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)
/ j& \5 \/ s/ M; S- }- x% ^$ G$ n! d, `9 E
, S+ l* d0 d; D7 K编写过程
9 s7 j7 M3 }' `$ M5 ~: m5 T, i- o- z( I: l
第1步:: _7 K3 G8 d) q. B
& ]. _! r! g0 r! v9 n4 n& D. C 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
8 C0 _. E4 E( D3 _* n
~: ~& j. U O% U, i( C& H2 i# D$ F% k5 x; s" U
第2步:3 [ [$ D/ v2 v8 F% K
& C/ X% T" \. g |1 U' m, p! S
打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序7 j0 r+ k9 ]0 e4 h: }
- ]' m B V7 x; T
启动客户端进入游戏(后面要用客户端)* A( ~7 A5 T! }. T
, K3 n. ~2 y2 ?6 x+ O3 R
调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
5 Y: C8 _6 a) P& r
- x0 V- W" ]( R8 G 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 ; z+ |- k# Q: Z
0 z* P1 i! R/ s% \' B, Y
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到* U3 I7 l4 O* m; }' z5 c8 U2 a
7 J: e9 h! R+ h% d0 h od停在
+ H3 v+ }1 u* y/ z! D* T8 I4 Q' G$ J \: }' \7 |) s+ R/ E
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "3 V# ]" M! q& z j9 |
1 _, G: k0 ~9 d5 V: \" F. `
双击这一行 再次看到od定位在汇编代码显示页面+ z/ i6 b3 X3 T
, I0 _9 n, d: `0 ?
( s; D: d; u; ?% S' y; I 0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: " w5 r+ }, @) v
0052A0CC . E8 C7A5EDFF call 00404698 0 f4 x" @. m' Q
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容
0 E3 i# Q: h! } Y: K 0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
# a" U8 Q5 A# Y9 a2 i 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
+ Y% ~. e% @ r& {/ N* @8 L 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
# D D4 b( ]5 I. K0 G
! v, H0 v+ L) D 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
h, }# I# H+ N$ I% ?* X* \ & [$ K3 J$ s; D* i
这时od会被中断, 断在刚才下的断点处, 这时按下F8 ; Y. @ h% B+ B9 |8 N# |
! ~2 |: w; `( q9 c 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
+ M$ O5 p" o: n" Y
, p/ m) d# @4 k 同时发送数据给客户端
( G9 T8 u% c1 i Y+ }, ?: V
8 R8 \9 U2 y0 g% a4 U8 W& k$ C
, u+ d$ c- b7 F# l2 K' ~- e0 y6 S ? 进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过; X; q9 m( U" m$ O8 W9 l, O& x
0 k2 R( O& ]1 g
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)
1 M8 } u# b. m) m5 d5 a 0053BBFF |. 0F87 41020000 ja 0053BE46" [3 ^' ^( Q* ^8 d
/ q# T, S) W. a9 F, F
eax 这里是3 一路F8比较下去到下面这里5 P) i) j; Q* u2 ~2 L
" U) A2 l6 ~) L X 0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC* Q9 B2 N+ v3 A+ [8 P
0053BCDD |. 66:BA 1F00 mov dx, 1F
3 `& _: X, ]' M3 y4 t 0053BCE1 |. 66:B8 1F00 mov ax, 1F
6 u. C& `1 x# s% I! l2 I 0053BCE5 |. E8 EA54F2FF call 004611D48 I1 c" G% J$ O+ E( b' M( w
% ~: G7 p( ~5 A2 a* y) D% N
这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 , R3 M$ R8 m4 a, ?7 m2 P
" H3 ^0 ~0 _' d6 f; O8 x% q( E
call 004611D4 就是调用 winrgb' N+ a% s/ p% e0 ]0 b
5 q% u. r- f% ]; K% W) G/ K2 X
7 t+ v' o# t$ J7 Z4 j9 k
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
+ t n8 J6 z2 m. J3 k" l$ _% i1 p' b" k2 R# Q0 |( P3 B
dll里面进行内存地址读写
+ y3 P7 C* I' E2 I* }5 Q. L6 O6 N% C$ E
我是在
, ^; M F$ D7 Y" R
1 Z0 Q/ ]' B: _ 0053BBFF |. /0F87 41020000 ja 0053BE46. l4 ]/ M! T) y8 e- M) H+ g
S$ R. ~; i/ s2 i2 A
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写
1 F) l6 S5 x9 ^7 ~& R% u. {7 T I; L& N3 T( d* F
procedure InitDll();
3 ]7 |5 K/ J* t var
' A% d% O( x1 O2 g p: Dword;
8 u/ P2 n a3 o begin' j+ n; X* ?' R" G4 v
p := $0053BBFF + 1;. o! \1 [/ Y5 ]) ^# \
PDword(p)^ := Dword(@proc_0053BBFF);5 h' N6 A2 C8 O4 e, [& S
end;
1 R& i6 ~2 K, A) C: I/ N8 r
8 r7 Q8 S8 A$ J. ] 在自己的代码里面写一个色彩增加的函数判断比如 k% J( s' P9 x2 w2 |- S* w4 j
- M H4 s' a* O* ?. X$ v5 m delphi代码:
* ^ n9 G' r: m# x' k/ r! T1 {0 j) w# P0 ?4 D) b5 y
var5 u; J) g( ]* E& H7 u4 @
EndAddr1_0053BBFF : Dword = $004F470C;6 f9 x8 [" ]% l) D
EndAddr2_0053BBFF : Dword = $004F44CB;8 q6 U* u6 T, l' }9 _" [
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转
! O8 H3 |* T, M7 h+ i& _9 D# [; j* x- q/ A: M, _; |) c; g. u
CallAddr1_0053BBFF : Dword = $004611D4;( K* g8 d& r* F$ Z2 E7 [
CallAddr2_0053BBFF : Dword = $004611D4;, V# G t% {3 c3 D" P* Z1 x: N7 ]
4 F2 o3 }0 h% z/ Q
procedure proc_0053BBFF();( S+ _; [- d V: J2 t" y+ t! d
asm
* a- i6 H' z8 {" Y6 ?. u. ? cmp eax, $10 //与预先设定的 最大17比较) z* @7 B* p, q. d. e
JLE @OldCor //小于就跳转到默认16种色彩赋值1 W: C# O- l: e
+ U% Z7 H1 @ [6 |; x
cmp eax, $10 //比较是否等于16
/ A8 L/ B9 N: p# C3 z( M/ v2 z jnz @Seventh //不等于就跳转到第17种色彩判断部分
8 R, p+ g5 B2 w0 l1 r# N
* b: Q, G7 m, I2 F mov cx, $A //字色或背景色? 没有去详细了解请自己测试' |, @/ g2 @. O2 A. d* Q+ I7 J# P
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
) R& z+ k$ l9 k. b0 Z9 o( j/ n mov ax, $A' u' [7 x6 m1 t' |
call CallAddr1_0053BBFF8 k% ]4 P1 [4 X& u+ N) z" _; t
mov edx, dword ptr [ebp-$14]" l' B ]' D% y- t3 C1 j
mov word ptr [edx+1], ax( t8 p+ b2 o7 S% O; @3 h; p$ `
# ~0 P2 L s' u- p/ g' p! r6 z0 { mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
, ^6 T. s5 [4 A8 T) f: ] mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF% P7 H* ~4 ]! l
mov ax, $101 N9 Z2 r* I6 b. ~/ M& x
call CallAddr2_0053BBFF" w* s( h# D8 G2 n3 D* A" v/ E
mov edx, dword ptr [ebp-$14]
/ p7 R" e! H4 U8 h+ v' D% m0 v* g mov word ptr [edx+3], ax7 | `. m/ U+ F, T8 y" h" d; N; w
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
. M! M( W$ r6 ? m( b
' r* t, _4 e R' B, d @Seventh:
# C$ K; l% k" a/ `) F6 l cmp eax, $11 //比较是否等于17
, s: b* O# q: r7 D3 G$ S% |$ A( Q jnz @out //不等于就跳转到默认部分
/ u" H" m/ b9 U
" b [/ Z' ]( f! `' K8 i mov cx, $A //字色或背景色? 没有去详细了解请自己测试, z! b) ?+ k6 \$ \
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
4 B7 E6 A7 F# j/ Y- [( F2 n- G$ C6 y! T mov ax, $A2 }1 Y, K4 i+ i: C
call CallAddr1_0053BBFF7 B0 G* }8 Y* K* j( H5 A, z; y
mov edx, dword ptr [ebp-$14]
) ^, \" g6 Z- y/ W mov word ptr [edx+1], ax
* W# P% X8 ~* K, X. y, b0 ?+ J# z! h7 w7 E% g( I
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试* H4 p) X8 m: t- n9 h
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
2 q! l$ x1 h; o! k mov ax, $10
9 Z' G7 a9 S: e: L4 H call CallAddr2_0053BBFF
/ d% l% H R* Y! a7 b3 _3 U5 c mov edx, dword ptr [ebp-$14]
0 h% N! @8 u+ _) k; D; _7 r, ^! L mov word ptr [edx+3], ax
2 o6 h- Y$ [; N. O& J3 Q4 u- V jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs
, p, \ p3 H& p$ g //
3 I8 p) }" ~; J5 J6 J. u @out:
# J Y: o: e( M7 [$ ] jmp EndAddr1_0053BBFF //这个是跳转到默认的点
# R% R \9 w! i) c, d
4 ^& p* ~0 z% \/ v4 F) g( o @OldCor:/ \1 k8 W# n- j6 @0 n( L
jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
( M% G- Z- M7 _; _6 Q$ v. w end |