[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