#1 09-02-2007 10:01

Sanchez
Registered: 18-08-2006
Posts: 280

DevMode

Это еще незаконченная версия, но все-таки решил выложить:

Что это:
Скрипт позволяет менять значения в памяти во время игры.

Как это работает:
Общий вид команды выглядит следующим образом:
<~>ADDR<ПРОБЕЛ>SIZE<ПРОБЕЛ>VALUE<TAB><Y>, где
ADDR – адрес;
SIZE – тип значения;
VALUE – значение.
ADDR и VALUE вводятся в шестнадцатеричном виде.
SIZE может принимать следующие значения B (BYTE – 1 байт), W (WORD – 2 байта), D (DWORD – 4 байта).
После нажатия на клавишу <TAB>, появится панелька с веденными данными (правда в десятичном виде), если все нормально жмете <Y>. Если что-то ведено неправильно придется начинать все заново. 

Пример:
Во время игры набираем:
<~>B7CE50<ПРОБЕЛ>D<ПРОБЕЛ>3E8<TAB>
Смотрим на панельку:

12045904
4
1000

Нажимаем <Y>, прибавляется $1000

Не знаю, насколько это полезно и нужно, но вдруг кому пригодится.

Сам код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
create_thread @ADDR
 
// ----------
 
:ADDR
thread 'ADDR'
alloc($SizeBuffer1, 0x40)   // 0A49A60h  
alloc($SizeBuffer2, 0x41)   // ~ + 4h
alloc($SizeBuffer3, 0x42)   // ~ + 8h
alloc($AddrBuffer1, 0x43)   // 0A49A6Ch
alloc($AddrBuffer2, 0x44)   // ~ + 4h
alloc($AddrBuffer3, 0x45)   // ~ + 8h
alloc($Value, 0x46)         // 0A49A78h
alloc($Size, 0x47)          // 0A49A7Ch
alloc($Address, 0x48)       // 0A49A80h
alloc($ESI, 0x49)           // 0A49A84h
 
$SizeBuffer1 = 0x30303030
$SizeBuffer2 = 0x30303030
$SizeBuffer3 = 0
 
$AddrBuffer1 = 0x30303030
$AddrBuffer2 = 0x30303030
$AddrBuffer2 = 0
 
$ESI = 0x969110
 
while true
    wait 0     
    if
        Player.Defined($PLAYER_CHAR)
    then
        03F0: toggle_text_draw 1
        038E: draw_box position 0.0 0.0 width 170.0 height 60.0 color 150 15 85 alpha 150
        045A: draw_text_1number 0.0 0.0 GXT 'NUMBER' number $Address  // ~1~
        045A: draw_text_1number 0.0 8.0 GXT 'NUMBER' number $Size  // ~1~
        045A: draw_text_1number 0.0 16.0 GXT 'NUMBER' number $Value  // ~1~
     
        if
            00E1:   player 0 pressed_key 4
        then
            0@ = -429863
            &0(0@,1i) = 0xA49960
            &0(0@,1i) += @GetParam         
            0572: run_asm_inject true    
        end
     
        if
            00E1:   player 0 pressed_key 11
        then
            0@ = -429863
            &0(0@,1i) = 0xA49960
            &0(0@,1i) += @Store        
            0572: run_asm_inject true
        end
    end 
end
 
:GetParam
hex
// GerParam:
    60                       // PUSHAD
    33C0                     // XOR EAX,EAX
    B8 30303030              // MOV EAX,30303030
    A3 609AA400              // MOV DWORD PTR DS:[A49A60],EAX
    A3 649AA400              // MOV DWORD PTR DS:[A49A64],EAX
    A3 6C9AA400              // MOV DWORD PTR DS:[A49A6C],EAX
    A3 709AA400              // MOV DWORD PTR DS:[A49A70],EAX   
    33C0                     // XOR EAX,EAX
    33C9                     // XOR ECX,ECX
    B9 07000000              // MOV ECX,7
    B4 00                    // MOV AH,0
    8B35 849AA400            // MOV ESI,DWORD PTR DS:[A49A84]
// begin:
    8A06                     // /MOV AL,BYTE PTR DS:[ESI]
    3C 60                    // |CMP AL,60
    74 65                    // |JE _finish
    3C 20                    // |CMP AL,20
    74 57                    // |JE _next
    80FC 00                  // |CMP AH,0
    74 0C                    // |JE _value
    80FC 01                  // |CMP AH,1
    74 0F                    // |JE _size
    80FC 02                  // |CMP AH,2
    74 3C                    // |JE _addr
    EB 50                    // |JMP _finish
// _value:
    8881 609AA400            // |MOV BYTE PTR DS:[ECX+A49A60],AL
    EB 3A                    // |JMP _rout
// _size:
    3C 42                    // |CMP AL,42
    74 0A                    // |JE _wrB
    3C 57                    // |CMP AL,57
    74 12                    // |JE _wrW
    3C 44                    // |CMP AL,44
    74 1A                    // |JE _wrD
    EB 3A                    // |JMP _finish
// _wrB:
    C705 7C9AA400 01000000   // |MOV DWORD PTR DS:[A49A7C],1
    EB 20                    // |JMP _rout
// _wrW:
    C705 7C9AA400 02000000   // |MOV DWORD PTR DS:[A49A7C],2
    EB 14                    // |JMP _rout
// _wrD:
    C705 7C9AA400 04000000   // |MOV DWORD PTR DS:[A49A7C],4
    EB 08                    // |JMP _rout
// _addr:
    8881 6C9AA400            // |MOV BYTE PTR DS:[ECX+A49A6C],AL
    EB 00                    // |JMP _rout
// _rout:
    46                       // |INC ESI
    49                       // |DEC ECX
    EB 9F                    // |JMP _begin
// _next:
    FEC4                     // |INC AH
    46                       // |INC ESI
    B9 07000000              // |MOV ECX,7
    EB 95                    // \JMP _begin
// _finish:
    68 609AA400              // PUSH 0A49A60
    E8 1C000000              // CALL Hex2Dword
    A3 789AA400              // MOV DWORD PTR DS:[A49A78],EAX
    68 6C9AA400              // PUSH 0A49A6C
    E8 0D000000              // CALL Hex2Dword
    A3 809AA400              // MOV DWORD PTR DS:[A49A80],EAX
    83C4 08                  // ADD ESP,8
    61                       // POPAD
    C3                       // RETN
    90                       // NOP
    90                       // NOP
    90                       // NOP
// Hex2Dword proc
    8B5424 04                // MOV EDX,DWORD PTR SS:[ESP+4]
    33C0                     // XOR EAX,EAX
    33C9                     // XOR ECX,ECX
// _label1:
    F602 FF                  // /TEST BYTE PTR DS:[EDX],0FF
    8A0A                     // |MOV CL,BYTE PTR DS:[EDX]
    74 1F                    // |JE _label4
    80E9 61                  // |SUB CL,61
    78 0A                    // |JS _label3
// _label2:
    C1E0 04                  // |SHL EAX,4
    42                       // |INC EDX
    8D4401 0A                // |LEA EAX,DWORD PTR DS:[ECX+EAX+A]
    EB EA                    // |JMP _label1
// _label3:
    80C1 20                  // |ADD CL,20
    79 F1                    // |JNS _label2
    80C1 11                  // |ADD CL,11
    C1E0 04                  // |SHL EAX,4
    42                       // |INC EDX
    03C1                     // |ADD EAX,ECX
    EB DA                    // \JMP _label1
// _label4:
    C3                       // RETN
// Hex2Dword EndP
// end GetParam
end
 
:Store
hex
// Store:
    60                       // PUSHAD
    33C0                     // XOR EAX,EAX
    33C9                     // XOR ECX,ECX
    A1 7C9AA400              // MOV EAX,DWORD PTR DS:[A49A7C]
    83F8 01                  // CMP EAX,1
    74 0C                    // JE _byte
    83F8 02                  // CMP EAX,2
    74 18                    // JE _word
    83F8 04                  // CMP EAX,4
    74 26                    // JE _dword
    EB 33                    // JMP _end
// _byte:   
    33C0                     // XOR EAX,EAX
    A0 789AA400              // MOV AL,BYTE PTR DS:[A49A78]
    8B0D 809AA400            // MOV ECX,DWORD PTR DS:[A49A80]
    8801                     // MOV BYTE PTR DS:[ECX],AL
    EB 22                    // JMP _end
// _word:   
    33C0                     // XOR EAX,EAX
    66 A1 789AA400           // MOV AX,WORD PTR DS:[A49A78]
    8B0D 809AA400            // MOV ECX,DWORD PTR DS:[A49A80]
    66 8901                  // MOV WORD PTR DS:[ECX],AX
    EB 0F                    // JMP _end
// _dword:   
    33C0                     // XOR EAX,EAX
    A1 789AA400              // MOV EAX,DWORD PTR DS:[A49A78]
    8B0D 809AA400            // MOV ECX,DWORD PTR DS:[A49A80]
    8901                     // MOV DWORD PTR DS:[ECX],EAX
// _end:
    61                       // POPAD
    C3                       // RETN
// end Store
End

h..p://foolroot.nm.ru/sb_forum/devmode.0.1.rar

Внимание!!! Подстановка левых значений и адресов может привести к зависанию игры.

Offline

#2 09-02-2007 10:51

Seemann
Registered: 07-08-2006
Posts: 2,158

Re: DevMode

вроде работает smile только без отображения текста на экране во время набора очень сложно. Я что-то подобное хотел с консолью замутить да руки не дошли.

Кстати, если будет нужно, вот адреса для нажатий функциональных клавиш:
http://sannybuilder.com/dev/keycodes.txt обновил, сначала старую версию залил

читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
По идее нужно выделять только один байт, но можно и так проверять.

бум тестировать smile

Last edited by Seemann (09-02-2007 10:56)

Offline

#3 09-02-2007 11:01

Sanchez
Registered: 18-08-2006
Posts: 280

Re: DevMode

Протестировал:
1) если арестовывают, игра виснет, точнее не виснет, а ... , короче не знаю как это описать.
2) если погиб работает нормально, но появляешься без одежды.
Короче х.з. из-за чего, Player.Defined использую.

Last edited by Sanchez (09-02-2007 11:02)

Offline

#4 09-02-2007 11:09

Seemann
Registered: 07-08-2006
Posts: 2,158

Re: DevMode

кстати, взгляни на это
http://freespace.virgin.net/drunk.tank/SA_Mem.zip

аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.

если погиб работает нормально, но появляешься без одежды

ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти smile. к твоему моду это отношение не имеет

Last edited by Seemann (09-02-2007 11:11)

Offline

#5 09-02-2007 11:19

Sanchez
Registered: 18-08-2006
Posts: 280

Re: DevMode

аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.

Посмотрю. Тоже хотел так делать, потом решил через скрипт.

ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти . к твоему моду это отношение не имеет

Понятно.

Offline

#6 09-02-2007 11:27

svetka
Registered: 29-12-2006
Posts: 222

Re: DevMode

Seemann wrote:

... одежда такая - специальная - она убирается после смерти...

Извините, что не в тему.
А что это за одежда такая? smile Может герою робу сшить, чтобы он из тюрьмы в ней выходил? Интересно было бы.

Last edited by svetka (09-02-2007 11:28)

Offline

#7 09-02-2007 12:06

Seemann
Registered: 07-08-2006
Posts: 2,158

Re: DevMode

1
$PLAYER_CHAR.SetClothes("GARAGELEG", "GARAGETR", Special)

это костюм, который дарит CJ'ю одна из его девушек (кажется, Мишель). Насчет робы идея интересная, кто б еще текстуры нарисовал... smile

Offline

#8 09-02-2007 12:19

svetka
Registered: 29-12-2006
Posts: 222

Re: DevMode

кто б еще текстуры нарисовал... smile

Я попробую. rolleyes

Offline

#9 10-02-2007 02:03

Capushon
Registered: 13-08-2006
Posts: 352
Website

Re: DevMode

2Seemann:

читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.

Cool! Будем тестировать.  :-)


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

Board footer

Powered by FluxBB