edi
call [GetProcAddress]
mov [GetCurrentProcess], eax
push cFile
push edi
call [GetProcAddress]
mov [CreateFile], eax
Можно ли как-то записать имена функций (cFile, gcProc, ...) в одну переменную, и брать их циклом, при этом сделать такой же массив с результатом GetProcAddress, и так же в цикле возвращать результат GetProcAddress по итерации в этом массиве, тем самым упростить это на:
getFunctions:
inc ecx
lea eax, [FuncNames+ecx]
push eax ; CreateFile
push edi
call [GetProcAddress]
mov [Functions+ecx], eax ; CreateFile dd 0
cmp ecx, FuncNames.size
jne getFunctions
Тем самым при последующих будет возвращаться новый адрес имени функции, и по этой же итерации - переменная, в которую нужно сохранить адрес фунции
делай таблицы
но тогда это будет не оптимизация, а усложнение
у тебя ещё и 32 бита...
То есть способом выше (однотипным кодом) будет работать быстрее, и оптимизировать не нужно?
а ты эти запросы адресов функций только один раз делаешь?
ну на каждую функцию один раз и всё да?
Ну да, одна функция - один раз вызов GetProcAddress - один раз запрос на переменную, в которую нужно вернуть результат - один раз положить результат И это всё повторяется, но уже с другими
можешь попробовать организовать массив из следующих структур: struc func_table_entry name_ptr { funcptr dd 0 name dd name_ptr } ; начало массива CreateFile func_table_entry CreateFile_name CreateWindowEx func_table_entry CreateWindowEx_name ; конец массива CreateFile_name db "CreateFileA", 0 CreateWindowEx_name db "CreateWindowExA", 0
Я думал, чтобы оно выглядело как-то: FuncNames: db 'CreateFileA', 0 db 'CloseHandle', 0 db 'ExitProcess', 0 dd 1 Functions: dd 0 dd 0 dd 0 Тем самым не нужно резервировать кучу переменных с именами, и мусорить в .data, а брать с оффсетами Functions+0 = CreateFileA Functions+1 = CloseHandle Только вот сложности с проведением инициализации. Приходится писать функцию, которая будет читать строчки до 0 в FuncNames с проверкой итерации (чтение - ноль? - вернуть адрес в стэк - чтение - ещё ноль? - это вторая строка, вернуть адрес в стэк - чтение - 1 - это конец таблицы, все адреса в таблицы в стэке) А потом брать из стэка push ESP+OffsetFunctionName push edi call [GetProcAddress] mov [Functions+ecx], eax (После этого очистить стэк от аргументов GetProcAddress )
у тебя не будет кучи переменных с именами, только одна на каждую функцию, имя в самой структуре это просто указатель
такая организация позволить тебе упростить организацию цикла загрузки функций в итоге ты напишешь этот код 1 раз, и только будет таблицу расширять и имена докидывать
По факту, сейчас у меня так и есть. Твой вариант даже будет длиннее кодом (со структурой, и инициализацией этой структуры)
сама структура и её инициализация ничего не стоят для бинарника там просто сгенерируются данные
я так понимаю ты хочешь пользоваться функцией не помещая ее в импорт?
Мне хочется сделать код меньше и удобнее.
а как ты используешь GetProcAddress если ты без импортов делаешь прогу?
Ищу в PEB адрес kernel32, получаю export table и ищу GetProcAddress
Обсуждают сегодня