病毒实验一

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\n",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\n");
	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\n");
  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 \n:0ah 
  //低地址存低位
  push ecx            //字符串"%d\n"存储在栈上
  mov ecx,esp         //ecx记录了字符串在栈上的地址
  push eax  //参数2:sum(i)的值
  push ecx  //参数1:"%d\n"字符串地址
  call printf//printf("%d\n",sum(i))
  add esp,12
}
}
posted @ 2016-03-07 19:31  ailx10  阅读(334)  评论(0编辑  收藏  举报