1、WIN32汇编第6课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 /coff Msg.asm 编译成obj4.把这个obj导入到vc的编译文件列表,如图7 图75.在要使用的地方
2、加上声明,然后调用函数即可,如图8 图8汇编语言调用C步骤1:头文件中声明函数,并使用 extern C 不让符号粉碎extern C void msgbox(char* szText, char* szTitle);源文件中实现上面的函数2.单独编译,注意要在release方式下,debug下有调试信息,如图9 图93.汇编中添加函数声明,并指明C调用约定Msgbox PROTO C:DWORD,:DWORD如图10 图104.调用函数即可,如图11 图11效果如图12 图12汇编中调用C库函数C库函数的实现在msvcrt.dll中 (全称:microsoft stdio visual c+
3、 run time)1.静态库方式 包含静态库即可includelib libc.lib这个静态库在VC目录下D:Program FilesMicrosoft Visual StudioVC98Lib下,如图13 图13声明C库函数,然后调用即可,如图14 图14效果如图15: 图15证明strcpy拷贝字符串成功了.2.动态库方式包含头文件和导入库include msvcrt.incincludelib msvcrt.lib名称前面通常加上crt_或者crt_即可.如图16 图16效果如图17 图174.远程线程注入之重定位静态重定位(以后介绍)动态重定位会发现在同一台机器上的不同程序里面的
4、MessageBox的地址是一样的.如图18俄罗斯方块版扫雷版PPT版 图18那么就可以在我们的程序里面首先获取到需要调用的函数的地址,将这个地址赋值给要注入的线程函数内部定义的全局变量里面,这样即可.如图19 图19线程函数的写法如图20 图20虽然pfnMsgbox里面保存的MessageBoxA的函数地址同一台机器上面是不变的,但是因为使用了offset取在编译期间就确定了pfnMsgbox这个指针变量的地址,所以远程线程函数注入到对方进程的时候就需要对pfnMsgbox的地址进行动态重定位了,做法就是前面加上ebx修正即可。解释如图21 图21进入计算器弹出MessageBox的效果,如图22 图22