Отредактировать asm файл - Assembler

Узнай цену своей работы

Формулировка задачи:

Привет народ. У меня есть ассемблерный код из дизассемблера. Это кусок кода из программы для WebCamera моего ноутбука. Я хочу эту программу отредактировать в Hex редакторе таким образом, что бы она видео которое записует, сохраняла не в C:\Users\Administrator\Videos, а в той папке которую я укажу (у меня на диске С не хватает места для записи видео). То есть цель редактирования эксешника- что бы программа при записи видео сохраняла видео по тому пути что мне нужно, а не по пути умолчанию для видео Windows - напрмер диск D можно записать 2 часа видео наWebCamera, а диск С системный а значит меньше размером. Причем в настрйках этой программы для моей WebCamera неут возможности изменить путь для сохранения записываемых видео. Вот кусок кода из программы, он получает системный параметр - путь для файлов видео в Windows:
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
Как ясно из кода, функция 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 все равно записует по старому путии, не принимает изменений в системе. Заранее спасибо.

Решение задачи: «Отредактировать 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

Объяснение кода листинга программы

  1. lea ecx, [ebp+var_264] - данная инструкция загружает в регистр ecx смещенный адрес в сегменте данных, который, вероятно, содержит некоторые параметры или переменные.
  2. push ecx - значение регистра ecx (возможно, адрес) сохраняется на стеке перед вызовом функции.
  3. push 0 - данная инструкция также сохраняет на стеке значение 0.
  4. push 0 - еще одно значение 0 сохраняется на стеке.
  5. push 0Eh - на стек загружается значение 0Eh (или 14 в десятичной системе счисления).
  6. mov eax, [esi] - значение, хранящееся по адресу, указанному в регистре esi, загружается в регистр eax.
  7. call @Controls@TWinControl@GetHandle$qqrv - происходит вызов функции GetHandle, которая, вероятно, принадлежит классу Controls::TWinControl.
  8. push eax - значение регистра eax (возможно, результат вызова функции) сохраняется на стеке.
  9. call SHGetFolderPathA - происходит вызов функции SHGetFolderPathA.
  10. test eax, eax - выполняется проверка, не равно ли значение регистра eax нулю.
  11. jnz short loc_40221C - если значение регистра eax не равно нулю, то происходит переход к метке loc_40221C.
  12. mov [ebp+var_28], 38h - в переменную, адрес которой находится в сегменте данных и смещен на var_28, записывается значение 38h (или 56 в десятичной системе счисления).
  13. mov edx, offest MyPathToSaveVideo - регистр edx загружается значением, содержащимся в переменной MyPathToSaveVideo.
  14. lea eax, [ebp+var_14] - в регистр eax загружается адрес переменной, находящейся в сегменте данных и смещенной на var_14.
  15. call sub_4821B8 - выполняется вызов функции, представленной в коде как sub_4821B8. Пожалуйста, обратите внимание, что детальное значение каждого из этих действий может зависеть от контекста, в котором используется этот код.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5
Похожие ответы