收藏 分享(赏)

MicroSoft编译器你不可不知的秘密.doc

上传人:kpmy5893 文档编号:7330657 上传时间:2019-05-15 格式:DOC 页数:5 大小:48.50KB
下载 相关 举报
MicroSoft编译器你不可不知的秘密.doc_第1页
第1页 / 共5页
MicroSoft编译器你不可不知的秘密.doc_第2页
第2页 / 共5页
MicroSoft编译器你不可不知的秘密.doc_第3页
第3页 / 共5页
MicroSoft编译器你不可不知的秘密.doc_第4页
第4页 / 共5页
MicroSoft编译器你不可不知的秘密.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、MicroSoft 编译器你不可不知的秘密标 题: 【原创】MicroSoft 编译器你不可不知的秘密作 者: 黑猫号时 间: 2012-12-15 23:33链 接: http:/ 本文是写给调用 dll 原理不太清楚,以及不知道怎么调用未声明但是已经导出的windows API(例如 Native API) ,大牛自动略过本文。2. 一些基础的知识不会介绍,例如什么是函数调用约定(如:_stdcall、_cdecl 、_fastcall等), 为什么要加 extern “C” 、 #ifdef _cplusplus。也不会介绍一些很容易百度(谷歌)到的知识。用控制台直接编译程序以下演示内容

2、全部通过控制台编译,在开始之前先大概的说下环境(加这部分是因为本文内容就是有关导出函数环境的 O(_)O )。VC6 其实可以免安装使用的,将 bin、lib、include 文件夹( 如果想要 alt、mfc 功能,那把他们的文件也一起 )直接复制到盘中走到哪带到哪,再写个脚本设置下环境变量,就可以随心编译。 (PS: 我用的控制台编译,之前我就说过了) 。脚本如下形式:echo offset path = %path%;%cd%bin;set include=%cd%Include;%cd%MFCinclude;%cd%ATLInclude;set lib=%cd%lib;%cd%MFCL

3、ib;cmd.exe头文件、lib、dll 是怎么回事a. 头文件int main(int argc, char* argv)return 0;以上代码直接在控制台编译通过很正常。那以下呢?int main(int argc, char* argv)printf(“hello world!n”);return 0;编译器会拒绝编译,显示 printf 函数未定义,通常的做法是加入 stdio.h 头文件。可是,如果不加这个头文件呢,可否有方案解决这个文件?答案是:有。在调用 printf 之前加入声明、编译时加入 msvcrt.lib 即可。#pragma comment(lib, “MSVC

4、RT“)#ifdef _cplusplusextern “C“ #endifint printf( const char *format , . );#ifdef _cplusplus;#endifint main(int argc, char* argv)printf(“hello world!n“);return 0;命令行定位到文件所在位置,然后输入 cl *.cpp 即可编译出 exe 程序来(虽然有些警告信息 o()o )b. Lib 与 dll 文件自己写一个 user32.dll 动态库调用里面的 MessageBoxA 调用会是什么情况呢?User32.asm 内容(以下为汇编

5、版本,在下面的下载包中有个 C 语言版).386.model flat,stdcalloption casemap :none.code;DLL 入口DllEntry proc _hInstance,_dwReason,_dwReservedmov eax,1retDllEntry Endp; 导出函数MessageBoxA proc _dwNumber1:DWORD,_dwNumber2:DWORD,_dwNumber3:DWORD,_dwNumber4:DWORDxor eax,eaxretMessageBoxA endpEnd DllEntryUser32.def 文件内容(一些人喜欢用

6、_declspec( dllexport ) 导出函数,我喜欢用 def 文件申明,这样我的 dll 可以导出自己想要的任何名字,还可以选择不导出名字)EXPORTSMessageBoxA编译命令 ml /c /coff /Cp *.asm link /section:.bss,S /dll /def:user32.def /subsystem:windows *.obj生成一个 user32.lib,将此文件重命名为 myuser32.lib (防止于编译器库中的 user32.lib 冲突(原 user32.lib 后面有用))。再创建一个测试的 cpp 文件:#pragma commen

7、t(lib, “myuser32.lib“)#ifdef _cplusplusextern “C“ #endifint _stdcall MessageBoxA( unsigned long,char*,char*,unsigned long);#ifdef _cplusplus;#endifint main()MessageBoxA(0, “你好“, “标题栏“, 0);return 0;编译命令: cl *.cpp运行下编译出来的程序,呀!糟糕,为什么运行的时候出现了一个 MessageBox 对话框呢?难道没有调用我们自己写的 user32.dll 么?但是链接的时候明明是链接我们的 l

8、ib 文件的呀!这时候你是不是觉得很奇怪?这个问题留给你了(跟 PE 格式、系统有关) 。调用库 lib 中没有的函数记得网上一直流传着一个函数叫 SetLayeredWindowAttributes 可以改变窗体,可是调用这个函数的方法都是先 LoadLibrary 再 GetProAddress 地址以后调用的,那么可以利用上面调用 MessageBoxA 的方法去调用这个函数了,再在上面的代码中加入如下代码:SetLayeredWindowAttributes proc _dwNumber1:DWORD,_dwNumber2:DWORD,_dwNumber3:DWORD,_dwNumbe

9、r4:DWORDxor eax,eaxretSetLayeredWindowAttributes endp导出函数也相应的加一个 SetLayeredWindowAttributes。编译出 user32.lib 文件,重新命名为 myuser32.lib再写一个窗体程序,直接加入 SetLayeredWindowAttributes 声明,myuser32.lib 库 后调用,编译通过。#pragma comment(lib, “myuser32.lib“)#pragma comment(lib, “user32.lib“)#include #ifdef _cplusplusextern “

10、C“ #endiflong WINAPI SetLayeredWindowAttributes( HWND hWnd, int cr,unsigned char bAlpha,unsigned long dwFlags);#ifdef _cplusplus;#endif/ 略完整的示例代码见下载包(MicroSoft 编译器你不可不知的秘密 自己构建 lib 文件调用 窗口透明 )调用 Native API 所谓的应用层 Native API 就是 ntdll 导出的函数。这些函数大部分是直接通过调用门进入系统内核运行的,在 ring3 中是比较底层的函数(或许自己利用 int 0x2e、sy

11、senter 进入内核才算底层吧) ,对于杀毒软件的主动防御有很好的免杀作用(比如ReadProcessMemory,CreateRemoteThread 替换成更底层的NtReadVirtualMemory、NtCreateThread 可以解决 ring3 的主动防御、导入表查杀) 。所以Native API 在安全方面有着重要的作用。微软一直强调不要调用 Native API 函数,以后可能会没有这个函数或者参数改变,在ring3 可以完全不必担心这个问题,因为在驱动中早有 Zw 函数是文档化的了,而 Zw 函数众所周知是跟 Nt 函数同参数的,所以 ntdll 中的函数发生变化可能性非

12、常小,再者如果参数变化也无法,最多就本程序奔溃,不会影响到系统。下载包中带了几个 ntdll.lib 文件(MicroSoft 编译器你不可不知的秘密 直接调用 ntdll 函数 ntdll) ,可以接加入工程链接,如果发现这个 lib 中没有的函数,那么利用上面说的方法自己创建一个 ntdll.lib 文件导入工程。例子代码中有对 NtAllocateVirtualMemory 的调用,其他函数方法类似,关于函数的查找直接到 wdk 文档中找,或者微软在线帮助(把函数名改成 Zw 开头,如ZwAllocateVirtualMemory)#pragma once#ifndef _NTDLL_H

13、H_#define _NTDLL_HH_#pragma comment(lib, “ntdll“)#include typedef unsigned long* ULONG_PTR;#define NTSTATUS LONG#ifdef _cplusplusextern “C“#endifNTSTATUS WINAPI NtAllocateVirtualMemory(HANDLE ProcessHandle,PVOID *BaseAddress,ULONG_PTR ZeroBits,PSIZE_T RegionSize,ULONG AllocationType,ULONG Protect);#ifdef _cplusplus;#endif#endif / _NTDLL_HH_可以写个 ntdll.h 的头文件,以后要用 ntdll 函数的时候就添加这个头文件,没有的函数就继续加进去,这样这个头文件就日渐的完善了。不过像 CreateRemoteThread 这种函数在ntdll 中实现还是比较蛋疼的,要想让这个函数跟原来的运行效果一样还要下一点功夫才行,涉及的函数涉及的数据相当多,不过奖品也是很丰盛的,你用你自己实现方法,360 就不会吭声了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报