标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-2443]   作者: 闲云野鸡 发表于: [2019-08-10]

本文共 [472] 位读者顶过

1.几个处理器的编译宏

_M_IX86 : 32bit处理器

_M_AMD64 : 64bit AMD处理器 (VC2008以前)

_M_X64 : 64bit AMD and Intel处理器(VC2008及以后),

_M_IX64 : 64bit Itanium处理器

在同一代码中,需要区分64位和32位代码时,可以直接用宏即可,如下示例

#if defined(_M_IX86)

    //32位代码

#elif defined(_M_X64)

    //64位代码

#endif

[出自:jiwo.org]


2.vs64位内联汇编的使用

因为64VC不再支持__asm{},所以只能用单独新建asm汇编文件,并编译成*.obj文件,再用VC链接该obj文件

步骤:


  • vs中随便新建一个空白文件后,将扩展名更改为*.asm
  • 在asm文件中,写好汇编代码,只能用子程序,如下示例:


.386

.model flat, stdcall

.code

TestProc  PROC

         //汇编代码

         RET

TestProc endp



  • 在32位中需要加入".386  .model flat, stdcall",64位中不需要加,加了编译不过去,至于汇编代码如何写,是另外的知识。
  • 在其它需要引用该汇编函数的源文件中,添加以下声明:


EXTERN_C  void  TestProc();

后该函数即可在VC源文件中调用。


  • 设置asm文件的生成方式


在asm文件上点击右键,选择“属性”:

然后点击左侧的“常规”,“从生成中排除”选择“否”,“项类型”选择“自定义生成工具”,然后点击应用。

此时在“常规”下面就会出现“自定义生成工具”的条目。

点击它,64位设置“命令行”为  ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm,32位设置“命令行”为  ml /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

设置输出为 $(IntDir)%(fileName).obj, 该项必须配置,否则VS认为该文件没有设置输出就会不处理它,同时它也告诉链接器到哪里去找这个obj文件。

上面的 $(IntDir)是一个宏,表示当前生成配置的目录,比如"x64\Debug"。

经过以上配置之后,asm文件编译生成的obj文件就会自动生成到相应配置的目录。

obj文件可以单独编译,然后在链接器中加入该obj文件。

  • 还有一点,在64位工程下,可以将32位的汇编asm设置为“从生成中排除”,这样在编译64位的时候,就不会编译32的asm文件,同理,32位工程下,可将64位asm“从生成中排除”。

3. __thiscall的拦截方法

_thiscall 应用于“C++”成员函数,_cdecl、_stdcall都是从右至左的顺序压参数入栈,而_thiscall同样是从右至左的顺序压参数入栈,但会把this指针存放于ecx寄存器中,所以在拦截_thiscall时,可以按照_stdcall的拦截方法进行拦截,但是要平衡ecx寄存器,即在拦截的函数刚开始时,保存ecx数据,在最后执行原函数前,把保存的ecx函数再存入ecx中,如下示例

static int WINAPI 拦截函数()

{

         int nEcx =0;

         __asm

         {

                  move nEcx,ecx

         }

         //要处理的代码

         __asm

         {

                  move ecx, nEcx

         }

         return 原函数();

}

如果是64位程序,则需要将内联代码换成asm文件,asm如下代码。

.code

GetEcx PROC

         mov eax, ecx

         RET

GetEcx endp


SetEcx PROC v1:DWORD

         mov ecx, v1

         RET

SetEcx endp

end


评论

暂无
发表评论
 返回顶部 
热度(472)
 关注微信