dword

只有汇编能告诉你为什么

陌路散爱 提交于 2020-02-29 16:29:18
分析了一下编译器(VC8)生成的汇编代码,发现问题是编译器造成的。。。 在没有用SSE优化的情况下,编译器生成的代码非常好,直逼手写代码。。。 而在用了SSE优化以后,编译器不能合理的分配和利用寄存器,并且生成了很多冗余的指令,导致代码简直一团糟,接近于弱智水平。。。 具体可参看下面的汇编代码,我在重要的行后面加了注释,方便理解。。。 没用SSE并行: ; COMDAT ?intersectEye@RayTriangle@@QAE_NPAVe_Ray@@PAVe_RayState@@@Z _TEXT SEGMENT _t$ = -56 ; size = 4 _dot_nd$ = -52 ; size = 4 _hit$ = -48 ; size = 12 _ray_dir$ = -36 ; size = 12 _ray_src$ = -24 ; size = 12 _bary$ = -12 ; size = 12 ?intersectEye@RayTriangle@@QAE_NPAVe_Ray@@PAVe_RayState@@@Z PROC NEAR ; RayTriangle::intersectEye, COMDAT ; _this$ = ecx ; _ray$ = eax ; _state$ = edi ; 146 : { sub esp, 56 ; 00000038H ;

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

架设WIN32汇编程序的开发环境

孤街浪徒 提交于 2020-02-29 06:51:16
笔者在学习 Windows 下的图形界面应用程序( GUI,Graphical User Interface )的时候碰到的第一个麻烦就是架设 WIN32 汇编程序的开发环境,在这里笔者愿意和大家分享这段经历。 笔者认为大家应该首先具备下列概念和文件: 操作系统:首先大家应该具备 Windows98 以上操作系统,看起来这并不是什么难事 文本编辑程序:你可以选择 Windows 自带的记事本,或者是 Ultraedit ,而笔者却独钟于 VisualStudio 应用程序编程接口( API, Application Programming Interface ) , 它是一些类型、常量和函数的集合,它提供了直接通过编程操纵对象的途径 Win32 平台软件开发包( Win32 Platform SDK ),这一些用于创建 Windows 应用程序的工具软件、库文件、代码例程和帮助文档的集合。 Microsoft 提供 Platform SDK 的免费下载 http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en Microsoft 汇编器( ML ,它是 Make.exe 和 Link.ext 首字母的缩写)

老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些

做~自己de王妃 提交于 2020-02-29 06:39:10
我一直建议大家不要倾向于学习IL的原因有二: IL能够说明的内容太少,包括大部分.NET“必知必会”。 IL能够获得的信息从高级语言中也大都可以知道。 而这篇文章便是希望通过实例来把第1点解释清楚,而第2点则留给下一篇文章来解释。 在文章开始之前,我先要承认两个错误: 首先,上一篇文章对于“IL”和“汇编”的阐述还有些混淆。在这方面某些朋友给出了一些更确切地说法,IL是一种为.NET平台设计的汇编语言,拥有大量.NET平台中特有的高级特性。而x86汇编等则是与机器码一一对应的文字形式代码。不过为了方便表述,在这一系列文章中,还是 以“IL”来指代.NET平台上的中间语言,以“汇编”来指代x86汇编这种和特定CPU平台紧密相关的事物 ——包括之前那篇文章,其实是在阐述IL和汇编之间的关系和区别,以及该如何对待它们的问题,而并非为IL是否可以被叫做是“汇编”进行争论。 其次,在第1篇文章发布的时候,现在这篇文章,也就是本系列第2篇的标题是“汇编可以看到太多IL看不到的东西”。不过后来在半夜重读这篇文章,并且仔细整理这篇文章的示例时发现出了一个问题——我并不是在讲汇编,要探索CLR中的各种问题也并不是仅仅靠汇编来发现的。当时写文章的时候谈了太多的IL和汇编,最终把自己的思路也给绕了进去。现已修改,希望没有给朋友们造成误解,抱歉。今后我也会尽量避免此类情况发生。 好了

Dll注入:Ring3 层 APC注入

£可爱£侵袭症+ 提交于 2020-02-26 14:04:50
APC,即Asynchronous procedure call,异步程序调用 APC注入的原理是: 在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断,当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数,利用QueueUserAPC()这个API,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的, 注入流程: 1.根据进程名称得进程ID 2.枚举该进程中的线程 3.将自己的函数插入到每个线程的APC队列中 #include "stdafx.h" #include <windows.h> #include <Tlhelp32.h> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct _THREADLIST { DWORD dwThreadId; _THREADLIST *pNext; }THREADLIST; int q = 0; DWORD GetProcessID(const char *szProcessName); int EnumThreadID(DWORD dwPID, THREADLIST * pdwTidList); THREADLIST*

WinAPI【远程注入】hook注入 Delphi 实例一

旧时模样 提交于 2020-02-26 14:00:12
(okwary) 小叹的学习园地 线程注入实例: 我们知道在NT及以上操作系统提供了一个函数VirtualAllocEx,利用这个函数我们可以在其它进程中申请一块内存,其定义如下: function VirtualAllocEx( //在其它进程中申请一块内存 hProcess: THandle;// hProcess为要申请内存的进程的句柄 lpAddress: Pointer;// lPAddress为地址指针,指向需要分配的某地址范围内的页面的起始地址,可以设为nil,由系统确定分配空间的地址. dwSize:dword; //分配内存区域的大小. flAllocationType: DWORD; //flAllocationType为分配类型,在这儿我们设为MEM_COMMIT. flProtect: DWORD//flProtect为新分配内存的存取保护类型,可设为PAGE_EXECUTE_READWRITE来定义其为可执行可读写. ): Pointer; stdcall;//函数执行成功后,将会返回所分配页面的基址. 其中,可以用如下方法得到指定的窗口所属的进程的进程句柄. Function GetProcessHandle: THandle; var WndHandle, PID: THandle; begin WndHandle := FindWindow(nil,

javascript 调用C++函数

柔情痞子 提交于 2020-02-26 12:41:56
分3步: 一》实现IDispatch 接口    #ifndef _IDISPIMP_H_ #define _IDISPIMP_H_ // idispimp.h class CImpIDispatch : public IDispatch { protected: ULONG m_cRef; public: CImpIDispatch(void); ~CImpIDispatch(void); STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); //IDispatch STDMETHODIMP GetTypeInfoCount(UINT* pctinfo); STDMETHODIMP GetTypeInfo(/* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ ITypeInfo** ppTInfo); STDMETHODIMP GetIDsOfNames( /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR *rgszNames, /* [in] */ UINT cNames, /*

IE浏览器安全设置脚本

北慕城南 提交于 2020-02-25 18:40:17
@echo off ::echo Zones:0:我的电脑 1:本地Intranet区域 2:受信任的站点区域 3:Internet区域 4:受限制的站点区域 ::echo DWORD: 0:允许 1:提示 3:禁止 ::echo 1001 下载已签名的 ActiveX 控件 ::echo 1004 下载未签名的 ActiveX 控件 ::echo 1200 运行 ActiveX 控件和插件 ::echo 1201 对没有标记为安全的 ActiveX 控件进行初始化和脚本运行 ::echo 1405 对标记为可安全执行脚本的 ActiveX 控件执行脚本 ::echo 1406 通过域访问数据源 ::echo 1607 跨域浏览子框架 ::echo 2200 文件下载自动提示 ** ::echo 2201 ActiveX 控件自动提示 ** reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2" /v "1001" /t REG_DWORD /d 00000000 /f reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

注册表手动添加Windows服务

断了今生、忘了曾经 提交于 2020-02-23 07:19:21
方法一:修改注册表 在注册表编辑器,展开分支"HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services",在右侧窗格中显示的就是本机安装的服务项。如果要新建服务,只须点击"编辑→新建→项" ,然后为此项命名,如"test";然后右击该项,选择"新建→字符串值"或"新建→Dword值"即可。添加一个服务项目具体需要添加的键值如下: "DisplayName",字符串值,对应服务名称; "Description",字符串值,对应服务描述; "ImagePath",字符串值,对应该服务程序所在的路径; "ObjectName",字符串值,值为"LocalSystem",表示本地登录; "ErrorControl",Dword值,值为"1"; "Start",Dword值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止; "Type",Dword值,应用程序对应10,其它对应20。 另外,还要在"test"项下新建一个"Enum"项。如果有些必须通过srvany来加载的还必须 添加另外的Parameters子项在该项中提供详细的要加为服务的程序所在的路径。而上面的那个 路径就需要指到srvany所在的路径。 方法二:脚本操作 sc create myserver binpath= c:/windows/Sc/myserver.exe

cve-2016-0167学习笔记

馋奶兔 提交于 2020-02-20 15:07:20
主要参考了leeqwind的博客+个人理解 漏洞原理 CVE-2016-0167发生在win32k!xxxMNDestroyHandler中,漏洞发生的根本原因是win32k!xxxMNDestroyHandler在释放窗口处理消息WM_UNINITMENUPOPUP时可能被回调到用户进程,在用户回调中执行自定义的挂钩函数(hook)时可能会引起窗口对象内存区域的分配或释放。在之后的分析中我们可以看到处理消息的函数win32k!xxxSendMessageTimeout在执行完用户自定义hook之后没有检查相应内存区域的有效性直接执行了一个函数回调spwndNotify->lpfnWndProc,所以漏洞的利用思路可以是利用hook double free掉窗口内存区域,然后重新分配占位窗口内存的spwndNotify->lpfnWndProc成员域来劫持控制流进而提权。 前置知识 1.用户模式回调 传统上,win32子系统是在client-server runtime subsystem (CSRSS)的基础上实现的,客户端的线程都有一个对应的服务端线程存在,他们通过fastLPC通信。后来为了提高性能,微软将大部分服务端的组件转移到了内核模式,这就引入了win32k.sys。 这样做的好处是减少了线程切换的次数和内存需求;但是和以前直接在相同特权级别直接访问代码/数据相比,用户