1.2021Դ?源码源码?Դ??
2.Gitea源码分析(一)
3.逆向pyinstaller打包的exe软件,获取python源码(1)
4.逆向pyinstaller打包的源码源码exe软件,获取python源码(2)
5.逆向pyinstaller打包的源码源码exe软件,获取python源码(3)
6.python代ç 大å
¨ç®åï¼
2021Դ?源码源码?Դ??
提到程序员,人们常常会联想到“直男、源码源码宅、源码源码项目源码找不到不懂浪漫、源码源码枯燥、源码源码憨厚老实、源码源码有逻辑、源码源码人傻钱多”等标签。源码源码然而,源码源码这种刻板印象并不全面,源码源码实际上,源码源码程序猿在面对感情时也能展现出浪漫的源码源码一面。他们大部分时间与电脑为伴,这份认真与专注也体现在了对待爱情的态度上。程序猿也许在生活中较为内敛,但这不代表他们不懂浪漫。当他们察觉到伴侣的厦门网站源码不开心时,会利用编程技能,制作出如玫瑰花、心形等告白小程序,为对方制造惊喜。 接下来,让我们看看程序猿如何通过代码表白,收获爱情。制图表白
制作图形表白是程序猿表达情感的创意方式之一。例如,通过代码生成一朵玫瑰花或一个爱心图案,既简洁又富有创意。 1.1 玫瑰花 源码如下: 1.2 爱心 源码如下: 1.3 网页爱心树表白 代码过长,仅展示部分代码:程序语言表白
程序猿不仅在图形上施展创意,也能够通过编程语言来表达心意。以下是几种基于程序语言的表白方式: 2.1 程序语言表白一 通过编写特定的程序代码,以有趣的互动方式表达情感。 2.2 程序语言表白二 利用编程语言特性,实现简单的自动化操作,如定时发送情书或提醒。兵法公式源码 2.3 程序语言表白三 编写一段小程序,展示对方名字的ASCII艺术,增加个性化与趣味性。 2.4 程序语言表白四 利用编程语言的可视化功能,制作动态图形或动画,以独特的方式呈现心意。 编程表白不仅展现了程序猿的技术实力,也彰显了他们对感情的用心与创意。通过这些独特的表达方式,程序猿们成功地赢得了伴侣的芳心,证明了在感情的世界里,技术同样可以成为情感的桥梁。Gitea源码分析(一)
Gitea是一个基于Go编写的Git代码托管工具,源自于gogs项目,具有良好的后端框架和前端集成。
前端框架采用Fomantic UI和Vue,路由控制器框架在年4月从macaron切换到chi,形成了gitea项目的结构基础。
在调用接口时,dii模块源码gitea引入了'User','Repo','Org'等内容,简化了接口调用,便于管理。'ctx.User'和'ctx.Repo'内容动态变化,需要用户登录和进入仓库时赋值。
在'routers'下,'handler'相关文件分为'get'和'post'两类,前者涉及前端渲染,后者负责执行操作。
'get'请求通过'templates'中的文件渲染到前端,通过'ctx.Data["name"]'传递需要渲染的数据,获取URL参数使用'c.Query'。
'post'请求接收前端数据,通常通过'form'传值,从'context'生成,可以使用'form.xxx'直接调用,添加内容则需在'form'结构体中定义。美橙源码
渲染生成网页使用'ctx.Html(,tplName)',根据'context'内容做条件判断。
权限管理功能实现中,数字越大权限越高,便于后续对比。'UnitType'包含多项,如仓库页面导航栏显示。检查权限时,对比AccessModeRead和模块权限,大于则认为具有读权限。
gitea默认运行于单一服务器,伸缩性有限。若需分布式改造,需解决大规模并发访问、存储库分片和数据库支撑等问题。通过ELB负载均衡分散到多个节点,数据库使用集群方案,但存储库分片面临巨大挑战,现有技术难以实现。
官方文档提供了其他开源库的介绍,包括配置文件、容器方式下的轻量仓库与CI使用方案等。深入研究可发现Gitea的配置、路由控制框架chi、权限管理实现及分布式架构改造思路。
逆向pyinstaller打包的exe软件,获取python源码(1)
年创作了一款安全事件分析小工具,这是我初次尝试为安全驻场人员开发的简易工具。利用pyinstaller打包为PE格式,使用起来十分便捷,只需导入态势感知的安全事件列表,小工具便会自动进行分析。这款工具旨在辅助驻场人员理解安全事件,同时收集现场信息,便于后续运营效果评估。 近期,在探索逆向工程的过程中,我了解到可以逆向pyinstaller打包的exe软件,从而获取python源码。这促使我回忆起之前在GitHub上分享的项目。现在,就让我讲述这个过程:逆向工程之旅。 小工具操作步骤如下:首先,对exe程序进行反编译处理。
接着,进入反编译后得到的extracted文件夹。
仔细观察struct.pyc和main.pyc文件头的前字节,它们之间可能存在关键线索。
然后,对pyc文件进行反编译,逐步揭示python源代码。
最后,虽然目前只能看到主函数,但这是逆向工程的一个重要突破。
尽管未能完全揭示所有函数,但这无疑为后续深入研究打开了新的可能。逆向pyinstaller打包的exe软件,获取python源码(2)
年,我开发了第二个安全运营工具——统一运营,专为驻场运营管理员设计。该工具需要与第一个工具安全事件分析(ailx:逆向pyinstaller打包的exe软件)配合使用。安全事件分析工具会产生一个db文件,存储客户态势感知平台上的安全事件信息。统一运营工具对多个客户的数据进行横向AI聚类分析和纵向历史基线分析,并构建分析报表,自动生成邮件。在此过程中,我使用了一个复杂的算法进行横向对比,即9:1开,强制%的安全驻场不及格。近期,遇到一个beacon加密程序被同事破解,激发了我对逆向的兴趣,于是我开始逆向pyinstaller打包的exe软件,获取python源代码。
提醒:故事还有后续,逆向成功获取pyinstaller打包的exe软件的所有源代码:ailx:逆向pyinstaller打包的exe软件,获取python源码(5)
自动化运营周报小工具说明:
第一步:对exe程序进行反编译[1]
第二步:进入新获得的extracted文件夹
第三步:查看struct.pyc和main.pyc前8字节之间的区别
第一个软件前个字节,第二个软件只有前8个字节相同,不知道为啥,不过我这里并未处理
第四步:反编译pyc文件得到python源代码
第五步:欣赏一下反编译的代码
非常遗憾,暂时只能看到主函数,看不到最核心的my_core函数,不知道咋弄
逆向pyinstaller打包的exe软件,获取python源码(3)
年,我开发了第三个安全运营小工具,这个工具是为安全驻场人员设计的。本来打算将其与第一个软件整合,但由于时间限制未能实现。当时过于急于求成,没有深入分析代码。然而,最近的一次威胁狩猎事件激发了我对逆向工程的兴趣,我顺便尝试了逆向pyinstaller打包的exe软件,以获取python源码。回顾过去的代码,转眼已到年。我一直从事网络安全业务,但在coding技术上却毫无进步。今年,我决心提升代码水平,争取创造出有差异性的成果。
提醒:故事还有后续,我将逆向pyinstaller打包的exe软件的所有源代码:ailx:逆向pyinstaller打包的exe软件,获取python源码(6)
态势感知体检小工具说明:
第一步:对exe程序进行反编译[1]
第二步:进入新获得的extracted文件夹
第三步:查看struct.pyc和main.pyc前4字节之间的区别
第一个软件前个字节,第二个软件只有前8个字节相同,第三个软件只有前4个字节相同,不知道为什么,但我在这里并未发现任何问题。
第四步:反编译pyc文件得到python源代码
第五步:欣赏一下反编译的代码
python代ç å¤§å ¨ç®åï¼
pythonæ趣çç¼ç¨ä»£ç
class?Point:
row=0col=0def?__init__(self,?row,?col):self.row=row
self.col=col
def?copy(self):return?Point(row=self.row,?col=self.col)
#åå§æ¡æ¶
import?pygame
import?random
#åå§å
pygame.init()
W=
H=
ROW=
COL=
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('è´ªåè')
bg_color=(,,)
snake_color=(,,)
head=Point(row=int(ROW/2),?col=int(COL/2))
head_color=(0,,)
snakes=[
Point(row=head.row,?col=head.col+1),Point(row=head.row,?col=head.col+2),Point(row=head.row,?col=head.col+3)]
#çæé£ç©
def?gen_food():
while?1:pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
#æ¯å¦è·è碰ä¸äº
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True#è身å
for?snake?in?snakes:
if?snake.row==pos.row?and?snake.col==pos.col:is_coll=True
break
if?not?is_coll:
breakreturn?pos#å®ä¹åæ
food=gen_food()
food_color=(,,0)
direct='left'#left,right,up,down
#
def?rect(point,?color):
cell_width=W/COLcell_height=H/ROWleft=point.col*cell_widthtop=point.row*cell_heightpygame.draw.rect(window,?color,
(left,?top,?cell_width,?cell_height)
)pass#游æ循ç¯
quit=True
clock=pygame.time.Clock()
while?quit:
#å¤çäºä»¶for?event?in?pygame.event.get():if?event.type==pygame.QUIT:
quit=Falseelif?event.type==pygame.KEYDOWN:
if?event.key==?or?event.key==:if?direct=='left'?or?direct=='right':
direct='up'elif?event.key==?or?event.key==:if?direct?==?'left'?or?direct?==?'right':
direct='down'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='left'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='right'#åä¸è¥¿eat=(head.row==food.row?and?head.col==food.col)#éæ°äº§çé£ç©if?eat:food?=?gen_food()
#å¤ç身å#1.æåæ¥ç头ï¼æå ¥å°snakesç头ä¸snakes.insert(0,?head.copy())#2.æsnakesçæåä¸ä¸ªå æif?not?eat:snakes.pop()
#移å¨if?direct=='left':head.col-=1
elif?direct=='right':head.col+=1
elif?direct=='up':head.row-=1
elif?direct=='down':head.row+=1
#æ£æµdead=False#1.æå¢if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:dead=True
#2.æèªå·±for?snake?in?snakes:if?head.col==snake.col?and?head.row==snake.row:
dead=Truebreakif?dead:print('æ»äº')
quit=False
#渲æââç»åºæ¥#èæ¯pygame.draw.rect(window,?bg_color,?(0,0,W,H))#è头for?snake?in?snakes:rect(snake,?snake_color)
rect(head,?head_color)rect(food,?food_color)#pygame.display.flip()#设置帧é¢ï¼é度ï¼clock.tick(8)#æ¶å°¾å·¥ä½
è¿æ¯ä¸ä¸ªç®æçè´ªåèç代ç ï¼è½ç¶ç»æç®åï¼ä½æ¯è¯¥æçåè½é½æ¯å®æ´çï¼å¯ç©æ§ä¹ä¸é
æ±pythonæ°æ®æ åå代ç ï¼ä½¿ç¨pythonæ ååæ°æ®ç代ç å¦ä¸ï¼
fromsklearnimportpreprocessing
importnumpyasnp
X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
X_scaled=preprocessing.scale(X)
print(X_scaled)
pythonå£è¯æ 代ç ç®å```python#Pythonå£è¯æ 代ç foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```
æå±ï¼å¦ææ³æ¹åæ çå½¢ç¶ï¼å¯ä»¥å¨ä»£ç ä¸æ·»å æ´å¤çæ§å¶åæ°ï¼å¦å¨æ¯ä¸è¡ä¸æ·»å ä¸åçç©ºæ ¼æ°ï¼ä½¿å¾æ çå½¢ç¶ä¸ä¸æ ·ãåæ¶å¯ä»¥éè¿æ·»å HTMLæ ç¾ï¼ä½¿ç¨CSSæ ·å¼æ¥æ¹åå£è¯æ çé¢è²ãèæ¯åæåççã
个æç®python代ç ï¼æ¿èµ°å³ç¨
Helloï¼å¤§å®¶å¥½ï¼ææ¯ç¨åºæ±ªå°æ~
è½ç¶pythonæ¯ä¸ä¸ªæå ¥é¨çè¯è¨ï¼ä½æ¯å¾å¤äººä¾ç¶è¿æ¯ä¼é®å°åºæä¹æ ·å¦Pythonææå¿«ï¼çæ¡å½ç¶æ¯å®æåç§å°é¡¹ç®ï¼åªæèªå·±å»æ³ä¸åï¼æè®°å¾ä½è§åãæ¬æåçæ¯ä¸ªæç®ä»»å¡ï¼åå¦è å¯ä»¥å°è¯çèªå·±å®ç°ï¼æ¬æåæ ·ä¹æ¯æ®µä»£ç ï¼Pythonå¼åè ä¹å¯ä»¥ççæ¯ä¸æ¯æ没æ³å°çç¨æ³ã
以ä¸æ¹æ³å¯ä»¥æ£æ¥ç»å®å表æ¯ä¸æ¯åå¨éå¤å ç´ ï¼å®ä¼ä½¿ç¨set()å½æ°æ¥ç§»é¤ææéå¤å ç´ ã
ç»å®å ·ä½ç大å°ï¼å®ä¹ä¸ä¸ªå½æ°ä»¥æç §è¿ä¸ªå¤§å°åå²å表ã
è¿ä¸ªæ¹æ³å¯ä»¥å°å¸å°åçå¼å»æï¼ä¾å¦ï¼Falseï¼Noneï¼0ï¼ââï¼ï¼å®ä½¿ç¨filter()å½æ°ã
æ们常ç¨For循ç¯æ¥éåæ个å表ï¼åæ ·æ们ä¹è½æ举å表çç´¢å¼ä¸å¼ã
å¦ä¸ä»£ç 段å¯ä»¥å°æå 好çæ对å表解å¼æ两ç»ä¸åçå ç»ã
该æ¹æ³å°éè¿éå½çæ¹å¼å°å表çåµå¥å±å¼ä¸ºå个å表ã
该æ¹æ³å°è¿å第ä¸ä¸ªå表çå ç´ ï¼ä¸ä¸å¨ç¬¬äºä¸ªå表å ãå¦æåæ¶è¦åé¦ç¬¬äºä¸ªå表ç¬æçå ç´ ï¼è¿éè¦å ä¸å¥set_b.difference(set_a)ã
å¦ä¸ä»£ç åå¯ä»¥ç¨æ¥è®¡ç®æ§è¡ç¹å®ä»£ç æè±è´¹çæ¶é´ã
该ç®æ³ä¼æä¹±å表å ç´ ç顺åºï¼å®ä¸»è¦ä¼éè¿Fisher-Yatesç®æ³å¯¹æ°å表è¿è¡æåºï¼
ä¸éè¦é¢å¤çæä½å°±è½äº¤æ¢ä¸¤ä¸ªåéçå¼ã
以ä¸ï¼æ¯æç®åå举çå个pythonæç®ä»£ç ï¼æ¿èµ°å³ç¨ï¼å¸æå¯¹ä½ ææ帮å©ï¼
pythonæ°æ代ç æåªäºï¼pythonæ°æ代ç æå¦ä¸ï¼
defnot_emptyï¼sï¼ã
returnsandlenï¼sãstripï¼ï¼ï¼0ã
#returnsandsãstripï¼ï¼ã
#å¦æç´æ¥ååsãstripï¼ï¼é£ä¹så¦ææ¯Noneï¼ä¼æ¥éï¼å 为None没æstripæ¹æ³ã
#å¦æsæ¯Noneï¼é£ä¹Noneandä»»ä½å¼é½æ¯Falseï¼ç´æ¥è¿åfalseã
#å¦æséNoneï¼é£ä¹å¤å®sãtripï¼ï¼æ¯å¦ä¸ºç©ºã
ç¸å ³ç®ä»ã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±æ°çåè½åæ°æ®ç±»åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
å¹´æï¼è¯è¨æµè¡ææ°çç¼è¯å¨Tiobeå°Pythonå å为æå欢è¿çç¼ç¨è¯è¨ï¼å¹´æ¥é¦æ¬¡å°å ¶ç½®äºJavaãCåJavaScriptä¹ä¸ã
è´¨æ°è¡¨ä»£ç ï¼è´¨æ°è¡¨ä»£ç æ¯æç¨ç¼ç¨è¯è¨çæä¸ç³»åè´¨æ°ç代ç ãè´¨æ°æ¯æåªè½è¢«èªèº«å1æ´é¤çèªç¶æ°ï¼å¦2ï¼3ï¼5ï¼7çã
ä¸åçç¼ç¨è¯è¨æä¸åçå®ç°æ¹æ³ï¼æå¯ä»¥ç»ä½ ä¸äºåèã以ä¸æ¯ä¸äºç½ä¸æç´¢å°çè´¨æ°è¡¨ä»£ç 示ä¾ï¼
Cè¯è¨ï¼
#includestdio.hintmain(){ ?inti,j;?printf("2\n");?for(i=3;i=;i+=2)//ä»3å¼å§éåå¥æ°
{ for(j=3;ji;j++)//å¤ææ¯å¦è½è¢«å°äºå®çå¥æ°æ´é¤{ ?if(i%j==0)//å¦æè½æ´é¤ï¼åè·³åºå¾ªç¯
break;
}if(j==i)//å¦æ循ç¯æ£å¸¸ç»æï¼å说ææ¯è´¨æ°ï¼æå°åºæ¥
printf("%d\n",i);}?return0;}
Pythonï¼
#!/usr/bin/python#-*-coding:UTF-8-*-
#è¾åºæå®èå´å çç´ æ°
#ç¨æ·è¾å ¥æ°æ®lower=int(input("è¾å ¥åºé´æå°å¼:"))
upper=int(input("è¾å ¥åºé´æ大å¼:"))
fornuminrange(lower,upper+1):?#ç´ æ°å¤§äº1
ifnum1:foriinrange(2,num):?if(num%i)==0:breakelse:?print(num)
go map and slice --
golangæ¯å¼ä¼ éï¼ä»ä¹æ åµä¸é½æ¯å¼ä¼ éé£ä¹ï¼å¦æç»æä¸ä¸å«æéï¼åç´æ¥èµå¼å°±æ¯æ·±åº¦æ·è´ï¼
å¦æç»æä¸å«ææéï¼å æ¬èªå®ä¹æéï¼ä»¥åsliceï¼mapç使ç¨äºæéçå 置类åï¼ï¼åæ°æ®æºåæ·è´ä¹é´å¯¹åºæéä¼å ±åæååä¸åå åï¼è¿æ¶æ·±åº¦æ·è´éè¦ç¹å«å¤çãå 为å¼ä¼ éåªæ¯ææéæ·è´äº
mapæºç :
/golang/go/blob/a7acf9afbdcfabfdf4/src/runtime/map.go
mapæéè¦ç两个ç»æä½ï¼hmap å bmap
å ¶ä¸ hmap å å½äºåå¸è¡¨ä¸æ°ç»çè§è²ï¼ bmapå å½äºé¾è¡¨çè§è²ã
å ¶ä¸ï¼å个bucketæ¯ä¸ä¸ªå«bmapçç»æä½.
Each bucket contains up to 8 key/elem pairs.
And the low-order bits of the hash are used to select a bucket. Each bucket contains a few high-order bits of each hash to distinguish the entries within a single bucket.
hashå¼çä½ä½ç¨æ¥å®ä½bucketï¼é«ä½ç¨æ¥å®ä½bucketå é¨çkey
æ ¹æ®ä¸é¢bmapç注éå /golang/go/blob/go1..8/src/cmd/compile/internal/gc/reflect.go ï¼
æ们å¯ä»¥æ¨åºbmapçç»æå®é æ¯
注æï¼å¨åå¸æ¡¶ä¸ï¼é®å¼ä¹é´å¹¶ä¸æ¯ç¸é»æåçï¼èæ¯é®æ¾å¨ä¸èµ·ï¼å¼æ¾å¨ä¸èµ·ï¼æ¥åå°å 为é®å¼ç±»åä¸åè产ççä¸å¿ è¦çå å对é½
ä¾å¦map[int]int8ï¼å¦æ key/elem/key/elemè¿æ ·åæ¾ï¼é£ä¹int8ç±»åçå¼å°±è¦padding 7个åèå ±bits
æ´å¤å¯åè
/p/
/articles/
å æ¤ï¼sliceãmapä½ä¸ºåæ°ä¼ éç»å½æ°å½¢åï¼å¨å½æ°å é¨çæ¹å¨ä¼å½±åå°åsliceãmap