네이버

어셈블리2017. 11. 20. 14:54

[1]

# include <stdio.h>

# include <Windows.h>


int main(void) {

//________________________________________________

BYTE number_byte[] = { 10, 20, 30, 40, 50, 60 };

DWORD TotalSum = 0x0;

BYTE* str_value = "%#x\n";

BYTE* total_sum_str = "summation => [%d]\n";

//________________________________________________

__asm LEA edi, dword ptr[number_byte]; // edi = &number_byte

__asm {

MOV ecx, 0x6;

MOV edx, 0x0;

L:

PUSH edx;

PUSH ecx;

MOVZX eax, BYTE ptr[edi + edx]; // eax =

ADD TotalSum, eax;

PUSH eax;

PUSH str_value;

CALL dword ptr[printf];

POP ebx;

POP ebx;

POP ecx;

POP edx;

INC edx;

LOOP L;

PUSH TotalSum;

PUSH total_sum_str;

CALL dword ptr[printf];

POP ebx;

POP ebx;

}

return 0;

}


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[3]

# include <stdio.h>

# include <Windows.h>

# define SIZE 6

//____________________________________

typedef struct Rev_arry{

DWORD Before_arry[6];

DWORD After_arry[6];

}Rev_arry, *ptr_arry;

//____________________________________

// [function prototype]

void _Init_(PVOID param);

void _Do_Rev_(PVOID param);

void _Data_printf(PVOID param);

//____________________________________

//____________________________________

int main(void) {

Rev_arry s = { 0, };

__asm {

LEA EDI, dword ptr[s]; // EDI = &s

//________________________________

PUSH EDI;

CALL dword ptr[_Init_];

POP EDI; 

//________________________________

PUSH EDI;

CALL dword ptr[_Do_Rev_];

POP EDI;

//________________________________

PUSH EDI;

CALL dword ptr[_Data_printf];

POP EDI;

//________________________________

}

return 0;

} // end of main function

//____________________________________

void _Init_(PVOID param) {

__asm {

MOV EAX, dword ptr ss : [ebp + 0x8];

MOV EBX, 0xa;

MOV ECX, 0x6;

MOV EDX, 0x0;

L: // Loop Label

// [ PUSH ]_________________________________

PUSH EDX;

PUSH EBX;

PUSH ECX;

MOV DWORD PTR[EAX + EDX], EBX;

// [ POP ]_________________________________

POP ECX; // => POP_1

POP EBX; // => POP_2

INC EBX;

POP EDX; // => POP_3

ADD EDX, 0x4;

LOOP L;

}

} // 

//____________________________________

void _Do_Rev_(PVOID param) {

__asm {

MOV EAX, dword ptr ss : [ebp + 0x8]; // EAX = param


MOV EDX, 0x14;

MOV EBX, 0x18;

// loop 

MOV ECX, 0x6;

L:

PUSH EBX;

PUSH EDX;

PUSH EAX; // EAX 값 보존

PUSH ECX; // ECX 값 보존 

PUSH dword ptr[EAX + EDX];

//POP EDX;

//SUB EDX, 0x4;

pop dword ptr[EAX + EBX];

POP ECX;

POP EAX;

POP EDX;

SUB EDX, 0x4;

POP EBX;

ADD EBX, 0X4;

LOOP L;

}

} // end of _Do_Rev_ function 

void _Data_printf(PVOID param) {

char* sprompt = "%#x ";

__asm {

MOV EAX, dword ptr ss : [ebp + 0x8];

MOV ECX, 0x6; // ecx = 0x6

MOV EDX, 0x18; // index 

L:

PUSH EAX;

PUSH EDX;

PUSH ECX;

PUSH dword ptr[EAX + EDX];

PUSH dword ptr[sprompt];

CALL dword ptr[printf];

POP EBX;

POP EBX;

POP ECX;

POP EDX;

ADD EDX, 0x4;

POP EAX;

LOOP L;

}

} // end of _Data_printf function 

'어셈블리' 카테고리의 다른 글

어셈블리 cdq  (3) 2017.12.01
랜덤 어셈블리  (0) 2017.12.01
포인터 접근 방식  (0) 2017.11.14
stack 구조 엑셀  (0) 2017.11.14
임시  (0) 2017.11.08