嘿嘿今天又来写博客了,对于这个程序我有有趣的发现,想获取程序,可以看前面几篇,我备注了出处
至于为什么会写关于这一个程序的博客,直接跳到41个,其实前面的程序我感觉没有啥可以值得记录的,有一些很简单,还有一些很无聊
也许你会觉得这个程序很无聊,很好破解,但是对于我而言,我实实在在的在这个程序上犯错了,所以就会有记录这一说
1.这个题目算法很一般
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
char strName[20];
char strKey[20];int main()
{printf("输入用户名: ");scanf("%s", strName);strKey[0] = strName[0] / 0xA;while (1){if (strKey[0] < 0xA) break;else {strKey[0] = strKey[0] / 0xA;}}strKey[1] = strName[2] / 0xA;while (1){if (strKey[1] < 0xA) break;else{strKey[1] = strKey[1] / 0xA;}}strKey[2] = strName[3] / 0xA;while (1){if (strKey[2] < 0xA) break;else{strKey[2] = strKey[2] / 0xA;}}strKey[3] = strName[4] / 0xA;while (1){if (strKey[3] < 0xA) break;else{strKey[3] = strKey[3] / 0xA;}}for (int i = 0; i < 4; i++){printf("%d ", strKey[i]);}return 0;
}
思路就是把用户名的第 1 3 4 5 位分别去除0xA取商 ,如果大于商,再次除0xA,直到商小于0xA,如果输入的是英文字母可能会出现商大于0xA的情况
2.通过程序和反汇编分析
这里面有一个switch结构值得注意

在0x00437DD3这个位置每次进行完case的部分都会跳转到这里,但是根据右侧的Default 可以猜测它可能是default关键字的部分
举一个例子:
int a = 0;scanf("%d", &a);switch (a){case 1:printf("1");break;case 2:printf("2");break;case 3:printf("3");break;case 4:printf("4");break;default:printf("输入错误!\n");break;}
在查资料前,我是这样写的,我们输入1,2,3,4可以看到打印的信息,输入大于4的数字会打印输入错误。这并不像程序里面都执行了default部分的代码,查完资料问了一下deepseek,我才知道有goto语句,以及完全忘记了
然后尝试还原了一下这个switch结构
int a = 0;
scanf("%d", &a);
switch (a)
{case 1:printf("1");goto def_ault;case 2:printf("2");goto def_ault;case 3:printf("3");goto def_ault;case 4:printf("4");goto def_ault;def_ault:printf("QWQ");break;default:printf("输入错误!\n");break;
}
这样就可以实现执行default部分的内容,由于default是关键字,所以不能作为标签名,我这里直接换了一个def_ault,当我输入1,2,3,4时会打印对于的数字,除此之外还会打印颜文字QWQ
想了解goto的相关语法可以去查看:https://www.runoob.com/cprogramming/c-goto-statement.html
没见过的switch结构,浅浅的研究了一下,这个程序是DB写的,可能DB实现switch和C语言不大一样吧。
后日谈:其实我压根就没在意这个函数,以至于我在分析程序的时候完全不知道怎么做,在一个函数里面越陷越深,对于这种情况,应该换一个方向,败北:(
