You are not logged in.
Pages: 1
Это еще незаконченная версия, но все-таки решил выложить:
Что это:
Скрипт позволяет менять значения в памяти во время игры.
Как это работает:
Общий вид команды выглядит следующим образом:
<~>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
вроде работает только без отображения текста на экране во время набора очень сложно. Я что-то подобное хотел с консолью замутить да руки не дошли.
Кстати, если будет нужно, вот адреса для нажатий функциональных клавиш:
http://sannybuilder.com/dev/keycodes.txt обновил, сначала старую версию залил
читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
По идее нужно выделять только один байт, но можно и так проверять.
бум тестировать
Last edited by Seemann (09-02-2007 10:56)
Offline
Протестировал:
1) если арестовывают, игра виснет, точнее не виснет, а ... , короче не знаю как это описать.
2) если погиб работает нормально, но появляешься без одежды.
Короче х.з. из-за чего, Player.Defined использую.
Last edited by Sanchez (09-02-2007 11:02)
Offline
кстати, взгляни на это
http://freespace.virgin.net/drunk.tank/SA_Mem.zip
аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.
если погиб работает нормально, но появляешься без одежды
ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти . к твоему моду это отношение не имеет
Last edited by Seemann (09-02-2007 11:11)
Offline
аналог того, что ты сделал - можно просматривать память во время игры, видеть текущий адрес, менять значения и т.д. Реализовано через длл.
Посмотрю. Тоже хотел так делать, потом решил через скрипт.
ну это видимо фича игры, там просто одежда такая - специальная - она убирается после смерти . к твоему моду это отношение не имеет
Понятно.
Offline
... одежда такая - специальная - она убирается после смерти...
Извините, что не в тему.
А что это за одежда такая? Может герою робу сшить, чтобы он из тюрьмы в ней выходил? Интересно было бы.
Last edited by svetka (09-02-2007 11:28)
Offline
$PLAYER_CHAR.SetClothes("GARAGELEG", "GARAGETR", Special)
это костюм, который дарит CJ'ю одна из его девушек (кажется, Мишель). Насчет робы идея интересная, кто б еще текстуры нарисовал...
Offline
кто б еще текстуры нарисовал...
Я попробую.
Offline
2Seemann:
читаем адрес по локальной переменной (значение в первом столбце) и если возвращает 255, то нажата кнопка из второго столбца, если 16711680 (0xFF0000), то из правого.
Cool! Будем тестировать. :-)
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Pages: 1