谁说编译器不SB
我有这么一段代码,我使用的是VS2010IDE,直接编译Release模式,开O2,谁能猜到编译器怎么给我编的
typedef HRESULT (__stdcall *FTSHGetFolderLocation)(HWND hwndOwner,
int nFolder,
HANDLE hToken,
DWORD dwReserved,
void *ppidl
);
typedef HRESULT (__stdcall *FTSHGetFolderPathW)(
_In_ HWND hwndOwner,
_In_ int nFolder,
_In_ HANDLE hToken,
_In_ DWORD dwFlags,
_Out_ LPTSTR pszPath
);
typedef BOOL (__stdcall *FTSHGetPathFromIDListW)(
_In_ void *pidl,
_Out_ LPTSTR pszPath
);
typedef void (__stdcall *FTILFree)(
_In_ VOID *pidl
);
typedef BOOL (WINAPI *FTGetFileAttributesExW)(
__in LPCWSTR lpFileName,
__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
__out LPVOID lpFileInformation
);
typedef BOOL (WINAPI *FTCreateDirectoryA)(
__in LPCSTR lpPathName,
__in LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
typedef DWORD (WINAPI *FTGetTempPathA)(
_In_ DWORD nBufferLength,
_Out_ LPSTR lpBuffer
); typedef WINADVAPI LSTATUS (APIENTRY *FTRegOpenKeyExW) (
__in HKEY hKey,
__in_opt LPCWSTR lpSubKey,
__reserved DWORD ulOptions,
__in REGSAM samDesired,
__out PHKEY phkResult
); typedef WINADVAPI
LSTATUS
(APIENTRY *FTRegQueryValueExW)(
__in HKEY hKey,
__in_opt LPCWSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_bcount_part_opt(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPBYTE lpData,
__inout_opt LPDWORD lpcbData
); typedef WINADVAPI
LSTATUS
(APIENTRY *FTRegCloseKey)(
__in HKEY hKey
); typedef HRESULT (__stdcall* FTCoInitialize)(
_In_opt_ LPVOID pvReserved
); typedef HRESULT (__stdcall* FTCoCreateInstance)(
__in REFCLSID rclsid,
__in_opt LPUNKNOWN pUnkOuter,
__in DWORD dwClsContext,
__in REFIID riid,
__deref_out LPVOID FAR* ppv); typedef void (__stdcall* FTCoUninitialize)(void); typedef BOOL (__stdcall* FTPathRemoveFileSpecW)(
__inout LPWSTR pszPath
); typedef BOOL (WINAPI* FTDeleteFileW)(
_In_ LPCWSTR lpFileName
); #define START_FUNC_ARRAY() \
struct FunctionArray \
{ \
long size
#define ADD_FUN_ARRAY(_M_, _N_) \
FT ## _N_ p ## _N_
#define END_FUNC_ARRAY() \
} #define GET_MODE_PROC_ADDRESS(_M_, _F_, _T_, _V_) \
do \
{ \
_V_ = (_T_)GetProcAddress(::LoadLibraryA(_M_), _F_); \
if (_V_ == NULL) \
{ \
ErrorLog(); \
return FALSE; \
} \
} while (FALSE) #define GET_PROC_ADDRESS(__M_, __F_) \
GET_MODE_PROC_ADDRESS(__M_, #__F_, FT ## __F_, g_funArray.p ## __F_) #define CALL(_F_) \
g_funArray.p ## _F_ START_FUNC_ARRAY();
ADD_FUN_ARRAY("shell32.dll", SHGetFolderLocation);
ADD_FUN_ARRAY("shell32.dll", SHGetFolderPathW);
ADD_FUN_ARRAY("shell32.dll", SHGetPathFromIDListW);
ADD_FUN_ARRAY("shell32.dll", ILFree); ADD_FUN_ARRAY("Kernel32.dll", GetFileAttributesExW);
ADD_FUN_ARRAY("Kernel32.dll", CreateDirectoryA);
ADD_FUN_ARRAY("Kernel32.dll", GetTempPathA);
ADD_FUN_ARRAY("Kernel32.dll", DeleteFileW); ADD_FUN_ARRAY("Advapi32.dll", RegOpenKeyExW);
ADD_FUN_ARRAY("Advapi32.dll", RegQueryValueExW);
ADD_FUN_ARRAY("Advapi32.dll", RegCloseKey); ADD_FUN_ARRAY("Ole32.dll", CoInitialize);
ADD_FUN_ARRAY("Ole32.dll", CoCreateInstance);
ADD_FUN_ARRAY("Ole32.dll", CoUninitialize); ADD_FUN_ARRAY("Shlwapi.dll", PathRemoveFileSpecW);
END_FUNC_ARRAY(); FunctionArray g_funArray = {sizeof(FunctionArray)}; BOOL InitFunction()
{
GET_PROC_ADDRESS("shell32.dll" , SHGetFolderLocation);
GET_PROC_ADDRESS("shell32.dll" , SHGetFolderPathW);
GET_PROC_ADDRESS("shell32.dll" , SHGetPathFromIDListW);
GET_PROC_ADDRESS("shell32.dll" , ILFree); GET_PROC_ADDRESS("Kernel32.dll" , GetFileAttributesExW);
GET_PROC_ADDRESS("Kernel32.dll" , CreateDirectoryA);
GET_PROC_ADDRESS("Kernel32.dll" , GetTempPathA);
GET_PROC_ADDRESS("Kernel32.dll" , DeleteFileW); GET_PROC_ADDRESS("Advapi32.dll" , RegOpenKeyExW);
GET_PROC_ADDRESS("Advapi32.dll" , RegQueryValueExW);
GET_PROC_ADDRESS("Advapi32.dll" , RegCloseKey); GET_PROC_ADDRESS("Ole32.dll" , CoInitialize);
GET_PROC_ADDRESS("Ole32.dll" , CoCreateInstance);
GET_PROC_ADDRESS("Ole32.dll" , CoUninitialize); GET_PROC_ADDRESS("Shlwapi.dll" , PathRemoveFileSpecW);
return TRUE;
}
先猜猜看,猜不到的往下看
; __int64 Initialize(void)
?Initialize@@YAHXZ proc near ; CODE XREF: DllMain+51p
; DATA XREF: .pdata:000000018000E060o
sub rsp, 28h
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, ProcName ; "SHGetFolderLocation"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CED0, rax
test rax, rax
jnz short loc_180002154 loc_18000214D: ; CODE XREF: Initialize(void)+5Bj
; Initialize(void)+84j ...
xor eax, eax
add rsp, 28h
retn
; --------------------------------------------------------------------------- loc_180002154: ; CODE XREF: Initialize(void)+2Bj
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aShgetfolderpat ; "SHGetFolderPathW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CED8, rax
test rax, rax
jz short loc_18000214D
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aShgetpathfromi ; "SHGetPathFromIDListW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEE0, rax
test rax, rax
jz short loc_18000214D
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aIlfree ; "ILFree"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEE8, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aGetfileattribu ; "GetFileAttributesExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEF0, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aCreatedirector ; "CreateDirectoryA"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEF8, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aGettemppatha ; "GetTempPathA"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF00, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aDeletefilew ; "DeleteFileW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF40, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegopenkeyexw ; "RegOpenKeyExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF08, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegqueryvaluee ; "RegQueryValueExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF10, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegclosekey ; "RegCloseKey"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF18, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCoinitialize ; "CoInitialize"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF20, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCocreateinstan ; "CoCreateInstance"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF28, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCouninitialize ; "CoUninitialize"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF30, rax
test rax, rax
jz loc_18000214D
lea rcx, aShlwapi_dll ; "Shlwapi.dll"
call cs:LoadLibraryA
lea rdx, aPathremovefile ; "PathRemoveFileSpecW"
mov rcx, rax ; hModule
call cs:GetProcAddress
xor ecx, ecx
test rax, rax
mov cs:qword_18000CF38, rax
setnz cl
mov eax, ecx
add rsp, 28h
retn
?Initialize@@YAHXZ endp ; ---------------------------------------------------------------------------
谁说编译器不SB的更多相关文章
- String解析
常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.JVM虚拟机为每个被装载的类型维护一个常量池.常量池就是该类型所用到常量的一个有序集和,包括 ...
- Java面向对象-方法的重载
Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...
- 创建String对象过程的内存分配
转载自 https://blog.csdn.net/xiabing082/article/details/49759071 常量池(Constant Pool):指的是在编译期被确定 ...
- VS2005下开发PPC2003和WM50编译器一些设置
1.vs2005开发WM5时,编译器和linker的选项配合问题 链接:http://www.mivi.name/blog/index_en.php?itemid=258 首先说ARM4 ARM4T ...
- 警惕Java编译器中那些“蜜糖”陷阱
一.前言 随着Java编译器不断地向前发展,它为程序员们提供了越来越多的“蜜糖”(compiler suger),极大地方便了程序的开发,例如,foreach的增强模式,自动拆箱与装箱以及字符串的连接 ...
- JSP编译成Servlet(五)JDT Compiler编译器
通过JSP编译器编译后生成了对应的java文件,接下去要把Java文件编译成class文件.对于这部分完全没有必要重新造轮子,常见的优秀编译工具有Eclipse JDT Java编译器和Ant编译器. ...
- .Net拾忆:CodeDom动态源代码生成器和编译器
代码文档模型CodeDom命名空间下主要有两个,很明显第一个代码逻辑分析,第二个负责代码的编译 using System.CodeDom; using System.CodeDom.Compiler; ...
- gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)
总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...
- C# 编译器 和 反编译器,你要哪个(歪头)? 我全都要(捏拳)!
前言 从 C# 6.0 开始,C# 编译器就从以前由 C++ 实现的 csc.exe 换成了用 C# 重新实现的开放式 API 式编译服务 Roslyn.这个编译器到现在已经替代了老式编译器,从前 W ...
随机推荐
- Linux下的解压缩
Linux下常见的压缩包格式有5种:zip tar.gz tar.bz2 tar.xz tar.Z 其中tar是种打包格式,gz和bz2等后缀才是指代压缩方式:gzip和bzip2 filename. ...
- 初探Remoting双向通信(二)
原 初探Remoting双向通信(二) 2013年06月25日 11:46:24 喜欢特别冷的冬天下着雪 阅读数 2977 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- 项目实战 - 混合式App开发
为何要使用混合式开发? 要说为什么使用Hybrid App [混合式开发],就要先了解什么是Native App[原生程序], Web App[网站程序]. Native App 是专门针对某一类移动 ...
- 分布式锁实现(一):Redis
前言 单机环境下我们可以通过JAVA的Synchronized和Lock来实现进程内部的锁,但是随着分布式应用和集群环境的出现,系统资源的竞争从单进程多线程的竞争变成了多进程的竞争,这时候就需要分布式 ...
- 【性能-windows端口限制】TPS上不去,应用无压力只有cpu5%,tomcat线程最高1500,增大并发出现connect 报错
现象:TPS上不去,应用无压力只有cpu5%,tomcat线程够用最高1500,增大并发出现connect 报错 原因:windows端口不够用了,或者不够回收了 解决方案: 1.运行-regedit ...
- 【Nacos】本地集群部署
关于Nacos已经展开了四篇入门文章: 初探Nacos(一)-- 单机模式启动 初探Nacos(二)-- SpringCloud使用Nacos的服务注册与发现 初探Nacos(三)-- SpringB ...
- apue第4章习题
4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化? stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性. 4.2 如果文件 ...
- Android中的onWindowFocusChanged()方法详解
Android中获取手机屏幕的高度和宽度,我们知道在onCreate方法中获取到的值都是为0的,有人说可以在onClick方法中获取值,这个也是个方法 ,但在onWindowFocusChanged方 ...
- 网格图必经点+dfs——cf1214D
先正着走一次把所有可行路径标记出来,然后倒着走两条路径,一条是能向下就向下的路径,另一条能向右就向右. 如果这两条路径相交,那么(1,1)-(n,m)路径上比有个必经点,把这个必经点封上,答案是1,如 ...
- XSS的原理分析与解剖(第二篇)
0×01 前言: 上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法.本期来说说XSS的分类及挖掘方法. 当 ...