1、定义纯汇编的祼函数:
void __declspec(naked) __stdcall NakeFunction()
{
__asm {
nop
ret
}
}
2、编译器中断指令用于设置INT 3中断
__debugbreak();
KdBreakPoint();
3、内核下修改内存读写属性
VOID WPOFF()
{
ULONG_PTR cr0 = 0;
Irql = KeRaiseIrqlToDpcLevel();
cr0 =__readcr0();
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
}
VOID WPON()
{
ULONG_PTR cr0=__readcr0();
cr0 |= 0x10000;
__writecr0(cr0);
KeLowerIrql(Irql);
}
4.禁止编译器优化指定函数
#pragma optimize( "", off )
void demo()
{
return;
}
#pragma optimize( "", on )
5.利用汇编求宽字符串长度并存到变量dwUrlLen,同时复制到指定变量wzUrl,以下功能相当于wcslen和memcpy
// 插入一段取出URL串
pushad
pushfd
// 求长度
xor ebx,ebx
mov ecx,edi
mov esi,edi
lable:
mov ax,word ptr ds:[ecx] ; 循环计算长度
add ecx,0x2 ;宽字符加2
cmp ax,bx ;是否等于0表示结束字符
jnz short lable
sub ecx,esi ;字符串指针开始和结束位置相减差为长度
sar ecx,1
mov dword ptr ds:[dwUrlLen], ecx
// 拷贝字符串
lea edi,wzUrl
rep movs word ptr es:[edi],word ptr ds:[esi]
popfd
popad
6.在64位编程中内嵌汇编代码的写法示例:
文件名:
x64.asm
汇编代码:
.code
sub proc
xor rax,rax
ret
sub endp
end
编译命令: ml64.exe /c x64.asm
------------------------------------------------
1.引用代码加入下面一行代码:
extern "C" __stdcall sub();
2.同时在链接中添加x64.obj
2019/01/25