#1 17-08-2013 10:27

mgmoldova
Registered: 20-06-2013
Posts: 13

Про hex вставки

Видел скрипт, который подставлял значения в hex.
Вот например:

hex
"Example" 20 "%d" 00
end

Вот сам скрипт

{$CLEO .cs}
 
0000:
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ // IF and SET
0AA7: call_function 30@ num_params 1 pop 0 "samp.dll" 0@
 
 
0A8E: 2@ = 0@ + 0x212AC4
0A8D: 1@ = read_memory 2@ size 4 virtual_protect 1
 
//0AB1: call_scm_func @CDXUTDialog__AddSlider 10 struct 1@ samp_base 0@ id 0x80 x 32 y 320 width 512 height 16 min 0 max 100000 value 100
 
0AC6: 10@ = label @labelTEXTFormat offset
0AC6: 3@ = label @callback offset
0A8E: 2@ = 3@ + 12
0A8C: write_memory 2@ size 4 value 10@ virtual_protect 1
 
0A8E: 2@ = 0@ + 0x212A24 //_cSampChatInfo
0A8D: 10@ = read_memory 2@ size 4 virtual_protect 1 //_cSampChatInfo
0A8E: 2@ = 3@ + 18
0A8C: write_memory 2@ size 4 value 10@ virtual_protect 1
 
0A8E: 10@ = 0@ + 0x79680 //_cSampChatInfo
0A8E: 2@ = 3@ + 24
0A8C: write_memory 2@ size 4 value 10@ virtual_protect 1
 
0AC6: 3@ = label @jmp offset
0A8E: 2@ = 3@ + 1
0A8E: 10@ = 0@ + 0xAD7D0 //_cSampChatInfo
0A8C: write_memory 2@ size 4 value 10@ virtual_protect 1
 
0AC6: 3@ = label @callback offset
0A8E: 2@ = 0@ + 0x94940 // int __stdcall CDXUTDialog__SetCallback(int pCallback, int pUserContext)
0AA6: call_method 2@ struct 1@ num_params 2 pop 0 params 0 3@
 
0A93: end_custom_thread
 
:callback
hex
{00} 60                                          //PUSHA                                     
{10} 8B4424 18                                  //MOV EAX, [ESP+18]                                 
{14} 50                                          //PUSH EAX         
{14} 8B4424 18                                  //MOV EAX, [ESP+18]                                 
{18} 50                                          //PUSH EAX                                 
{18} B8 11111111                                //MOV EAX, 11111111h  format                     
{18} 50                                          //PUSH EAX                                       
{1C} B8 11111111                                //MOV EAX, 11111111h  cSampChatInfo
{1C} 50                                          //PUSH EAX                                   
{20} B8 11111111                                //MOV EAX, 11111111h  func addDebugMessage
{20} FFD0                                        //CALL EAX
{20} 83C4 10                                    //ADD ESP, 10h
{10} 61                                          //POPA
end
 
:jmp
hex
{10} B8 11111111                                //MOV EAX, 11111111h  AD7D0 CallbackDialogChat
{10} FFE0                                        //JMP EAX
end
 
 
:labelTEXTFormat
hex
"ControlID:" 20 "0x%.8x" 20202020 "Event:" 20 "0x%.4x" 00
end
 
//example
//0AB1: call_scm_func @CDXUTDialog__AddSlider 10 struct 1@ samp_base 0@ id 0x44 x 240 y 32 width 400 height 16 min 0 max 100 value 50
:CDXUTDialog__AddSlider
//A0D30 CDXUTDialog__AddSlider(int ID, int x, int y, int width, int height, int min, int max, int value, char isDefault, int ppCreated)
0A8E: 20@ = 1@ + 0xA0D30
0AA6: call_method 20@ struct 0@ parmas 10 pop 0 ppCreated 0 isDefault 0 value 9@ max 8@ min 7@ height 6@ width 5@ y 4@ x 3@ id 2@
0AB2: ret 0

Можно ли это сделать без ассемблерных вставок и как это сделать?
То есть необходимо подставить цифры в теле hex под %d

Offline

#2 18-08-2013 13:58

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

Re: Про hex вставки

не совсем понятен вопрос, сформулируйте его более подробно

на всякий случай, есть опкод 0AD3

Формат опкода
0AD3: 0@v = format "%d + %d = %d" 2 2 4
Описание
0AD3 форматирует строку и записывает результат в стринговую переменную или в строку по указателю. В данном примере в 0@v будет записана строка "2 + 2 = 4"

Параметры
1.  [out] Строка, в которую будет записан результат. Строка отвечает соглашению о строках;

2.  [in] Формат строки, отвечает соглашению о строках;

...  [in] Аргументы, подставляемые в строку (до 35 аргументов).

он выдает строку, заменяя параметры на нужные.

Offline

#3 20-08-2013 10:26

mgmoldova
Registered: 20-06-2013
Posts: 13

Re: Про hex вставки

У меня вмещает только 30 аргументов. Если аргументов больше 30, то:
Access violation at address 004C59FC in module 'sanny.exe'. Write of address 0056FB4D.

Offline

#4 20-08-2013 11:48

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

Re: Про hex вставки

Это баг. Компилятор неправильно работает с параметрами выше 32. В случае 0AD3 это первые 2 параметра опкода + 30 аргументов.
До исправления бага придется ограничиться 30-ю аргументами.

Кстати, число аргументов в любом случае будет не больше 33, т.к. максимальное число параметров для опкода равно 35.

Offline

#5 20-08-2013 17:41

Alien
Registered: 12-10-2008
Posts: 564

Re: Про hex вставки

Информация по 35 параметрам в справке устарела - это ограничение было в первых версиях. Сейчас его нет.

Offline

Board footer

Powered by FluxBB