汇编代码中是如何确定apI函数的地址的呢?
问:对于dll中的函数地址在运行前是不知道的,那在文件代码中是如何编写 “call 函数地址” 之类的指令的呢?
答:虽然不知道函数的地址是什么,但是知道函数的地址写在哪里。可以[函数地址的指针]来读取函数的地址
比如:
上图是 汇编中调用KERNEL32.GetModuleHandleA的语句,让我们查看这条语句跳转到哪里
由上图可知 语句跳转到了地址为0040127A的位置,这里是一个JMP指令,这里的意思是说,对402004的值解引用,然后跳转,可能说的不太清楚,直接看图
下图是 402004地址的值
由图可知00402004的值是75f816d0
下图是下一个跳转的位置
由图可知 API地址的位置正是402004的位置,看来402004就是KERNEL32库的IAT了,在程序装载到进程时,PE装载器会把API的地址放入IAT的位置,在程序只要用解引用的方式调用IAT地址的值,就可以以不变应万变了