2022 3.6
*boh的更新都放在另外一篇blog里面。
最近的更新:优化了界面颜色,用函数精简了一些代码。
菜鸡的日记终于又更新了,这次的日记有点长,想看有点用的内容的师傅可以直接跳目录。
好久没有写日记,是菜鸡放弃了吗?并不是的。只是菜鸡对自己的菜有了新的认识\苦.jpg,决定从基础开始,一步步走好ctf的道路,最近学习的是python,也将会是相当一段时间内的学习内容(当然,越快越好),这个项目算是自己的第一个python程序,没有什么特别的技术内涵,不过做项目带来的实战经验和光看书是完全不一样的,虽然简单,但是也有很多收获。
这个项目(就这么叫吧,字面上不能亏待自己)的开始,除了正在学习python的原因,更重要的是,出于保存对学习或工作的热情而进行的必要休战——即偷懒——的原因。曾经的菜鸡饱受进制转换(CONS,conversation of number system)的折磨。在小学初中的奥数课堂中没什么好说,毕竟考的就是这个计算,但是到了大学,还依靠草稿纸实在是很跌份(好吧,我承认,主要是老是算错),加上开始学习C语言,做了一些关于进制转换的题目,就产生了这个想法:
1,要做一个程序,帮人类完成进制转换的繁重工作
2,最好放在桌面上,就像计算器一样方便使用(如果计算器有这个功能就不会有这篇文章了)
这应该也是大部分程序设计和使用的要求,于是在相当一段时间的苦肝之后(相信我,虽然那是C语言作为一门正课而且菜鸡有足够的热情,写完那个功能残缺操作复杂的程序花的时间也超过了python版本),有了第一个版本:
没错,这个没有生成exe的cbp就是第一代的cons,为了符合第二条标准即打开方便(也是为了显逼格),菜鸡甚至通过更改图标来使那个快捷方式显得不一样,但即便是用了快捷方式(说到快捷,我可以很坦诚地说,codeblocks的打开速度其实让这个快捷方式失去了意义),打开后的程序也是不能直接用的:
没错,还要build and run,完了之后退出也是要连点好几个x,还要经过人工智障“save or not"的亲切询问,实在很拉胯。而功能的实现也是个问题:
没错,只有二进制和十进制的互相转换,而且(十分丢脸地)由于技术上的问题,二进制转换十进制还要计算数字的长度。
——————
*注:这里的界面是powershell,是因为方便检查报错在编写python版本的时候更换的,powershell虽然很友善地提供报错,但是一些过分自信的操作使得它在使用的时候会多一些不必要的操作,之后我们会换回控制台方便程序使用(一开始为了查错对控制台极限截屏实在是很难忘的一段经历,powershell的报错还是很值得肯定的)。
至于代码么,总共分成一个main,还有四个file包括不同功能,加起来两百余行代码,才实现了二进制和十进制的互相转化,而且用户体验也很一般(虽然字体和颜色重点突出做到了尽可能地美观,但是这个“快捷方式”直接把它打回原点)
——————
*dtb和btd各花了八十多行代码,现在看来真的实在是一个事倍功半的实现方式。
综上所述,其实这个程序在完成之后就再没有大规模地被使用,直到上个月末开始夯实python的内容(寒假所谓的一天学完python只是看完了语法,而且很多细节就直接忘掉了),看到了bin(),oct(),hex()函数,才再次萌生了这个想法,做一个练习来使用这些容易被遗忘的函数(当然,后来发现这些使用这几个函数都是不值一提的问题)。
之所以能有信心重启这个项目的另一些底气来源于对非图形化界面系统的深入了解,因为就桌面实现小工具快捷方式这个效果,已经有了另外的实现方法:
没错啊,又是为了偷懒。因为实在是怀念直接点关机键的感觉(win11有些地方操作实在不人性化,不过这才有菜鸡发挥的空间嘛),不知道从哪里找到了使用txt生成可以直接执行的.bat命令,方法很简单,先新建一个普通的txt文件,在里面写好相应的控制台命令(既然放在桌面,就要注意路径):
——————
*这个就是打开新的python版本的脚本,使用python3编译,稍微有点麻烦的是当时写好了路径之后还是打不开,最后发现是因为用了中文的输入法然后shift,这个要求比较苛刻,不管是字母还是字符,都必须是半角的英文输入法,不然就算看起来一摸一样,还是会出问题,而且使人发疯。
在txt中写好命令之后,用另存为的方式,选择“所有文件”格式,然后再文件名中手动加入“.bat”的格式:
保存到桌面,就形成了一个真正意义上的快捷方式。
——————
*理论上,windows里应该也有c的编译器,可以直接运行之前的cbp程序,但是之所以作者在这里扯淡显然那是因为他懒得百度(开玩笑,下次更新一定补上)
——————
*放在goobers的下面,方便识别,至于为什么不用tools而是goobers,自行观看《蜘蛛侠:平行宇宙》吧\笑哭.jpg
为了方便大家参考,这里先直接放代码,细节后面记录,主要是给菜鸡自己看的,不感兴趣的师傅可以直接跳过
——————
*自从菜鸡的一篇水得不能再水的文章有了上千阅读量——没人点赞———菜鸡意识到不管自己的日记多没营养,还是有怀着希望的宝宝进来观看的,再多嘴一句,其实有水平高一点的师傅能在菜鸡的日记下面喷几句还是很有价值的(言下之意:赶紧来骂!大佬快出现!不要管tmd 素质了,只要能说点有价值的评论,菜鸡愿意被口水淹没),毕竟菜鸡已经彻底厌倦了没有指导的学习(还不如叫摸索),这其实是低效而且折磨的一个过程,虽然每一次的突破都会很振奋,但是就像之前自己闭门推导三角形面积公式的一个大爷,用尽退休时间最后发现其实相应的定理在初中教科书中就有提及(说到这里还是有点悲哀,而且很对不起看过菜鸡的日记的读者,因为这么多所谓文章加起来真的还没有很多up的一篇有价值)。
'''
进制转换小程序,希望能比C语言写出更加简单实用的效果
'''
#初始画面的设置
_break = "\t------"
print()
print()
print()
print("\t0100100 101000 10 01")
print("\t11 01 10 11 10 11")
print("\t10 11 110 10 11 01")
print("\t0001100 01 0 00 10001101")
print("\t1111011 10 1 00 00101001")
print("\t01 11 11 011 01 00")
print("\t10 01 00 00 01 10")
print("\t1000001 001101 00 10" "\t@Ferrero")
print("")
print(_break * 4)
print("Program for conversation of number system. Boh is ready.")
print(_break * 4)
print("TIPS")
print(">>>V to view history data.")
print("")
'''
类似于宏的设置区域
'''
#file
fstream1 = open("d:\python_projects\CONS\data.txt", mode = "w")
#variables
judge_op = 'y'
o_ption1 = None
o_ption2 = None
num = None
'''
main()
'''
print(_break * 4)
print("INPUT MODE(decimalism default): B/b:Bin O/o:Oct H/h:Hex")
o_ption1 = input(">>>Choose the mode:")
print()
print("OUTPUT MODE(decimalism default): B/b:Bin O/o:Oct H/h:Hex")
o_ption2 = input(">>>Choose the mode:")
print()
#store the data
print("option1:", file = fstream1)
print(o_ption1, file = fstream1)
print("option2:", file = fstream1)
print(o_ption1, file = fstream1)
#judge the mode
while judge_op == 'y':
if len(o_ption1) == 0:
print("INPUT")
num = int(input(">>>Input the number:"))
if len(o_ption2) == 0:
num = num
print(num)
if o_ption2 == 'b' or o_ption2 == 'B':
num = bin(num)
print("__1...5...9...13..17..21..25..29..33..")
print(num)
if o_ption2 == 'o' or o_ption2 == 'O':
num = oct(num)
print(num)
if o_ption2 == 'h' or o_ption2 == 'O':
num = hex(num)
print(num)
if o_ption1 == 'b' or o_ption1 == 'B':
print("INPUT")
print(" 1...5...9...13..17..21..25..29..33..")
num = input(">>>Input the number:")
#transfer into bin
numsum = 0
numsum = int(numsum)
numing = list(num)
#print(numing)
numlen = len(num)
#print(numlen)
_index = 0
_index = int(_index)
while int(_index) < numlen:
numsum = int(numsum) + int(num[int(numlen)- 1 - _index]) * (2 ** _index)
_index = int(_index) + 1
#print(numsum)
num = numsum
if o_ption2 == 'b' or o_ption2 == 'B':
num = bin(num)
print("__1...5...9...13..17..21..25..29..33..")
print(num)
if o_ption2 == 'o' or o_ption2 == 'O':
num = oct(num)
print(num)
if len(o_ption2) == 0:
num = int(num)
print(num)
if o_ption2 == 'h' or o_ption2 == 'O':
num = hex(num)
print(num)
if o_ption1 == 'o' or o_ption1 == 'O':
print("INPUT")
num = input(">>>Input the number:")
#transfer into oct
numsum = 0
numsum = int(numsum)
numing = list(num)
#print(numing)
numlen = len(num)
#print(numlen)
_index = 0
_index = int(_index)
while int(_index) < numlen:
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (8 ** _index)
_index = int(_index) + 1
#print(numsum)
num = numsum
if o_ption2 == 'b' or o_ption2 == 'B':
num = bin(num)
print("__1...5...9...13..17..21..25..29..33..")
print(num)
if o_ption2 == 'o' or o_ption2 == 'O':
num = oct(num)
print(num)
if len(o_ption2) == 0:
num = int(num)
print(num)
if o_ption2 == 'h' or o_ption2 == 'O':
num = hex(num)
print(num)
if o_ption1 == 'h' or o_ption1 == 'H':
print("INPUT")
num = input(">>>Input the number:")
#transfer into hex
numsum = 0
numsum = int(numsum)
numing = list(num)
#print(numing)
numlen = len(num)
#print(numlen)
_index = 0
_index = int(_index)
while int(_index) < numlen:
if num[numlen - 1 - _index] == 'a' or num[numlen - 1 - _index] == 'A':
numsum = int(numsum) + 10 * (16 ** _index)
if num[numlen - 1 - _index] == 'b' or num[numlen - 1 - _index] == 'B':
numsum = int(numsum) + 11 * (16 ** _index)
if num[numlen - 1 - _index] == 'c' or num[numlen - 1 - _index] == 'C':
numsum = int(numsum) + 12 * (16 ** _index)
if num[numlen - 1 - _index] == 'd' or num[numlen - 1 - _index] == 'D':
numsum = int(numsum) + 13 * (16 ** _index)
if num[numlen - 1 - _index] == 'e' or num[numlen - 1 - _index] == 'E':
numsum = int(numsum) + 14 * (16 ** _index)
if num[numlen - 1 - _index] == 'f' or num[numlen - 1 - _index] == 'F':
numsum = int(numsum) + 15 * (16 ** _index)
if num[numlen - 1 - _index] == '0':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '1':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '2':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '3':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '4':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '5':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '6':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '7':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '8':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
if num[numlen - 1 - _index] == '9':
numsum = int(numsum) + int(num[numlen - 1 - _index]) * (16 ** _index)
_index = int(_index) + 1
#print(numsum)
num = numsum
if o_ption2 == 'b' or o_ption2 == 'B':
num = bin(num)
print("__1...5...9...13..17..21..25..29..33..")
print(num)
if o_ption2 == 'o' or o_ption2 == 'O':
num = oct(num)
print(num)
if len(o_ption2) == 0:
num = int(num)
print(num)
if o_ption2 == 'h' or o_ption2 == 'O':
num = hex(num)
print(num)
两百多一点的代码,看起来和之前的c版本工程量区别不大,但是实现的功能是大不相同的,从上面的界面可以看出来,这个版本有一个名字和初始界面logo,就是“boh”,来源也很简单,bin, oct, hex,但是它还有一个妙处就在于意大利语中的boh是个很万用的词(没错就是《英雄远征》里面看来的,菜鸡普通话都说不清楚怎么可能懂小语种),刚好符合这一版的设计理念,毕竟相比于上次两种组合,这次有4*4=16种选择(没错,就是把二转二八转八这些看似无用的功能都加进去了)。而且结合实际应用,这里的程序设计更加实用,没有C语言版本的进退无度,毕竟一个小工具使用的规模是有限的,不需要在不同的应用场景中频繁转换:在一开始选择in和out的进制,然后只要不停地输入就可以了。
接下来略略看一下细节,记录了菜鸡一次又一次报错的血泪。(T o T)
这是初始画面效果的设计部分,没什么好说的。完全是一直没有getshell的菜鸡自尊心作祟,搞了这么个华而不实的玩意,但是值得注意的还是有两点:
1,python的print远比C语言的printf灵活和功能化,相应的函数格式是要经常温习的。
2,这里的注释还都是中文的,但其实这不是一个好习惯,sumlime text还算比较包容,但是很多程序(尤其路径)是不能识别汉字的(这应该也是unicode不如ascii码普及的后果),而且过度依赖汉字其实不利于学习(pwbtools就是个很好的例子,不用说,又是一个鸽在那里的东西)。
open?没错,这个程序还有一个c版本完全没有的东西,就是历史数据的记录:
就在一个txt里面。这个功能的想法的产生一方面是刚好看到这个open函数就顺便练练手,另外相当实际的意义就在于有时候这个程序用完了之后直接关闭,但是过一会发现其实还需要刚才的结果,这时候就不得不重启程序,再次进行操作(尤其是之前的c版本,不要太扎心)。而就算是txt中简单的一行数据,也可以省去很多麻烦。
目前这个功能只做成了记录转换关系的程度,之后的更新会完成他,而且可以看出,这个功能也不打算做成可以追溯一百年的程度,由于新版本的简便性,将只保留上一次的记录。
接下来就是python初学的一个比较头痛的地方了,那就是python中的数据类型,这次项目的一大半报错都是这方面的,一开始觉得python对于变量的定义很灵活很nice,但是一旦出现type error它就开始不那么香了。总结:
多用int,多初始化几个关键变量,该谨慎的地方还是学学C语言;还有,bin/oct/hex没有这种功能,不要做梦想着直接识别二进制的输入了(至少我求助度娘和城市大脑(c · s · d · n)之后没有看到结果,所以不得不在后面采取了一些近乎傻瓜的算法,尤其十六进制的部分简直不堪忍睹)。
之后是这个循环和判断的一些小经验,while要学好,在python里面for和C语言的for还是有很大的不同的,while的重要性就上升了(也许是它更贴近菜鸡)。然后就是这个len的妙用,之所以说这是妙用并不是菜鸡夸自己,这个办法是一位善良的师兄想出来的,结合前面的控制台界面可以看到,菜鸡想实现默认十进制的功能,但是当一个变量在input直接回车之后变成了什么,反正在试过了None,空格等之后没有结果(换行更是自相矛盾),最后发现至少可以确定他的长度是0,这才算是解决了一个大难题,着实让菜鸡知道,想要体面地做人,真的没那么简单。(T o T)
——————
*人性化的设计不能少,数二进制的位数也是菜鸡不愿回忆的事情之一。
这是二进制的转换其他进制部分,要是能直接bin实现二进制输入,该是多么美妙的一件事情啊(流口水),但是很不幸,还是要自己来,而且由于没有C语言那么严谨,这个部分的画面没有那么没观,可以看出,到了这里菜鸡对于int的使用已经到了草木皆兵的地步了。
还有就是变量的命名,_index以及前面o_ption的出现并不奇怪,在菜鸡看了python的关键字表之后就决定,命名变量随手加一个下划线实在是不会亏本的买卖。
八进制的地方大体和二进制一样,但是到了十六进制这里画风开始变得诡异,这是因为abcdef的出现,再次,由于没有直接的hex格式输入,菜鸡不得不自己动手想办法。一开始只打算让abcdef一个个检查过去,0~9就直接用范围的判断,但是出现了一个问题,那就是一旦输入的是abcdef,那就会使得num变成str型,而且连int都不管用,会报错显示无法转换,连ascii码操作的机会都不给,而如果不int的话就没有办法进行比较,所以只能采用这种笨办法,唯一的好处就是看起来还是挺壮观的(其实还有一个实际一点的好处,那就是打字母数字的时候万一手抖打错了也只不过是当作一个空格,不会报错崩画面:控制台是消失,powershell就更迷惑了,报个错,但是不消失也不给你继续操作的机会,就等你多点几下重新启动,这就是选择控制台进行实际使用的原因之一)。
没错,这个小程序的大体是完成了,但是即使是和老版相比较也有很多不足之处,尤其是颜色的重点突出效果,没有这个功能就会导致翻找之前的数字变得讨厌,还有就是历史数据的记录、更多的缩进,等等,还有许多可以设想和增加的功能(甚至可以把一些常用表格做进去,比如十六进制和二进制的转换),菜鸡之所以菜鸡还因为英语的不行,导致了很多资源的低效利用(刚刚检查了一下程序,就发现好几个语法错误T o T)。
第一次写这么长(而且还算有那么一丢丢创新)的东西,从六号写到了七号(丝毫不困),也算是第一篇愿意别人看到,相信能有一点价值的文章。不过无论是python还是pwn,还是ctf,菜鸡还是菜鸡\笑哭.jpg,接下来的日子不管是这个项目还是之后的爬虫,excel,压缩包破解,甚至是机器视觉,还要学着改进,学着创新。
和boh一起待机吧(希望不要梦见那些没写完的作业,寄。图是百度的,水印真没办法去掉,本来想放个熊猫头,但是想想那么多要做的事情,还是正经那么一点点吧)