169 похожих чатов

Как оптимизировать эти строки?: push cpFile push edi call [GetProcAddress] mov [CopyFile], eax push gcProc push

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

Тем самым при последующих будет возвращаться новый адрес имени функции, и по этой же итерации - переменная, в которую нужно сохранить адрес фунции

18 ответов

21 просмотр

делай таблицы

Aiwan \ (•◡•) / _bot
делай таблицы

но тогда это будет не оптимизация, а усложнение

у тебя ещё и 32 бита...

Алексей-Шведов Автор вопроса
Aiwan \ (•◡•) / _bot
но тогда это будет не оптимизация, а усложнение

То есть способом выше (однотипным кодом) будет работать быстрее, и оптимизировать не нужно?

Алексей Шведов
То есть способом выше (однотипным кодом) будет раб...

а ты эти запросы адресов функций только один раз делаешь?

Алексей Шведов
Да, один раз

ну на каждую функцию один раз и всё да?

Алексей-Шведов Автор вопроса
disba1ancer
ну на каждую функцию один раз и всё да?

Ну да, одна функция - один раз вызов GetProcAddress - один раз запрос на переменную, в которую нужно вернуть результат - один раз положить результат И это всё повторяется, но уже с другими

Алексей Шведов
Ну да, одна функция - один раз вызов GetProcAddres...

можешь попробовать организовать массив из следующих структур: 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

Алексей-Шведов Автор вопроса
disba1ancer
можешь попробовать организовать массив из следующи...

Я думал, чтобы оно выглядело как-то: 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 )

Алексей Шведов
Я думал, чтобы оно выглядело как-то: FuncNames: d...

у тебя не будет кучи переменных с именами, только одна на каждую функцию, имя в самой структуре это просто указатель

Алексей Шведов
Я думал, чтобы оно выглядело как-то: FuncNames: d...

такая организация позволить тебе упростить организацию цикла загрузки функций в итоге ты напишешь этот код 1 раз, и только будет таблицу расширять и имена докидывать

Алексей-Шведов Автор вопроса
disba1ancer
у тебя не будет кучи переменных с именами, только ...

По факту, сейчас у меня так и есть. Твой вариант даже будет длиннее кодом (со структурой, и инициализацией этой структуры)

Алексей Шведов
По факту, сейчас у меня так и есть. Твой вариант д...

сама структура и её инициализация ничего не стоят для бинарника там просто сгенерируются данные

Алексей Шведов
По факту, сейчас у меня так и есть. Твой вариант д...

я так понимаю ты хочешь пользоваться функцией не помещая ее в импорт?

Алексей-Шведов Автор вопроса

а как ты используешь GetProcAddress если ты без импортов делаешь прогу?

Алексей-Шведов Автор вопроса
Aiwan \ (•◡•) / _bot
а как ты используешь GetProcAddress если ты без им...

Ищу в PEB адрес kernel32, получаю export table и ищу GetProcAddress

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта