WIN32汇编-第6课2012年12月17日星期一15:291.识别程序所使用的变成语言.汇编语言:程序入口处代码毫无章法.如图1:图1C语言:入口代码比较有规律如图2:图22.编译器的保存寄存器环境命令uses寄存器名称列表如图3:图3如图4图4编译器帮助我们保存了寄存器环境.3.C语言与汇编语言混合编程①C语言调用汇编步骤1:.inc文件中声明函数原型,注意是C约定,如图5图52.源文件中实现该函数,如图6图63.然后用命令行ml/c/coffMsg.asm编译成obj4.把这个obj导入到vc的编译文件列表,如图7图75.在要使用的地方加上声明,然后调用函数即可,如图8图8②汇编语言调用C步骤1:头文件中声明函数,并使用externC不让符号粉碎externCvoidmsgbox(char*szText,char*szTitle);源文件中实现上面的函数2.单独编译,注意要在release方式下,debug下有调试信息,如图9图93.汇编中添加函数声明,并指明C调用约定MsgboxPROTOC:DWORD,:DWORD如图10图104.调用函数即可,如图11图11效果如图12图12③汇编中调用C库函数C库函数的实现在msvcrt.dll中(全称:microsoftstdiovisualc++runtime)1.静态库方式包含静态库即可includeliblibc.lib这个静态库在VC目录下D:\ProgramFiles\MicrosoftVisualStudio\VC98\Lib下,如图13图13声明C库函数,然后调用即可,如图14图14效果如图15:图15证明strcpy拷贝字符串成功了.2.动态库方式包含头文件和导入库includemsvcrt.incincludelibmsvcrt.lib名称前面通常加上crt_或者crt__即可.如图16图16效果如图17图174.远程线程注入之重定位①静态重定位(以后介绍)②动态重定位会发现在同一台机器上的不同程序里面的MessageBox的地址是一样的.如图18俄罗斯方块版扫雷版PPT版图18那么就可以在我们的程序里面首先获取到需要调用的函数的地址,将这个地址赋值给要注入的线程函数内部定义的全局变量里面,这样即可.如图19图19线程函数的写法如图20图20虽然pfnMsgbox里面保存的MessageBoxA的函数地址同一台机器上面是不变的,但是因为使用了offset取在编译期间就确定了pfnMsgbox这个指针变量的地址,所以远程线程函数注入到对方进程的时候就需要对pfnMsgbox的地址进行动态重定位了,做法就是前面加上ebx修正即可。解释如图21图21进入计算器弹出MessageBox的效果,如图22图22