• 病毒实验一


    title: viruslab1
    date: 2015-12-30 20:18:39
    categories: virus
    tags: virus

    工具:vs2012 ollydbg

    part1

    • 步骤1:编写内嵌汇编程序add.c 计算x+y 并调用printf()函数输出结果
    int add(int x,int y)
    {
      __asm{
    	//返回x+y的值  
      }
    }
    int main()
    {
      //输出add(2,4)的值
    }
    
    • 步骤2:编译链接add.c 生成add.exe
      链接时请关闭动态基址选项 /dynamicbase:no
    • 步骤3:使用ollydbg单步跟踪程序运行 并记录以下程序运行信息
    • 程序被加载到内存的基址
    • main函数的第一条指令所在的地址
    • 栈基址
    • 在调用printf函数之前的栈顶地址

    part1报告:

    int add(int x,int y)
    {
      __asm{  
        mov eax,dword ptr [x]
        add eax,dword ptr [y]
      }
    }
    int main()
    {
      printf("the value add(2,4):%d",add(2,4));
    }
    

    part2

    • 步骤1:编写内嵌汇编程序sum.c 计算1+2+...+100 并调用printf()函数输出结果
    int sum(int i)
    {
      __asm{
        //计算并返回1+2+...+i
      }
    }
    int main()
    {
      //输出sum(100)的值
    }
    
    • 步骤2:编译链接sum.c 生成sum.exe
      链接时请关闭动态基址选项
    • 步骤3:使用ollydbg单步跟踪程序运行 并记录以下程序运行信息
    • 程序被加载到内存的基址
    • main函数的第一条指令所在的地址
    • 栈基址
    • 在调用printf函数之前的栈顶地址

    part2报告

    int sum(int i)
    {
      __asm{
        //计算并返回1+2+...+i
    	mov eax,0
    	mov ecx,dword ptr[i]
    	myLoop:
    	  add eax,ecx
    	  loop myLoop
      }
    }
    int main()
    {
      printf("the value sum(100):%d
    ",sum(100));
    }
    

    part3

    • 步骤1:编写内嵌汇编程序sum.c
    int sum(int i)
    {
      __asm{
        //返回1+2+...+i的值
      }
    }
    
    • 步骤2:编写程序main.c 编写内嵌汇编语言来调用上面的sum.c函数4
      计算1+2+...i的值 i为程序运行时的命令行输入值
      然后采用汇编语言来调用printf函数输出计算结果
    exten int sum();
    int main(int argc,char **argv)
    {
      int i;
      if(argc<2)
      {
        printf("usage:main number
    ");
    	return -1;
      }
      i=atoi(argv[1]);
      __asm{
        //计算并输出sum(i)的值
      }
    }
    
    • 步骤3:编译链接sum.c与main.c 生成main.exe 观察以下运行情况 记录相应值
    • main()函数的第一条指令所在的内存地址
    • sum()函数的第一条指令所在的内存地址
    • main()函数中局部变量i所在的内存地址
    • CPU在运行main函数的第一条指令push ebp时的esp寄存器的值
      在退出main函数时的esp寄存器的值

    part3报告

    int sum(int i)
    {
      __asm{
        //计算并返回1+2+...+i
    	mov eax,0
    	mov ecx,dword ptr[i]
    myLoop:
    	add eax,ecx
    	loop myLoop
      }//loop循环一次 ecx自动减少1
    }
    
    extern int sum(int);
    int main(int argc,char **argv)
    {
    int i;
    if(argc<2){
      printf("usage:main number
    ");
      return -1;
    }
    i=atoi(argv[1])
    __asm{
      mov eax,dword ptr [i]
      push eax
      call sum            //返回sum(i)的值保存在eax寄存器
      add esp,4           //栈平衡
      mov ecx,0x000a6425  //构造字符串%:25h d:64h 
    :0ah 
      //低地址存低位
      push ecx            //字符串"%d
    "存储在栈上
      mov ecx,esp         //ecx记录了字符串在栈上的地址
      push eax  //参数2:sum(i)的值
      push ecx  //参数1:"%d
    "字符串地址
      call printf//printf("%d
    ",sum(i))
      add esp,12
    }
    }
    
    ========================if i have some wrong, please give me a message, thx.========================
  • 相关阅读:
    源码分析清楚 AbstractQueuedSynchronizer
    Java 并发队列 BlockingQueue
    ReentrantLock以及AQS实现原理
    Java并发之Condition
    Java线程的6种状态及切换
    同步工具类
    Java 并发实践 — ConcurrentHashMap 与 CAS
    Java7/8 中的 HashMap 和 ConcurrentHashMap
    java HashMap、HashTable、ConcurrentHashMap区别
    Mysql的复制原理以及流程
  • 原文地址:https://www.cnblogs.com/ailx10/p/5251613.html
Copyright © 2020-2023  润新知