Отредактировать asm файл - Assembler
Формулировка задачи:
Привет народ. У меня есть ассемблерный код из дизассемблера. Это кусок кода из программы для WebCamera моего ноутбука. Я хочу эту программу отредактировать в Hex редакторе таким образом, что бы она видео которое записует, сохраняла не в C:\Users\Administrator\Videos, а в той папке которую я укажу (у меня на диске С не хватает места для записи видео). То есть цель редактирования эксешника- что бы программа при записи видео сохраняла видео по тому пути что мне нужно, а не по пути умолчанию для видео Windows - напрмер диск D можно записать 2 часа видео наWebCamera, а диск С системный а значит меньше размером. Причем в настрйках этой программы для моей WebCamera неут возможности изменить путь для сохранения записываемых видео. Вот кусок кода из программы, он получает системный параметр - путь для файлов видео в Windows:
Как ясно из кода, функция SHGetFolderPath записует по смещению из регистра ecx (там храниться смещение переменной var_264) записует путь, где в Windows находиться папка My Videos, то есть, например для Windows 7 этот путь будет C:\Users\Administrator\Videos, функция принимает второй параметр 0x0Eh, что значит CSIDL_MYVIDEO, что она значит, должна венруть папку для видео в ОС. Я проследил отладчиком, после вызова этой функции, она возвращает результат по смещению из регистра edx - то есть этот путь в системе, что я указал. Так же я отследил отладчиком, что когда вызывается функция последняя в коде sub_4821B8, то после по регистру edx мы уже не можем видеть эначение, то есть этот путь в системе C:\Users\Administrator\Videos - куда он исчезает мне не понятно, но дальше по этому пути программа записует все снимаемые видео.
Например я хочу, что бы программа сохраняла видео в D:\SavedVideo.
У меня есть план, что я возьму каку- то малозначащую текстовую строку из сегмента данных, заменю текст в ней на D:\SavedVideo, то есть использую для хранения нужного мне пути. Второй шаг, я думаю в коде перед вызовом call sub_4821B8 последней функции в примере, поставить что- то вроде mov edx, offset "C:\SavedVide" (это псевдокод) в hex редакторе, остальное забить NOP -но я думаю программа может перестать работать.
Кто знает, может есть какой- то эффективный метод, кроме этого, или этот метод самый подходящий, вобщим, посоветуйте, как отредактировть этот экзешник. Пробывал в системе менять путь, в результате программа для WebCamera все равно записует по старому путии, не принимает изменений в системе.
Заранее спасибо.
lea ecx, [ebp+var_264] push ecx push 0 push 0 push 0Eh mov eax, [esi] call @Controls@TWinControl@GetHandle$qqrv ; Controls::TWinControl::GetHandle(void) push eax call SHGetFolderPathA test eax, eax jnz short loc_40221C mov [ebp+var_28], 38h lea edx, [ebp+var_264] lea eax, [ebp+var_14] call sub_4821B8
Решение задачи: «Отредактировать asm файл»
textual
Листинг программы
lea ecx, [ebp+var_264] push ecx push 0 push 0 push 0Eh mov eax, [esi] call @Controls@TWinControl@GetHandle$qqrv ; Controls::TWinControl::GetHandle(void) push eax call SHGetFolderPathA test eax, eax jnz short loc_40221C mov [ebp+var_28], 38h //lea edx, [ebp+var_264] mov edx, offest MyPathToSaveVideo //строка пути в сегменте данных что я прописал lea eax, [ebp+var_14] call sub_4821B8
Объяснение кода листинга программы
lea ecx, [ebp+var_264]
- данная инструкция загружает в регистр ecx смещенный адрес в сегменте данных, который, вероятно, содержит некоторые параметры или переменные.push ecx
- значение регистра ecx (возможно, адрес) сохраняется на стеке перед вызовом функции.push 0
- данная инструкция также сохраняет на стеке значение 0.push 0
- еще одно значение 0 сохраняется на стеке.push 0Eh
- на стек загружается значение 0Eh (или 14 в десятичной системе счисления).mov eax, [esi]
- значение, хранящееся по адресу, указанному в регистре esi, загружается в регистр eax.call @Controls@TWinControl@GetHandle$qqrv
- происходит вызов функции GetHandle, которая, вероятно, принадлежит классу Controls::TWinControl.push eax
- значение регистра eax (возможно, результат вызова функции) сохраняется на стеке.call SHGetFolderPathA
- происходит вызов функции SHGetFolderPathA.test eax, eax
- выполняется проверка, не равно ли значение регистра eax нулю.jnz short loc_40221C
- если значение регистра eax не равно нулю, то происходит переход к метке loc_40221C.mov [ebp+var_28], 38h
- в переменную, адрес которой находится в сегменте данных и смещен на var_28, записывается значение 38h (или 56 в десятичной системе счисления).mov edx, offest MyPathToSaveVideo
- регистр edx загружается значением, содержащимся в переменной MyPathToSaveVideo.lea eax, [ebp+var_14]
- в регистр eax загружается адрес переменной, находящейся в сегменте данных и смещенной на var_14.call sub_4821B8
- выполняется вызов функции, представленной в коде как sub_4821B8. Пожалуйста, обратите внимание, что детальное значение каждого из этих действий может зависеть от контекста, в котором используется этот код.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д