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
}
}