وقتی آدرس api رو تو حافظه ذخیره کنی، فرقی نمیکنه که با استفاده از LoadLibrary تو برنامه این کار رو بکنی یا سیستم عامل قبل اجرا این کار رو انجام بده.
من تا بحال کار دقیقی روی این موضوع نکردم ولی ایده میتونه این باشه
function CalcApiAddr(Coded: Cardinal): Cardinal; register; assembly
asm
mov ax, Coded
// یک مقدار عملیات ریاضی برای دکود کردن
// نتیجه تو eax قرار بگیره
end;
بعدش موقع صدا زدن
asm
mov eax, CodedApiAddress
push eip
pop ebx
add ebx, 8
push ebx
push eax
jmp near @CalcApiAddr
// قرار دادن پارامترها در استک، البته نه به طرز تابلو
push eax
ret
end
یا روشهای غیر مستقیم دیگه برای فراخوانی یک آدرس. اینطوری دیگه آدرس حاضر و آماده یک api تو حافظه نیست که با یک تحلیل ساده، محل jmp و یا call های به اون آدرس رو بشه پیدا کرد.
نا گفته نماند این تکنیک ها جلوی BP روی حافظه رو نمیگیره و بنا براین باید به تعداد دفعات معتنا بهی از آدرس ابتدای api استفاده غیر از فراخوانی اصلی بکنید که به راحتی محلش پیدا نشه
در نهایت یک راه هم اینه که چند تا pop و pushهای اول api رو خودمون انجام بدیم و آدرس کد شده مربوط به ابتدای تابع api نباشه.