#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

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

Сам код:

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,156

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,156

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,156

Re: DevMode

$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