PE FORMAT] -1- 基本構造

[ VA & RVA ]

- VA (Virtual Address) : プロセス仮想メモリーの絶対アドレス

- RVA (Relative Virtual Address) : プロセス仮想メモリーの相対アドレス

** VA = RVA + ImageBase

 

FILEでのアドレスは offset

MEMORYでのアドレスは VA

 

f:id:velup:20190420011426j:plain

https://resources.infosecinstitute.com/2-malware-researchers-handbook-demystifying-pe-file/#gref

 

C] pointer - &,*

int *imsip;  // メモリーaddressを保存するために宣言。

int imsi = 5;  // imsiというint型変数に5を入れる。

 

&imsi; // int型変数は4bit (address ex: 000000 - 000004) ここで&imsiはimsi変数の値が保存されているメモリーaddressの先頭addressが格納される。

 

imsip = &imsi; // imsipにimsiのaddressを格納。

*imsip ; // *imsip = imsi

C#] yield , IEnumerator , IEnumerable

using System;
using System.Text;
using System.Collections.Generic;

namespace MyPractice
{

    public class MyEnumerator
    {
        private int data = { 10, 20, 30, 40, 50 };
        public IEnumerator<int> GetEnumerator() //IEnumerator **GetEnumerator
        {
            // **IEnumerator<T>
            foreach (int k in data)
                yield return k;
        }
    }



    class Program
    {
        static IEnumerable<int> YieldNumber() //IEnumerable
        {
            yield return 10;
            yield return 20;
            yield return 30; 
        }



        static void Main(string
 args)
        {

            /*
             * 2019.04.17
             * by 4ru4ka
             */
            foreach (int ynum in YieldNumber())
                Console.WriteLine(ynum);

            // for use IEnumerator
            var ie = new MyEnumerator();
            foreach (int lnum in ie)
                Console.WriteLine(lnum);
        }
    }
}


/*
 * OUTPUT:
 * 


10
20
30
10
20
30
40
50

 */

C#] Loop

using System;
using System.Text;
using System.Collections.Generic;

namespace MyPractice
{
    class Program
    {
        static void Main(string args)
        {

            /*
             * 2019.04.17
             * by 4ru4ka
             */


            // for Loop
            for (int i = 0; i < 10; i++)
                Console.WriteLine(i);

            // foreach
            string
 array = new string[] { "Hello", "I'm", "4ru4ka" };
            foreach (string s in array)
                Console.WriteLine(s);

            // for < foreach
            string[,,] carr = new string[,,]
            {
                { {"a11","a12"},{"b11","b12"} },
                { {"c11","c12"},{"d11","d12"} }
            };
            foreach (string s in carr)
                Console.WriteLine(s);

            // while, do~while
            int mi = 0;
            while(mi < 10)
            {
                Console.WriteLine(mi);
                mi++;
            }
            do
            {
                Console.WriteLine(mi);
                mi--;
            } while (mi >= 0);




            // Loop with List 
            // using System.Collections.Generic; << for List
            List<char> imsiList = new List<char>();
            imsiList.Add('A');
            imsiList.Add('B');
            imsiList.Add('C');
            imsiList.Add('D');
            foreach (char a in imsiList)
                Console.WriteLine(a);

        }
    }
}

C#] if, switch

using System;
using System.Text;

namespace MyPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * C# - if, switch 
             * 2019.04.05
             * by 4ru4ka   
             */

            if (args.Length != 1)
            {
                Console.WriteLine("program /option");
                return;
            }
            bool switch1 = false;
            bool switch2 = false;

            string cw = "This is default";
            string opt = args[0];

            switch (opt.ToLower())
            {
                case "/sw1":
                    switch1 = true;
                    break;
                case "/sw2":
                case "/switch2": //case: case:
                    switch2 = true;
                    break;
                default:
                    Console.WriteLine(cw);
                    break;
            }


        }
    }
}

C#] Operator

using System;
using System.Text;

namespace MyPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * C# - Operator
             * 2019.04.01
             * by 4ru4ka   
             */

            //Shift operator
            int i = 2;
            i = i << 5;

            int j = 3;
            j = j << 5;

            Console.WriteLine("{0} , {1}", i, j);

            // ?? Operator (over C# 3.0)
            string str = null;
            string s = str ?? "Hello"; // when str is null, put "Hello" in to s.

            Console.WriteLine(s);
        }
    }
}



C#] enum & enum flag

using System;
using System.Text;

namespace MyPractice
{
    class Program
    {
        enum Univ
        {
            Meiji,      // 0
            Aoyama,     // 1
            Rikkyo,     // 2
            Chuo,       // 3
            Hosei = 10    // 10
        }

        [Flags]
        enum Univf
        {
            Meiji = 1,
            Aoyama = 2,
            Rikkyo = 4,
            Chuo = 8,
            Hosei = 16
        }

        static void Main(string[] args)
        {

            /*
             *     C# - enum , flag enum
             *     2019.04.01
             *     by 4ru4ka           
             */

            // enum
            Univ myUniv;

            myUniv = Univ.Meiji; // 0

            // enum -> int
            int univVal = (int)myUniv;

            if (myUniv == Univ.Meiji)
            {
                Console.WriteLine("Welcome to Meiji");
            }



            //flag enum
            Univf uf = Univf.Chuo | Univf.Hosei;    // OR演算子でufの中にChuo,Hosei両方を同時に保存。

            if *1 // HasFlag returns true / false whether uf has a Hosei flag  
                {
                    Console.WriteLine(uf.ToString());
                }
            }
        }
    }
}






*1:uf & Univf.Chuo) != 0) // AND演算子でufの中にChuoが入っているかどうかをboolで返す。
            {
                if (uf.HasFlag(Univf.Hosei