Obj файлы на топчане или...


Битва за API - часть 3


Если во всем ассемблерном листинге заменить "WriteFile" на "_imp__WriteFile@20", то линкер переварит его вполне нормально и даже не отрыгнет. Нет, это не опечатка. Именно "_imp__WriteFile@20", а не "__imp__WriteFile@20". Почему?! Да потому, что второй символ прочерка транслятор добавит самостоятельно. Если же сразу указать два символа прочерка, то на выходе их образуется целых три, а это уже передоз.

Копируем "demo_3.asm" в "demo_3_test.asm", загружаем его в FAR по <F4>, давим <CTRL-F7> (replace) и заменяем "WriteFile" на "_imp__WriteFile@20", ассемблируем как и раньше, после чего повторяем попытку линковки с явным указанием имени библиотеки KERNEL32.LIB:

 

$link /SUBSYSTEM:CONSOLE demo_3_test.obj KERNEL32.LIB

Microsoft (R) Incremental Linker Version 5.12.8181

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

 

demo_3_test.obj:error LNK2001: unresolved external symbol _GetVersion

demo_3_test.obj:error LNK2001: unresolved external symbol _SetStdHandle

demo_3_test.obj:error LNK2001: unresolved external symbol _CloseHandle

demo_3_test.exe:fatal error LNK1120: 39 unresolved externals

Листинг 5 результат линковки после замены WriteFile на _imp_WriteFile@20

Оторвать мыщъх'у хвост! Это работает! Количество ошибок уменьшилось на единицу и первое неразрешенное имя теперь не _WriteFile, а _GetVersion! Переименовав оставшиеся API-функции, мы добьемся нормальной линковки программы, но… это же сколько труда предстоит! И в каждом новом ассемблерном файле, эту тупую работу придется повторять заново, вращая хвостом вплоть до полного его залегания. А ведь мы, мыщъх'и, не хотим, чтобы наш хвост залегал, верно?

Настоящие мыщъх'и (хакеры в смысле) идут другим путем — воспользовавшись директивами "externdef" и "equ" они создают для каждой API-функции свой алисас (alias), заставляющий транслятор трактовать функцию "func" как "__imp__func@XX". В частности, для WriteFile это будет выглядеть так:




Начало  Назад  Вперед