#2 Программирование » Как десантироваться посреди вражеского кода? » 27-12-2012 19:37

Wire
Replies: 2

Всем доброго времени суток. Сюда призываются гуру ассемблера, знающие, как (и можно ли) в файле программы заменить кусочек байткода на свой. В данном случае заменить push ecx (51) на push 8 (6A 08). Сперва попробовал как последний нуб «раздвинуть» файл и воткнуться в нужном мне месте, но разумеется это не сработало, так что, в общем, вот.

#3 Re: Работа с памятью, EXE » Вопрос по памяти » 30-11-2011 17:33

Даже если бы число округлялось, при разных параметрах функция бы возвращала разные значения, а так постоянно 20

#4 Re: Работа с памятью, EXE » Вопрос по памяти » 29-11-2011 18:25

@Jack Daniel's,
Эта функция возвращает высоту по Z в точке XY. Пример... Скажем, мы хотим замутить чит, который создает машину в координатах маркера на радаре — мы берем XY этого маркера, а потом с помощью этой функции вычисляем Z в этой точке, и создаем там машину.

__add

Говорю же, я не так хорошо знаю ассемблер, как хотелось бы. Положительное смещение — признак наличия аргументов, отрицательное — их отсутствия? 34 и 38 — это получается два флоата, по четыре байта? Можешь написать пример конкретно для этой функции? Желательно с использованием и ассемблера, и… не ассемблера, не знаю, как такой способ называется smile Тот, каким я вызывал эту функцию.
А, и где можно найти процедуры, которые вызывают эту функцию?

#5 Re: Работа с памятью, EXE » Вопрос по памяти » 29-11-2011 16:11

А плохая новость — конкретно эта функция постоянно возвращает 20

___add

Вызывал и собейтовским методом, и своим, все равно всегда 20.

float FindGroundZForCoord ( float x, float y )
{
	typedef float ( __stdcall *pFuncAddr ) ( float x, float y );
	pFuncAddr pFunc = (pFuncAddr) FUNC_FindGroundZForCoord;
	return pFunc ( x, y );
}

#6 Re: Работа с памятью, EXE » Вопрос по памяти » 29-11-2011 15:50

Заранее извиняюсь за дурацкие вопросы — допустим, я нашел в базе функций сана такую запись:

00569660	92	_Get_Z_for_XYPoint

1) Что означает число 92?
2) Как узнать количество и тип аргументов этой функции?
Полез в ИДУ, отправился на искомый адрес, нашел sub_569660, сгенерировал псевдокод:

int __cdecl sub_569660(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, float a14)
{
  return sub_401BC5(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
}

Тут 14 параметров, а в исходниках собейта эта функция описана как:

float CWorldSA::FindGroundZForPosition(float fX, float fY)

— два параметра.

Сама функция выглядит так:

float CWorldSA::FindGroundZForPosition(float fX, float fY)
{
	DWORD dwFunc = FUNC_FindGroundZForCoord;//константа для 0x569660;
	FLOAT fReturn = 0;
	_asm
	{
		push	fY
		push	fX
		call	dwFunc
		fstp	fReturn
		add		esp, 8
	}
	return fReturn;
}

Я не силен в ассемблере, может, здесь функция как-то сокращена?
Заранее спасибо.

#8 Re: Работа с памятью, EXE » Вопрос по памяти » 17-11-2011 19:37

Может, этот вопрос уже задавался, но где в сане хранятся адреса с матрицей поворотов костей актера, и можно ли их менять?
А, и еще — по какому адресу находятся координаты и размеры боундбокса игрока?

#9 Re: Работа с памятью, EXE » Вопрос по памяти » 19-08-2011 17:12

И главное: параметры надо передавать в обратном порядке!

Ах вооот оно что, спасибо. Кстати, а тогда в опкоде 0AA7 параметр для возвращаемого значения нужно таки указывать первым или последним?

#10 Re: Работа с памятью, EXE » Вопрос по памяти » 19-08-2011 15:17

Спасибо. Кстати, как правильно пользоваться опкодами 0AA5 и 0AA7? (Справку я читал smile)
А точнее, что неправильно в этом коде?

:test1
wait 0
if and
not actor.Dead($PLAYER_ACTOR)
0ADC: test_cheat "VIDEO"
jf @test1
    //0B17: show_message_box "Preved!"
    0AA5: call 0x7476B0 num_params 2 pop 2 1 "Logo.mpg"
    wait 2000
jump @test1

По адресу — процедура, проигрывающая видео, void __cdecl PlayMPEG(int nShowCmd, char *filename)

___Edit:

Хммм, перечитал хелп еще раз, написано, что строковые параметры использовать нельзя, а как же тогда?

#11 Re: Работа с памятью, EXE » Вопрос по памяти » 18-08-2011 22:00

Ооо…
Я делаю минимод по фильму Эквилибриум, думаю, кто смотрел, сразу поймет smile
Хочу сделать Ката Стрелка (Gun Kata, не уверен, что в русском это слово склоняется) — вымышленное (и не очень) боевое искусство, принцип которого заключается в статистическом предсказании позиций противника в перестрелке и, как следствие, мастерское владение двумя пистолетами.
Собственно по моду — чтобы реализовать эту идею, нужно либо научить игрока стрелять из любой анимации, либо как-то вручную направлять руки при стрельбе. Трудностей не боюсь, можете предлагать самые зверские решения, лишь бы они были smile

___Edit

Так вот, - узнаём оффсет с параметрами .0 .0 .0, далее - .0 1.0 .0, ну и получаем позицию и вектор направления кости в 3D пространстве, так сказать.

Вообще когда у меня раньше возникала надобность узнать координаты и угол кости, я просто аттачил к ней объект, потом считывал его координаты, а затем опкодом 0400 узнавал «направление» — и вуаля! Или ты это и имел ввиду?

#12 Re: Работа с памятью, EXE » Вопрос по памяти » 18-08-2011 15:40

Хотел спросить в «одном вопросе», но видимо простыми опкодами этого не сделаешь. Так вот, вопрос первый: можно ли как-то заставить пистолеты стрелять во время воспроизведения актером анимации? И вопрос второй: как узнать углы поворота и позицию… ээ… рук, когда они стреляют из двуручного оружия — узнать, а также поменять.

#13 Re: Работа с памятью, EXE » Вопрос по памяти » 04-05-2011 13:44

И все бы ничего, но ведь я когда-то нашел тутор по написанию трейнера для пинбола (правда потом потерял, но восстановил, как мне кажется, полностью), и тогда все прекрасно работало…

PS если у кого-то этот тутор есть, киньте)
Ибо тот сайт как упал, так больше и не вставал.

#14 Re: Работа с памятью, EXE » Вопрос по памяти » 02-05-2011 17:56

Спустя долгое время снова занялся саномоддингом, а здесь мне так и не ответили. Печально(
Решусь спросить еще раз…

Нахождение окна и процесса проходит нормально, а вот денежки из адреса не считываются.
Помогите найти ошибку, заранее спасибо.

HWND hWnd = FindWindow( 0, L"GTA: San Andreas" );
  if( !hWnd )
    cout << "Окно не найдено.\n";
  else
    cout << "Окно найдено.\n";
  
  DWORD pid;
  
  if( !GetWindowThreadProcessId( hWnd, &pid ) ) 
    cout << "Процесс не найден.\n";
  else 
    cout << "Процесс найден, ID: " << pid << endl;
  
  DWORD money;

  HANDLE hProc = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );
  ReadProcessMemory( hProc, (LPCVOID) 0xB7CE50, &money, 4, 0 )
                cout << money << endl;

#15 Re: Работа с памятью, EXE » Вопрос по памяти » 01-03-2011 21:53

Приветствую всех, есть тут такой нубский вопрос…
Есть код:
       

HWND hWnd = FindWindow( 0, L"GTA: San Andreas" );
	if( !hWnd )
		cout << "Окно не найдено.\n";
	else
		cout << "Окно найдено.\n";
	
	DWORD pid;
	
	if( !GetWindowThreadProcessId( hWnd, &pid ) ) 
		cout << "Процесс не найден.\n";
	else 
		cout << "Процесс найден, ID: " << pid << endl;
	
	DWORD money;

	HANDLE hProc = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );
	if( !ReadProcessMemory( hProc, (LPCVOID) 0xB7CE50, &money, 4, 0 ) )
	        cout << "Ошибка.\n";
	else 
                cout << money << endl;

Окно находит нормально, ид процесса совпадает. Но на чтении адреса выдает ошибку. Если проверку убрать, то по этому адресу находит какую-то хренотень. Подскажите, что неправильно, наставьте на путь истинный rolleyes

#16 Re: Вопросы по скриптингу » Один вопрос » 14-10-2010 20:49

Народ, не мог бы кто-то написать на спп исходник-туториал по написанию библиотеки, содержащей функции чтения значения по статическому и динамическому адресам? Надеюсь, не слишком наглая просьба blush
Заранее спасибо.

#17 Re: Вопросы по скриптингу » Один вопрос » 13-10-2010 20:27

Помню я высчитывал координаты прицеленного места довольно рачным путем, я аттачил обьект к кисти игрока и увеличивал его координаты по прямой, пока он не натыкался на препятствие, и тогда высчитывал координаты обьекта.
Формулу сам ищу давно))

#18 Re: Вопросы по скриптингу » Один вопрос » 12-10-2010 20:14

CraZZZy-GameRRR wrote:

А как сделать, чтоб анимация повторялась не постонно, а через некоторые интервалы времени, например, чтоб актёр выпивал каждые 10 сек.

Посмотри внимательно мой скрипт. Там перед выполнением анимации скрипт ждет рандумное количество мс - от 5000 до 15000.

0605: actor $PLAYER_ACTOR perform_animation_sequence "M_SMKLEAN_LOOP" IFP_file "LOWRIDER" 4.0 loop 1 0 0 0 time -1 // versionA

Параметр, стоящий после слова loop отвечает за повторение анимации, 1 - анимация будет повторяться, 0 - проиграется один раз. При одноразовом использовании параметр после time следует заменить на wait <время> (Последний параметр будет работать только в последовательности, объявлять которую нужно опкодом 0615: define_AS_pack_begin 15@ и завершать опкодом 0616: define_AS_pack_end 15@)
Только в последовательности вместо хендла актера указывай -1. А, присобачивать актера к указанной последовательности - 0618: assign_actor 2@ to_AS_pack 15@

#19 Re: Вопросы по скриптингу » Один вопрос » 12-10-2010 17:17

Хмммм, ну можно создать другого актера по тому же алгоритму, только в руку ему воткнуть сигарету, а анимку бухания заменить на анимку курения.

#20 Re: Вопросы по скриптингу » Один вопрос » 11-10-2010 18:28

Расскажи, чо за плагин?
Ну в евро ехешнике отличные от us адреса, и ессно он вылетает (хотя странно, что он не вылетает еще при старте игры grin)
__Или я, как всегда, что-то путаю в разновидностях ехе)

#21 Re: Вопросы по скриптингу » Один вопрос » 11-10-2010 17:06

Sergey81,

Именно пропустить её можно, удалив или закомментив этот кусок в скрипте)
Если ты просто не можешь набрать нужное кол-во очков, можешь воспользоваться скриптом:

// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007
{$VERSION 3.1.0027}
{$CLEO .cs}
thread 'score'
:score
wait 0
if and
0AB0: 16 //шифт
0AB0: 77 //m
jf @score
0A8C: write_memory 0xA4EC20 size 1 value 999999 virtual_protect 0
0A8C: write_memory 0xA4A948 size 1 value 999999 virtual_protect 0
wait 100
jump @score

Он устанавливает 999999 очков танцев и лоурайдерства.

__PS: сингл у меня не работает, поэтому скрипт не тестировался, но должен работать.

#22 Re: Вопросы по скриптингу » Один вопрос » 10-10-2010 22:20

CraZZZy-GameRRR wrote:

Мне нужно, чтобы пед шёл по улице и пил из бутылки.

Хммм, ну вроде пьёт у нас из бутылок педтип 8 (Грув Стрит Фемилис), думаю, если задать актеру этот педтип, то он будет время от времени пить из бутылки))
Если нужно, чтобы конкретный актер иногда прихлёбывал - я бы сделал так:

:создать_актера
wait 0
model.Load(#модель)
model.Load(#пиво)
009A: 1@ = create_actor_pedtype 8 model #модель at $x $y $z
0107: 0@ = create_object #пиво at 0.0 0.0 0.0
09A0: actor 1@ attach_object 0@ with_offset $offset_x $offset_y $offset_z on_bone <5 или 6, 5 - левая рука, 6 - правая> 16 perform_animation "NULL" IFP_file "NULL" time -1
:пить_пиво
wait 0
0209: 2@ = random_int_in_ranges 5000 15000
wait 2@
if
not actor.Dead(1@)
then
0605: actor 1@ perform_animation_sequence "<анимация_бухания>" IFP_file "<ифп_с_анимацией>" 4.0 loop 0 0 0 0 time -1 // versionA
else
070B: set_actor 1@ onbone_attached_object_operation 0 
object.Destroy(0@)
jump @создать_актера \ еще куда-то
end
jump @пить_пиво

__Внес несколько поправок.

#23 Re: Вопросы по скриптингу » Один вопрос » 10-10-2010 22:08

mr.Andrei wrote:

2Sw[ee]t
Ну или легче, поставлю вопрос по другому. Есть машина с тюнингом, и рядом нужно создать такую же машину с такимже тюнингом

Хм, ну впринципе это можно сделать путем гета\сета каждого элемента тюнинга в отдельности, как то:

0988: get_car $car1 paintjob 0@
06ED: set_car $car2 paintjob 0@

0803: car $car1 have_hydraulics
07FF: set_car $car2 hydraulics 1

03F3: get_car $car1 primary_color_to 1@ secondary_color_to 2@
0229: set_car $car2 primary_color_to 1@ secondary_color_to 2@

09E9: car $car2 add_single_nitro

Насчет колёс и остального не уверен, скорее всего есть какой-то адрес памяти, где записаны номера колёс, спойлеров, юбок и прочего.

#24 Re: Вопросы по скриптингу » Один вопрос » 10-10-2010 21:49

Хм, группа анимации.. А что это? smile Не тип педа случаем?

#25 Re: Вопросы по скриптингу » Один вопрос » 10-10-2010 21:44

CraZZZy-GameRRR,

0665: get_actor 88@ model_to 94@

Board footer

Powered by FluxBB