本帖最后由 异仟年 于 2022-9-5 20:28 编辑
* F$ T/ T) o% t! o' z8 ?8 j% |' y) H% h: T7 o% ~( B# @
编写需求条件:
$ _( ?0 H# @2 k" b7 g1 o
& c- I8 x) }& B+ d od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)% {% k3 ]) L' `
0 _" w! p) m5 t+ E/ M! f
/ M' k/ \! t% X+ K
编写过程
" W$ _: d4 m* J$ q
) [' V0 e. Q$ }3 } F* ~& J( F第1步:: h8 i# z5 i7 K$ ]& N
1 z: ~8 E8 e0 N% V/ i# s2 I 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
* x% H6 W: u! O. `/ Z4 f, @, B# i' y; R; Q% B) k* d4 f
* H7 t/ Y& g5 I* E第2步:+ d/ S5 ]4 f8 x- |7 a9 [6 d
2 h1 o- m' p* Q* R+ V2 O0 i
打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序
" l' |& L$ P1 x- t- B% ?' O5 a6 X* C& @" W7 n/ E0 U0 \& C
启动客户端进入游戏(后面要用客户端)
* `' s( x* _5 f' u& i3 G) l4 j4 T9 {/ K: F4 }
调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
n" m* t8 P, d# E! X
( P: h) X% A( ^0 g 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 $ _" f# r+ B6 E" p1 r5 p7 X
, G5 F+ h& e- u6 c
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到
9 |! d9 X4 {( m7 f- f- O- Q/ s7 u7 L% i3 L+ V% D
od停在
- O; X$ I: j0 W$ U- D& a/ t; P; a' c5 P
0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "
* L: x; s$ l. o: M9 ]2 K8 y
" K4 g. s5 L* d5 T1 Z 双击这一行 再次看到od定位在汇编代码显示页面
6 Q( g+ N: t9 x7 U) D5 @$ ?. k5 Q/ ]7 r% C7 w& ?" ~% @2 o
7 Y( r- L* B: C4 v
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
6 ^7 O# W" O- f2 E, S) e+ U. T 0052A0CC . E8 C7A5EDFF call 00404698
& K! z9 Y0 k6 _, f) W5 @ 0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容! H+ B$ I8 K% O( K8 V& r+ x% G
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用' K4 r J" e' `5 k0 t; j
0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道
1 R/ L; H9 I. E$ F6 I 0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
$ V( \9 W# B2 R
~) [# j) v7 a3 z- G5 Q- g; \ 定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????" J$ i+ x6 Z# A; m, ?6 G" @
6 R: H( O* L" B; ^
这时od会被中断, 断在刚才下的断点处, 这时按下F8
6 C5 F6 ~) s' M% b) d$ B* D& `* b/ ^6 c" l+ B. d
到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩* F" _" X6 E* F, ]' o8 y* N- y
* i! X9 W0 p* F( U, L' F/ M
同时发送数据给客户端
w$ V8 ~4 j ]/ ?
3 R# X) W- p2 z Z0 ], t& T7 Y& j ~4 j9 r: Y
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
5 y, O9 H- b( Y 6 B" a' E5 F" ]; `" A/ @- y
0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)! y, T6 I, d3 q+ i) c. p! Z& I: U
0053BBFF |. 0F87 41020000 ja 0053BE46
8 p" N" j$ R7 J: i" H( S; ^; a7 e. C8 S s0 G* K# e
eax 这里是3 一路F8比较下去到下面这里
" G2 h' ]0 v! B/ K& o2 d5 q1 }3 \! I" f# h0 ^
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
; _6 t( f$ ]) q3 p3 U- f5 I7 a 0053BCDD |. 66:BA 1F00 mov dx, 1F" b; W& z: \5 w
0053BCE1 |. 66:B8 1F00 mov ax, 1F. n/ L' d6 g5 m
0053BCE5 |. E8 EA54F2FF call 004611D4
" Z* m1 L8 ]+ ?& k9 q( J
1 X/ g" r. |% v2 S& x 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数
7 o0 A, T' X+ W; ]8 \6 f: l' L2 }" N 4 m8 }2 C7 @' w8 i/ R0 H w' c- I1 A
call 004611D4 就是调用 winrgb* k& A2 U0 @8 s
! h6 M8 A `3 G1 [
$ z" u+ c/ Z) Z: E P3 y; f1 S3 s上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在
, `7 |2 r% D8 c1 m
9 `" I% ]1 m7 L0 d; i- H$ m dll里面进行内存地址读写: O% U7 W6 z1 M( y3 y# N
; a) C8 I; G* B 我是在
, v5 x3 r: ]$ K: K6 e 5 D' z. T6 e4 h, a2 M; _" H6 Y
0053BBFF |. /0F87 41020000 ja 0053BE466 D2 M4 `' @9 Z4 x6 C( s3 k; ^: x. I
3 t, Z5 g; K+ M% ?) H
在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写4 p: V% l0 O! O) X! i! n
. U: F. c0 X4 I* I' B. W1 v
procedure InitDll();' n1 P$ Y8 B( ^
var" E* Z* w) c6 B; s1 P
p: Dword;
+ F( j" a2 s% e' G1 h2 C begin
( N- \$ k7 I! _$ S p := $0053BBFF + 1;$ R/ X- _& Q$ S: Z8 f. `1 W
PDword(p)^ := Dword(@proc_0053BBFF);
# e! \, v! O0 k& D end;
+ h, Q! g3 ]( _- O& ?2 R% m/ a7 n, L# V J+ Z8 m
在自己的代码里面写一个色彩增加的函数判断比如1 c3 ]8 _" x+ b m: ]$ Q
R$ d( K2 H7 x6 i. I delphi代码:8 o+ e# Y5 R y9 v; ?: p
' {$ |3 H' C: w+ }) I$ \
var
$ T m# p( b7 W7 t/ Y" F5 x2 z EndAddr1_0053BBFF : Dword = $004F470C;9 S6 O: J9 ~( [ {$ K$ c
EndAddr2_0053BBFF : Dword = $004F44CB;
X* y$ B4 S( u EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转$ _. h% m3 A& Q4 d) Q
! g1 U6 I g- O, f2 c% G! E# F CallAddr1_0053BBFF : Dword = $004611D4;/ m5 j" w" p. _; t. c8 d. d5 v
CallAddr2_0053BBFF : Dword = $004611D4;6 m4 [$ j* [; B5 U! ^
' J9 y6 e. t' p. c procedure proc_0053BBFF();) W% X! R; K1 R7 ?* A: i8 M9 M3 X. K, k
asm
. ?) t7 J: k" p t/ ~0 i( g cmp eax, $10 //与预先设定的 最大17比较
1 X: I/ c# R$ o$ m @7 Y7 z JLE @OldCor //小于就跳转到默认16种色彩赋值: `- h9 k" N. o1 j4 M+ u
( `0 p. b+ K7 A2 Y* `* k cmp eax, $10 //比较是否等于16- F1 f- M: n9 \- H: Q. T- b
jnz @Seventh //不等于就跳转到第17种色彩判断部分
8 z i8 y5 T3 x9 G3 A3 K/ c. K9 F" t3 z& r$ S# p; C
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
' t% e% `& t9 R$ j: q+ i, D mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" v$ Y& I8 Y; V# p$ Y5 E2 } mov ax, $A
$ l* K! c3 W( \' _- a call CallAddr1_0053BBFF
0 q- V( T! x3 J! {7 y* E mov edx, dword ptr [ebp-$14]1 m; u5 k6 L, h5 [1 a9 G. v3 E
mov word ptr [edx+1], ax
$ Y) x5 C% c% `' |1 [! R; U* R* l; X
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试; \( Y) U' E. N1 G
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
[1 l) s8 h7 A- m$ l mov ax, $10
/ B$ z# o. p9 l+ }9 ]6 e0 ]/ u call CallAddr2_0053BBFF
+ E% `% F4 f# `$ ^ mov edx, dword ptr [ebp-$14]- T& C! ?' K0 L6 _$ {. t9 Q- z
mov word ptr [edx+3], ax
4 ^/ K: N0 o/ P( W4 ]0 h jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs/ h" m7 f2 i3 W+ ~
9 }4 Z$ }5 [2 X; {: Q' B& W2 |: [9 E @Seventh:/ e' A& s( e5 z+ j6 X2 r# _6 \
cmp eax, $11 //比较是否等于17, R9 X/ W% U6 n B2 F8 \7 d
jnz @out //不等于就跳转到默认部分
, u7 I- n. c' y2 n) u
1 A" N+ x. `& ?8 a: m mov cx, $A //字色或背景色? 没有去详细了解请自己测试
8 L8 q+ c7 g& Z, ^ mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
" R- |9 c1 A' L$ h/ v* j/ s4 P6 `3 K mov ax, $A" Y6 `8 K) k% B( d/ f
call CallAddr1_0053BBFF! l6 O2 ^8 v- T2 s
mov edx, dword ptr [ebp-$14]
2 M0 c V& I( {1 C mov word ptr [edx+1], ax8 M9 v0 z1 J; y. n9 h0 `* c- a
* `3 O9 d1 a- ^: y
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试2 C A' M! {+ Q% M# a* B
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
! N8 I1 ?, e# t0 _( Y& O4 t mov ax, $10
: I2 Y1 T. T% i call CallAddr2_0053BBFF0 m" T) N) @' ?1 s$ {
mov edx, dword ptr [ebp-$14]+ c* g, {2 ?8 f5 |
mov word ptr [edx+3], ax9 p" R5 L: Z. {7 c
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs2 Z5 S4 G7 N+ ]! Z
//
. X7 u2 b6 g- W# y* h4 ~ @out:
- n- X8 p9 W+ r+ L- _3 V4 S jmp EndAddr1_0053BBFF //这个是跳转到默认的点
0 L' _& ^5 X6 f9 a# T/ E
8 r) w0 o8 f' ]1 Q @OldCor:
8 I. ~$ I( E: Y! T* \ jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
8 ^& Q( @6 I8 }0 A% C end |