Помогите с ассемблером.
|
|
Волк-1024 | Дата: Понедельник, 19.12.2011, 22:42 | Сообщение # 1 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Здравствуйте.
В общем я в асме еще новичок, но кое-какие познания у меня есть...
Решил попытаться написать прогу без таблицы импорта. Все шло хорошо. Получил базу Kernel'а 32 Получил таблицу экспорта. Получил из неё адрес GetProcAddres
А на финальном этапе запара...
Вот кусок кода:
Code lea eax, _GH ; кладем в eax имя "GetModuleHandleA" push eax push __K32 ; помещаю в стек адрес базы kernel call ecx ; вызываю функцию GetProcAddress mov _GetProcAddress, ecx ; сохраняю адрес в переменную. mov _GetModuleHandle, eax ; тоже самое
push OFFSET _K32 ; помещаю имя "kernel32.dll" call _GetModuleHandle push OFFSET _LL ; запоминаю имя "LoadLibraryA" push eax ; запоминаю полученный хэндл модуля call _GetProcAddress ; а тут фигня... mov _LoadLibrary, eax mov eax, 0h
При трассировке в OllyDbg на вызове GetProcAddress происходит крэш на строчке внутри kernel'а Code ADD BYTE PTR DS:[EBX],AL Ошибка "Access violation when writing to [00000000] Хотя если вызвать функцию нормально с теми же параметрами, то всё хорошо...
Помогите пожалуйста кто может...
P.S. могу приложить exe с ошибкой.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Вторник, 20.12.2011, 00:03 |
|
| |
GReIIIHuK | Дата: Вторник, 20.12.2011, 15:58 | Сообщение # 2 |
Участник
Зарегистрирован: 15.05.2011
Группа: Пользователи
Сообщений: 98
Статус: Offline
| Не люблю ассамблер, поэтому и не учил его даже.(хотя многие говорят что лучше выучить)
Skype:"greiiihuk." Да, я преступник. Мое преступление — любопытство. Быть может умру я, умрут многие, но идея останется жить навсегда. Я работаю не только за спасибо.(+) ©
|
|
| |
Волк-1024 | Дата: Вторник, 20.12.2011, 18:01 | Сообщение # 3 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Да. Действительно на асме можно сделать то, что на других языках не возможно или почти. Например, я физически не представляю, как на Delphi из exe выдрать таблицу импорта функций (в теории я это представляю).
А по теме есть что-то?
Pascal, C\C++, Assembler, Python
|
|
| |
Волк-1024 | Дата: Вторник, 20.12.2011, 18:31 | Сообщение # 4 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Вот я дурак!!!! ))) Я даже не посмотрел на значение регистра ecx. После вызова GetProcAddres'а он изменился на адрес дос заголовка. В результате чего я совершенно не то записал в переменную, которую потом и вызывал! ))) Теперь всё работает. Всем спасибо.
P.S. отладчик мой лучший друг )
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Вторник, 20.12.2011, 18:44 |
|
| |
Волк-1024 | Дата: Воскресенье, 05.02.2012, 14:03 | Сообщение # 5 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Привет всем. Снова проблемы с ассемблером. Не стал создавать новую тему.
Есть свежеиспечённая функция:
Code function GetStrSize(S: PAnsiChar): integer; assembler; asm
push ecx xor ecx, ecx {Обнуляем ecx. Чтоб не было ошибок}
@_a:
mov bl, byte ptr [ecx+eax] {Загружаем следующий символ} or bl, 0h {Проверяем. Есть ли еще буквы?} je @_c {Если нет, то на выход} inc cx {Если есть. Увеличиваем cx на один} jmp @_a
@_c:
mov eax, ecx {Записываем результат} pop ecx
end;
Как из названия видно. Она для получения размера строки. Так вот не получается вывести результат. Т.е не совсем получается....
Code MessageBox(0, PChar(IntToStr(GetStrSize('Fuck'))), nil, 0); Результат отлично выведется. Будет 4.
А если так: Code Edit1.Text:=(IntToStr(GetStrSize('Fuck'))); То ноль эмоций. Ничего не происходит. Почему? И как исправить?
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Воскресенье, 05.02.2012, 15:43 |
|
| |