首页 > 其他分享 >一次逆向软件工程的尝试

一次逆向软件工程的尝试

时间:2024-03-05 12:44:41浏览次数:19  
标签:尝试 逆向 return int 31 year case 软件工程 printf

本次逆向开发的项目来自于大一上c语言的小组期末作业,通过一年的学习后,再回到当初的作业进行代码的优化与升级。以下是源代码。

点击查看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
/*1.公元1年1月1日,是星期一
  2.累加至输入年份之前的所有年的天数
  3.总天数模7,0(星期日)---6(星期六)
*/



void menu()//打印菜单
{
	printf("         万年历查询系统\n");
	printf("\n");
	printf("\n");
	printf("*********************************\n");
	printf("1 查询某年某月某日是星期几\n");
	printf("2 查询某年是否是闰年\n");
	printf("3 打印某年的日历\n");
	printf("4 查询某月的最大天数\n");
	printf("5 退出\n");
	printf("*********************************\n");
}
int check_year(int year) {//检查平年闰年函数

	if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int week_f(int year)//返回xx年1月1日是星期几 
{

	if (year == 1)//第一年
	{
		return 1;
	}

	int sum = 0;
	for (int i = 1; i < year; i++) {
		if (check_year(i) == 1) {
			sum = sum + 366;
		}
		else {
			sum = sum + 365;
		}
	}

	

	return (sum + 1) % 7;//加一是因为第一年一月一日是星期一
}


int month_run(int n)//闰年月份
{
	switch (n)
	{
	case 1:return 31;
	case 2:return 29;
	case 3:return 31;
	case 4:return 30;
	case 5:return 31;
	case 6:return 30;
	case 7:return 31;
	case 8:return 31;
	case 9:return 30;
	case 10:return 31;
	case 11:return 30;
	case 12:return 31;
	}
}

int month_ping(int n)//平年月份
{
	switch (n) 
	{
	case 1:return 31;
	case 2:return 28;
	case 3:return 31;
	case 4:return 30;
	case 5:return 31;
	case 6:return 30;
	case 7:return 31;
	case 8:return 31;
	case 9:return 30;
	case 10:return 31;
	case 11:return 30;
	case 12:return 31;
	}
}




///闰年输出函数 
void run(int week) 
{
	int enter = 0;//记录换行 
	int wee = week;
	for (int i = 1; i <= 12; i++)//最外层遍历12个月
	{

		enter = 0;
		printf("------------->%d月<----------\n", i);//输出月份表头
		printf("日	一	二	三	四	五	六\n");//输出星期标头 


		for (int k = 0; k < wee; k++)//输出空格 
		{
			printf("	");//周日是0,所以周几就有几个空格
			enter++;
		}


		for (int j = 1; j <= month_run(i); j++) 
		{//输出每月的天 
			if (enter % 7 == 0) 
			{

				printf("\n");
			}
			printf("%d	", j);
			enter++;
		}

		wee = (wee + month_run(i)) % 7;
		//enter = enter - wee;

		printf("\n\n\n");

	}
}


///平年输出函数
void ping(int week)
{
	int enter = 0;//记录换行 
	int wee = week;
	for (int i = 1; i <= 12; i++) //最外层遍历12个月
	{
		printf("------------>%d月<------------\n", i);
		printf("日	一	二	三	四	五	六\n");//输出星期标头 


		for (int k = 0; k < wee; k++)//输出空格 
		{
			printf("	");
			enter++;
		}


		for (int j = 1; j <= month_ping(i); j++)//输出每月的天 
		{
			if (enter % 7 == 0) {
				printf("\n");
			}
			printf("%d	", j);
			enter++;
		}

		wee = (wee + month_ping(i)) % 7;
		enter = enter - wee;

		printf("\n\n\n");

	}
}
int main()

{



	while (1)
	{
		int input = 0;
		menu();
		printf("请选择:");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
		{
			int n, y, r, s = 0;
			scanf_s("%d %d %d", &n, &y, &r);

			if (check_year(n) == 1)
			{
				for (int i = 1; i <= y - 1; i++)
				{
					s = s + month_run(i);
				}
			}
			else
			{
				for (int i = 1; i <= y - 1; i++)
				{
					s = s + month_ping(i);
				}
			}
			s = s + week_f(n) + r - 1;
			switch (s % 7)
			{
			case 1:printf("星期一\n");
				continue;
			case 2:printf("星期二\n");
				continue;
			case 3:printf("星期三\n");
				continue;
			case 4:printf("星期四\n");
				continue;
			case 5:printf("星期五\n");
				continue;
			case 6:printf("星期六\n");
				continue;
			case 0:printf("星期天\n");
				continue;
			}
			



		}
		case 2:
		{
			int year;
			printf("请输入年份:");
			scanf_s("%d", &year);
			if (check_year(year) == 1) //检查是否平年闰年
			{
				printf("%d是闰年\n", year);
			}
			else
			{
				printf("%d是平年\n", year);
			}
			continue;
		}
		case 3:
		{int year;
		int week = 0;
		int sum = 0;
		printf("请输入年份:");
		scanf_s("%d", &year);
		week = week_f(year);//返回xx年1月1日是星期几


		if (check_year(year) == 1) //检查是否平年闰年
		{
			run(week);
		}
		else {
			ping(week);
		}
		continue;
		}
		case 4:
		{
			int jiyue = 0;
			printf("请输入月份:\n");
			scanf_s("%d", &jiyue);
			if (jiyue >= 13 || jiyue <= 0)//1-12月分以外数据报错。
			{
				printf("不好意思,您输入的数据有误。");
				continue;
			}

			printf("%d月最多有%d天\n", jiyue, month_run(jiyue)); 
			continue;
		}
		case 5:
		{
			return 0; 
			continue;
		}

		default:printf("输入错误,请重新输入\n"); continue;

		system("pause");

		}

	}


	
	
	return 0;
}

运行环境为vs2022

主要问题如下
1,用户界面不够美观
2,存在一些输入性的bug需要修改

点击查看代码
{
			int jiyue = 0;
			printf("请输入月份:\n");
			scanf_s("%d", &jiyue);
			if (jiyue >= 13 || jiyue <= 0)//1-12月分以外数据报错。
			{
				printf("不好意思,您输入的数据有误。");
				continue;
			}

			printf("%d月最多有%d天\n", jiyue, month_run(jiyue)); 
			continue;
		}
增加了输入非正常年份的判定,提示输入错误 ![](/i/l/?n=24&i=blog/3398612/202403/3398612-20240305122552220-1781638399.png)

本次重构的软件,主要的难点在于读懂过去的代码,理解编写者的思维。明确进行逆向软件工程的目的和需求,是为了理解软件系统的功能、修复漏洞、提升性能还是进行其他目的。选择合适的工具和技术来进行逆向软件工程,例如反编译器、调试器、静态分析工具等,以帮助我们获取软件系统的源代码、数据结构和算法等信息。在进行逆向软件工程时,需要遵守相关的法律法规和道德准则,确保不侵犯知识产权和隐私等权益。在进行正式使用时,不得使用盗版软件。同时经常进行逆向软件工程也有利于编程经验的提升。
2024.3.5

标签:尝试,逆向,return,int,31,year,case,软件工程,printf
From: https://www.cnblogs.com/aegsis2970/p/18053683

相关文章

  • 【专业技能】程序员的软件工程素养之画好 UML 时序图
    目录前言一、认识时序图1.1时序图元素1.2怎么使用二、画好时序图2.1一般步骤2.2举个例子2.3推荐工具三、其它作用四、文章小结前言笔者在本科的时候上过软件工程的专业课,也完成过类似的课堂作业,但是工作以后一直没怎么用上。碰巧前段时间有碰到一个复杂系统的部分功能设计,作为设......
  • JavaScript逆向之md5算法
    md5算法md5算法简介:md5算法是一种摘要算法,主要用来进行数字签名、文档一致性验证等。python实现md5点击查看代码fromhashlibimportmd5s="123456"obj=md5()#把你要计算的字节丢进去obj.update(s.encode("utf-8"))md5_value=obj.hexdigest()print(md5_value......
  • 【JS逆向百例】某词霸翻译逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 机器视觉-尝试使用directml运行yolov8
    DirectML是什么DirectML是微软提供的类似于CUDA的基础计算框架,不同于CUDA必须使用N卡GPU,DirectML要求显卡支持DirectX12即可,所以AMD和intel的核显也能支持.Pytorch要使用DirectML作为计算的backend,需要安装python库torch-directml,经测试torch-directml和Direct......
  • 关于台历程序的逆向编程与改进
    1.来源https://zhuanlan.zhihu.com/p/3963903242.运行环境VSCODEc语言运行结果:3.主要问题:用户不可以自定义显示自己想要查看的年份月份不同国家的用户兼容性缺失代码不够模块化,扩展性不足改进:添加了用户输入功能,用户可以输入特定的年份和月份来显示指定月份的日历。......
  • 初识JavaScript逆向——以网易云音乐和招标网站为例
    前言:需要掌握一定的JavaScript基础,能看懂基础的JavaScript代码。我们平常在浏览网站的时候会看到许多加密的参数,如果需要知道它的原始数据,就需要知道整个加密过程,所以本篇文章就来介绍一下本人在初学逆向的时候一些笔记。想要获取加密过程大概来说有以下两个方法:(1)通过浏览器的i......
  • 矩阵爆破逆向之条件断点的妙用
    不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀!那么本文就介绍一下这个功能点,使用z3来秒解题目。条件断点什么是条件断点呢?条件断点(ConditionalBrea......
  • GenAI助力DevOps,塑造软件工程的未来
    自2022年以来,GenAI无疑已成为一种普遍的技术趋势。在本文中,我们将探索DevOps中令人兴奋的GenAI领域,讨论其潜在优势、局限性、新兴趋势和最佳实践,深入了解AI支持的DevOps前沿世界,并探索这一强大组合如何重塑软件工程的未来。 DevOps中的GenAI介绍随着ChatGPT、B......
  • 《构建之法:现代软件工程》读后感3
    这本书的作者邹欣老师在微软公司工作,他在整本书中把对软件构建的方方面面都写得很清楚,包括需求,设计,开发,测试,项目管理......甚至国内很多公司都无法做到像书中说的流程那么全面和到位。作者的思路很清晰,文字也很有趣,让人欲罢不能。全书都有很大的参考价值,至少对于我目前这样的状态......
  • 【APP逆向18】解决NO_PROXY抓包问题
    1.前置:在抓包某货app时,基于关键字搜索,我们发现抓不到返回商品信息的接口,这是怎么回事呢?这是因为在安卓开发时,OkHttp发送请求,设置Proxy.NO_PROXY,基于系统代理都是抓不到包。OkHttpClientclient=newOkHttpClient();FormBodyform=newFormBody.Builder().add("user"......