7.48 免杀课程X86(三)

中间笔记

#include <stdio.h>

// x86程序默认调用约定,外平栈
int __cdecl function_1(int a, int b) {
	return a + b;
}

// x64程序默认调用约定,内平栈
int __stdcall function_2(int a, int b) {
	return a + b;
}

// 将前两个参数用 ecx, edx 传入,剩下的参数从右往左入栈
int _fastcall function_3(int a, int b, int c, int d) {
	return a + b + c + d;
}

// 裸函数,不生成汇编代码
void __declspec(naked) function_4() {
	__asm {
		ret
	}
}

// 无参数无返回值的框架
void __declspec(naked) function_5() {
	__asm {
		push ebp
		mov ebp, esp
		sub esp, 0x40
		push ebx
		push esi
		push edi
		lea edi, dword ptr ds:[ebp - 0x40]
		mov eax, 0xCCCCCCCC
		mov ecx, 0x10
		rep stosd

		pop edi
		pop esi
		pop ebx
		mov esp, ebp
		pop ebp

		ret
	}
}

// 有参数有返回值的框架
int __declspec(naked) function_6(int x, int y) {
	__asm {
		push ebp
		mov ebp, esp
		sub esp, 0x40
		push ebx
		push esi
		push edi
		lea edi, dword ptr ds:[ebp - 0x40]
		mov eax, 0xCCCCCCCC
		rep stosd

		mov eax, dword ptr ds:[ebp + 8]
		add eax, dword ptr ds:[ebp + 0xC]

		pop edi
		pop esi
		pop ebx
		mov esp, ebp
		pop ebp

		ret
	}
}

int main(void) {
	function_1(1, 2);
	function_2(1, 2);
	function_3(1, 2, 3, 4);
	function_4();
	function_5();
	function_6(1, 2);

	return 0;
}

总结

主要学习了三种调用约定以及怎么编写裸函数;

Last Updated:
Contributors: Hunter-0x07