本帖最后由 异仟年 于 2022-9-5 20:28 编辑 , W0 s8 o% J6 z# l2 q- a
# m, Y8 ^$ a0 e3 p/ T
编写需求条件:
+ G' X8 v4 V G, H& K# @
, y1 o. h6 l! }3 |0 o0 ^7 ^ E X od工具(看雪论坛有下), 程序编写工具比如(delphi, vc++)0 o6 i$ I* G$ ^5 w
( J) A: t9 H6 y( Q* l, x( S/ x, H+ d$ h* h9 u
编写过程
" _; n* L& `. j ]/ C2 X9 q% m0 U4 S4 |, V- I
第1步:: ?( r; i6 E" E
2 N7 t- d8 w" M r. a+ Z2 j' C 用编程工具写一个注入程序, 可以dll注入到tgs1000.exe 里面
9 Z6 o4 ^6 z S6 c& H% E# q. C: Z- K/ M; [: X( k7 T
' x5 D& M9 b9 i% A( e第2步:0 r/ I$ o" T% H" S' Z/ {. k. u
+ d) D0 Q9 V0 K4 s: A 打开od工具, 调用菜单打开功能 读入tgs1000.exe F9运行程序" y: y$ [; B. }4 T% m5 d
5 g" R* w8 I, I# c. D
启动客户端进入游戏(后面要用客户端)- ? N) q. C1 Q A- Y0 Z
' ?1 G& }7 o3 e9 F
调用 菜单->查看->可执行程序 看到列表里面 双击路径是tgs1000.exe
* x- I0 h: J3 o" P: L
" Y* p! z( a* D: S 在出现的界面上右键 菜单->查找->所有参考文本字符串 od 会扫描程序 # p' D H1 r: W! a* C
y* @, w' A/ q- \* r0 b9 m
提取出参考字符串, 然后右键 查找文本 输入 <system> 字符, 这时可以看到% F. M( n5 {$ t
- A0 j3 S* _! p$ N# B- B
od停在& z. v6 i8 T: v2 {6 b
1 o! w8 \. @2 T1 @ 0052A0C7 mov edx, 0052FDD0 ASCII "<SYSTEM>: "3 E7 h4 w5 \9 n5 F$ c. \) G; ?
+ f' k7 R/ G) q$ t
双击这一行 再次看到od定位在汇编代码显示页面
9 z, T; B J K) f! t- ?/ i& Y
* B, l3 @3 c+ V. f) f) F3 k3 G0 q) Q$ ^) s! y9 p2 i/ E/ X& h/ z
0052A0C7 . BA D0FD5200 mov edx, 0052FDD0 ; ASCII "<SYSTEM>: "
6 h! W* z% H6 w+ ]6 v h& \! K9 c 0052A0CC . E8 C7A5EDFF call 00404698 / N! T6 J% f* {
0052A0D1 . 8B95 ACDEFFFF mov edx, dword ptr [ebp-2154] ; 赋值edx 为中间屏幕显示的内容9 k( v8 P; [+ v7 x; g4 _
0052A0D7 . B9 03000000 mov ecx, 3 ; 这里是色彩的选项 后面会调用
/ l1 X7 B4 D' ~( r- o 0052A0DC . A1 70855600 mov eax, dword ptr [568570] ; 这个是UserList地址 参考侠中道代码可以知道 , C7 b4 g/ K% r+ E6 ^) L
0052A0E1 . E8 D21A0100 call 0053BBB8 ; 屏幕中间喊话的call 0053BBB8
3 ~( S9 x3 m( D* U. q8 o8 h1 q- r8 e7 ]
定位在 0052A0C7这一行 在这里双击下断点, 在客户端用GM喊# ?????
/ b$ v* w; Z: f+ _6 V7 `
; ^- U# k9 b2 P4 x 这时od会被中断, 断在刚才下的断点处, 这时按下F8 " Z7 r) R+ a' }# x: D6 M5 r
$ Q: a( m! _( M" i( [; x; z 到call 0053BBB8 部分 按F7 进入call里面 这里是根据ecx值 取得喊话色彩
; a1 a- @2 v6 x( Q3 J7 Q- r" S% f9 i* L0 J
同时发送数据给客户端( \' a/ i0 z- {; Z1 f& B: l% v( P
/ c% m: I; l( ^4 }$ L& k4 P! Z ( r' S7 z1 l1 j$ I' v
进入call之后 一路F8 到下面这里 这里的 eax 就是刚才ecx值 在上面部分已经交换过
; P3 k; `; ~0 {( T
. X7 M" s- _/ W/ {' @ 0053BBFC |. 83F8 0F cmp eax, 0F ; Switch (cases 0..F)' K; Y, L& Y! Y8 b, x
0053BBFF |. 0F87 41020000 ja 0053BE46" z: W* [3 ~: A6 I/ f/ ?0 R- F
/ m9 e2 ]6 r6 d
eax 这里是3 一路F8比较下去到下面这里
$ {* r! H0 E- Z+ C; e1 `" `5 |, L k! U6 ~$ X! a0 r
0053BCD9 |> \66:B9 1F00 mov cx, 1F ; Case 3 of switch 0053BBFC
" ^! }0 m6 s8 ^) c5 u, m: u 0053BCDD |. 66:BA 1F00 mov dx, 1F
' K9 Q" ?1 w ^" V0 ^( u 0053BCE1 |. 66:B8 1F00 mov ax, 1F: N+ V9 ?2 i" z& k n1 v
0053BCE5 |. E8 EA54F2FF call 004611D4
+ c, A. z9 I. F+ G; Y5 j* R7 R7 E
) x7 ?+ k# A( t" N+ D4 J- Z 这里的 cx, dx, ax 看到过侠中道代码的就知道是 Winrgb(r,g,b:word) 的3个参数 / V! D5 F. h$ \ [1 E
6 C2 n$ I! V5 g
call 004611D4 就是调用 winrgb
& V0 m2 J, p# [% k p. g6 n R: [7 ]/ s: `$ y6 |8 ~
! h; K! ?0 k+ |1 g n- }; G5 Y1 _$ \
上面部分已经初步了解色彩设定的方式, 这个时候为了增加我们自定义色彩显示, 就需要在) [5 z' `: e4 u( B6 ]- z
/ A2 S- v" j- H, q# ~ dll里面进行内存地址读写
; n9 p/ {0 h" V7 z8 ~* v+ W% L7 U4 `0 U; p; ~5 }
我是在* }* y3 G; {/ g* p5 {
& E1 {5 a) t6 z 0053BBFF |. /0F87 41020000 ja 0053BE46! @: e7 e8 R. @# s8 U' T( V
$ r( s! x# i$ k, c 在这个地址进行拦截 在delphi里面 可能可以dll初始化时这样写' z J" }3 o3 i$ L/ y
}4 F j; g9 P$ T9 M
procedure InitDll();0 U, n# ~ \& |, e
var
2 n/ {5 ?4 b$ g p: Dword;0 t" d5 w& _2 V3 [) c W# o6 s3 g" w
begin
( X* j2 {5 b/ a, ^& t& G+ h3 f p := $0053BBFF + 1;
/ K4 P9 N% j0 i PDword(p)^ := Dword(@proc_0053BBFF);& a* R7 ]5 w4 y; `
end;
- _: y/ h- N' N3 ^: n8 O/ `1 L! E, k. y
在自己的代码里面写一个色彩增加的函数判断比如 y+ M% Y3 T2 A/ E6 Q g
. n0 P4 B/ k3 o; i8 V9 C( T' O
delphi代码:4 H( V3 h! i8 ^' t, {
9 ^7 |4 Z; H& u& N- `3 r
var
+ b3 t3 E w: K' N EndAddr1_0053BBFF : Dword = $004F470C;$ ^+ R4 G* I3 W* Q
EndAddr2_0053BBFF : Dword = $004F44CB;' p% c4 M, Z% `, e3 t3 a9 b/ `& _
EndAddr3_0053BBFF : Dword = $004F4736; //色彩彩赋值结束跳转( D& F# ^4 h1 o7 ^4 m5 ]
/ l! C, F8 ~1 F4 o% R3 E) d CallAddr1_0053BBFF : Dword = $004611D4;0 \7 K# d. y( \0 n+ S3 Z9 ?* {
CallAddr2_0053BBFF : Dword = $004611D4;6 R( A+ c" l# ?; x+ X, }, o
- \, u1 @" M# M( `% R" G procedure proc_0053BBFF();
& K2 h3 {. J3 O5 a. F. d7 Z asm
$ F5 I& S- q9 I7 t8 H cmp eax, $10 //与预先设定的 最大17比较
$ |9 f& K3 ~: S9 X) ]% J JLE @OldCor //小于就跳转到默认16种色彩赋值
; Q( }+ b: ?& ^4 D7 D
& p2 F( b; Y" ]* j4 X) q2 _! j cmp eax, $10 //比较是否等于16: I" d: @" y' I
jnz @Seventh //不等于就跳转到第17种色彩判断部分4 X0 Z# [- c0 K8 H
, J4 A/ N7 Q5 x7 ^ O) _
mov cx, $A //字色或背景色? 没有去详细了解请自己测试
) O0 k. f9 Z) j. w/ ] mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF) |7 D5 x; W5 [, l7 H
mov ax, $A. I2 X- x/ {* Z" a3 o/ ^
call CallAddr1_0053BBFF- a- I+ |6 A/ s/ M: t2 U) y0 ]
mov edx, dword ptr [ebp-$14]
" b1 J3 e$ G* S, | e mov word ptr [edx+1], ax6 d) A3 l+ e1 p
, [3 u! K4 p |# T" |& ^/ \ C mov cx, $10 //字色或背景色? 没有去详细了解请自己测试' V' S; |6 {. D% r3 B5 ?; ]
mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF2 K6 W' n" ^% ?6 W
mov ax, $10
& v" j1 m+ o) c$ u4 b call CallAddr2_0053BBFF: Z5 j; G, F, `& ]+ h4 g7 A% C
mov edx, dword ptr [ebp-$14]+ I6 c7 U, n( c
mov word ptr [edx+3], ax
1 K( j% G2 c R0 K v8 W4 G4 L jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs/ ~! s. C4 c$ ?7 a
! s+ `- t5 z+ H: t9 O2 C( |# }# H @Seventh:0 l: {- c2 X1 {* W
cmp eax, $11 //比较是否等于171 ~3 a+ y" p: c$ P# B
jnz @out //不等于就跳转到默认部分
. W7 f' S& f8 d6 f' b8 ^7 j2 X& k1 a$ g# o7 c
mov cx, $A //字色或背景色? 没有去详细了解请自己测试& A* c8 M: f2 c0 O" x$ n7 O. _3 J
mov dx, $A // 可以通过修改赋值给ax, cx, dx的值 不超过$FF- S7 d8 g5 V: p/ u3 L. V
mov ax, $A! g" M! i0 L$ o
call CallAddr1_0053BBFF
7 i* H7 m/ G$ p; b0 l1 m mov edx, dword ptr [ebp-$14]
. H4 n5 Q7 V2 c) Q9 V% y8 @) e3 v mov word ptr [edx+1], ax
" d* L% x- s5 p# Z) q/ T7 \/ j8 F8 M7 L1 e# \3 q$ N
mov cx, $10 //字色或背景色? 没有去详细了解请自己测试
3 t! j$ q" I* Z& Y# ^ mov dx, $10 // 可以通过修改赋值给ax, cx, dx的值 不超过$FF
1 _0 Y/ H$ z3 F2 j/ P% i5 G. @ mov ax, $10
; [; X2 {" R% p- }" V+ b, F2 o- i call CallAddr2_0053BBFF0 e4 y7 C) m v2 Q+ g# Z( V
mov edx, dword ptr [ebp-$14]
( c$ }6 V5 e( Y) B3 F0 ^ mov word ptr [edx+3], ax4 m/ N+ K3 ^, _ i9 q U X
jmp EndAddr3_0053BBFF //色彩赋值结束跳转到tgs0 P/ s5 y- A2 C. [- {/ v
//5 p1 T, e, x, }3 E% Z7 k
@out:
0 S& b5 ?5 D( n% X2 V jmp EndAddr1_0053BBFF //这个是跳转到默认的点
& j' [ @! D1 }9 n' e) D' R5 Q0 X: O3 B# \# B0 P3 ]; x% E
@OldCor:
; |$ |% J& w2 O jmp EndAddr2_0053BBFF // 跳转到原来16种色彩赋值
+ F1 `/ [" \4 {; N2 L6 a end |