最近需要修改一个QT编写的应用,就是将资源图片修改一下,但是资源图片被打包到DLL的.rdata段中,无法直接导出,于是想通过Python直接读取导出,然后定位需要修改图片的位置。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# -*- coding:utf-8 -*-

import os,sys,re

def find_all_pos(filename,feature):
"""打开二进制文件,搜索指定特征的位置,并返回所有位置的列表
"""
with open(filename, 'rb') as binFile:
binFileStr = binFile.read()
posArray = [m.start() for m in re.finditer(feature, binFileStr)]
return posArray

def export_all_png(filename,posArray):
"""打开二进制文件,根据特征位置数组,导出所有的PNG文件
"""
with open(filename, 'rb') as binFile:
for i in range(len(posArray)-1):
pngLen = posArray[i+1] - posArray[i]
# print(pngLen)
binFile.seek(posArray[i])
pngFileBin = binFile.read(pngLen)
pngFile = open("res\\"+str(i)+".png", "wb")
pngFile.write(pngFileBin)

def find_feature_pos(filename,feature):
"""打开二进制文件,搜索指定特征最早出现的位置,并返回结果
"""
with open(filename, 'rb') as binFile:
binFileStr = binFile.read()
result = re.search(feature,binFileStr)
try:
return result.span(0)[0]
except:
return -1

def merge_new_file(filename,feature_pos):
"""打开二进制文件,提取特征之后的数据,与新的文件头合并
"""
file_header=b"\x44\x55\x66"
with open(filename, 'rb') as binFile:
binFile.seek(feature_pos)
datFileBin = binFile.read()
datFile = open(filename[:-4]+"_new"+filename[-4:], "wb")
datFile.write(file_header)
datFile.write(datFileBin)

def walk_files(src_filepath = ".", file_name_feature=".exe"):
"""遍历目录中的文件,提取指定特征的文件
"""
filepath_list = []

for root, dirs, files in os.walk(src_filepath):
for file in files:
if file.endswith(file_name_feature)==False:
continue
if root == '.':
root_path = os.getcwd() + "/"
else:
root_path = root

if (root_path != src_filepath) and (root != '.'):
filepath = root_path + "/" + file
else:
filepath = root_path + file

if filepath not in filepath_list:
filepath_list.append(filepath)

return filepath_list

if __name__ == "__main__":
for path in sys.argv[1:]:
if os.path.isfile(path):
posArray = find_all_pos(path,b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
# 位置数组应该大于1
if(len(posArray)>1):
# print(posArray)
if(os.path.exists("res")==False):
os.makedirs("res")
pngList=""
for i in range(len(posArray)):
pngList = pngList + str(i) + ",0x%x"%posArray[i] +"\n"
# 保存图片位置信息
pngFileMeta = open("res\\pnglistpos.csv", "w")
pngFileMeta.write(pngList)

export_all_png(path,posArray)

运行时采用如下命令:

1
2
3
python -m venv env
.\env\Scripts\activate
python utf8_to_gbk.py filepath

参考链接

  1. PNG文件格式详解,by oriole.
  2. Python输出列表list,by huang_0430.
  3. python创建目录(文件夹),by FanWinter.
  4. python 数字 十六进制 打印,by wowocpp.
  5. python文件的打开、读取、关闭、写入与二进制文件的读写操作,by aliyun.
  6. How to find all occurrences of a substring?,by stackoverflow.
  7. 如何逆向解决QT程序汉化中的乱码问题-干货,by 葫芦娃很厉害.
  8. 如何汉化一个软件,by CCDebuger.
  9. Qt 资源系统(Qt Resource System),by 南理汉子.

常用的Web服务器主要有Apache和Ngnix,下面记录其配置方法。

Apache Web服务器

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器软件,可以在大多数电脑操作系统中运行。由于其跨平台和安全性,被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。

httpd.conf配置

Apache的主配置文件是httpd.conf。

httpd-vhosts.conf配置

Apache虚拟主机的配置文件是httpd-vhosts.conf。

问题清单

  • Apache配置虚拟主机后,不能访问localhost,但使用127.0.0.1可以访问的问题

请参考Apache配置虚拟主机后,不能访问localhost的问题。

Ngnix Web服务器

Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。该软件由俄罗斯程序员伊戈尔·赛索耶夫(Игорь Сысоев)开发并于2004年首次公开发布。2011年成立同名公司以提供支持服务。2019年3月11日,Nginx公司被F5网络公司以6.7亿美元收购。

nginx.conf配置

Nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。

参考链接

  1. Apache配置文件httpd.conf详解,by garyond.
  2. Apache配置文件详解,by 思忆技术.
  3. Apache httpd.conf配置文件 3(虚拟主机),by 乌托邦眺望.
  4. Apache HTTP服务器,by wikipedia.
  5. Nginx配置文件详解,by 程序员自由之路.
  6. 万字长文看Nginx配置详解!,by 大江狗.
  7. Nginx,by wikipedia.
  8. Apache配置虚拟主机后,不能访问localhost的问题,by LauEl.

最近在使用IDA和X64dgb调试Windows可执行程序时,老是失败,严重怀疑其使用了反调试技术。因此学习一下Windows程序反调试技术,以期望能解决Windows可执行程序动态调试失败的问题。

静态反调试技术

进程状态检测

调试环境检测

动态反调试技术

时钟检测

异常处理

0XCC探测

硬件断点检测

自调试

单步检测

参考链接

  1. Windows下反(反)调试技术汇总,by topsec.

最近获得一个Matlab高版本的项目代码,其文本文件时utf8编码格式,而我的Matlab版本比较低,只支持gbk编码格式,于是采用Python批量转换文本编码格式。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import os,sys

extArray=(".m",".txt")

def convert( filename, in_enc = "UTF-8", out_enc="GBK" ):
try:
print("convert " + filename)
targetFile = open(filename,'r',encoding=in_enc)
content = targetFile.read()
targetFile.close()

targetFile = open(filename,'w',encoding=out_enc)
targetFile.write(content)
targetFile.close()
except:
targetFile.close()


def explore(dir):
for root, dirs, files in os.walk(dir):
for file in files:
path = os.path.join(root, file)
if(path.endswith(extArray)):
convert(path)

def main():
for path in sys.argv[1:]:
if os.path.isfile(path):
convert(path)
elif os.path.isdir(path):
explore(path)

if __name__ == "__main__":
main()

运行时采用如下命令:

1
2
3
python -m venv env
.\env\Scripts\activate
python utf8_to_gbk.py filepath

参考链接

  1. Python遍历路径下文件并转换成UTF-8编码,by weixin_33826268.
  2. Python 批量转换文件编码格式,by huang_0430.
  3. GB2312、GBK、GB18030 这几种字符集的主要区别是什么?,by zhihu.
  4. 一图弄懂ASCII、GB2312、GBK、GB18030编码,by horstxu.
  5. Unicode、UTF-8、UTF-16 终于懂了,by LinuxThings.

需要从安卓系统中已安装的APP中提取出APP的安装包,因此研究了以下。

安装adb

下载adb:

https://dl.google.com/android/repository/platform-tools-latest-windows.zip

配置环境变量PATH

提取Apk

提取Apk的步骤如下:

  • 用usb数据线连接手机和电脑,启用手机开发模式,设置usb调试模式
  • 在cmd窗口中输入命令adb devices,查看手机和电脑是否连接成功
  • 执行 adb shell pm list packages 命令,查看需要提取的APP
  • 执行 adb shell pm path package_name 命令,获取APP安装路径
  • 执行 adb pull 安装包路径 输出路径 命令,生成APP的apk安装文件

参考链接

  1. windows下载安装adb(极其简单),by x2584179909.
  2. adb的安装和使用,by GX8010.
  3. 安卓提取apk安装包,by juejin.
  4. 从Android 手机取出已安装apk文件,by 雨打芭蕉.

广播式自动相关监视(英语:Automatic dependent surveillance – broadcast,缩写ADS–B)是一种飞机监视技术,飞机通过卫星导航系统确定其位置,并进行定期广播,使其可被追踪。空中交通管制地面站可以接收这些信息并作为二次雷达的一个替代品,从而不需要从地面发送问询信号。其他飞机也可接收这些信息以提供姿态感知和进行自主规避。

ADS-B地面接收设备系统结构

请参考ADS-B数据报文采集与解析系统的设计与实现。

ADS-B数据解析

请参考以下链接:

Virtual Radar Server

Virtual Radar Server 是一个运行本地 Web 服务器的开源 .NET 应用程序。

参考链接

  1. ADS-B数据格式解析,by 陈晓伟.
  2. Cat021 报文解析,by 刘佳华.
  3. 接口和解析软件——ADS-B数据解析软件,by 北京通航电科.
  4. 广播式自动相关监视,by wikipedia.
  5. ADS-B数据报文采集与解析系统的设计与实现,by 索国伟,王金锁,郭荣华,赵 盼.
  6. asterix,by CroatiaControlLtd.
  7. jASTERIX,by hpuhr
  8. EUROCONTROL Specification for Surveillance Data Exchange ASTERIX,by eurocontrol.

协议分析

使用WireShark分析私有网络协议的难度很高,具体方法可以参考以下链接:

WireShark使用方法

请参考wireshark抓包新手使用教程。

协议分析插件开发

请参考以下链接:

注意事项:

  • 一个端口只能绑定一个协议解析器,不管改端口下有多少中报文格式
  • 解析树的TreeItem添加协议字段时,应使用TvbRange数据类型,否则对应hex数据无法高亮显示,示例如下:
1
2
3
4
local t = tree:add( proto_foo, buf() )
t:add_le( proto_foo.fields.bytes, buf(0,4) )
# 实现日期字段的显示
t:add_le( proto_foo.fields.string, buf(0,8), datetime)

数据包回放

wireshark以pcap格式保存抓取的流量。pcap的具体格式请参考Wireshark文件pcap的格式详细解析有实例(Global Header、Packet Header)

可使用tcpreplay、scap、xcap、netassisnt等工具回放pcap文件。

参考链接

  1. wireshark抓包新手使用教程,by Beng Dou.
  2. 一次私有协议的流量分析,by 聚铭网络.
  3. 私有协议的解密游戏:从秘文到明文,by Smoke0901.
  4. Wireshark文件pcap的格式详细解析有实例(Global Header、Packet Header),by Hollake.
  5. 实战编写 wireshark 插件解析私有协议,by 信安之路.
  6. Wireshark C 插件开发之插件框架,by 大川搬砖.
  7. Tcpreplay安装和使用,by lanyou1900.
  8. tcpreplay 快速入门使用,by CAPTIAN船长.
  9. pcap回放——tcpreplay,by zhuxian2009.
  10. Pcap,by wikipedia.
  11. 两款造包工具,科来和xcap,by 周中山.
  12. 报文回放工具:xcap的使用方法,by 荭知.
  13. wireshark插件开发 - 自定义协议,by m0w3n.
  14. Wireshark录取自定义报文的方法,by 卓_然.
  15. Adding Information To The Dissection Tree,by wireshark.

陈浩大神关于绩效考核的观点我很认同,可惜大神已仙逝,无缘一见。以下是他的主要观点:

1)制定目标和绩效,目的不是用来考核人的,而用来改善提高组织和人员业绩和效率的。

2)人是复杂的,人是有状态波动的,任何时候都不应该轻易否定人,绩效考核应该考核的是事情,而不是人。

背景知识

OKR – Objectives, Key Result
KPI – Key Performance Indicator

重要观点

绩效分应该打给项目,打给产品,打给部门,打给代码,而不是打给人。

OKR 三大特性:0)由员工提出,1)以目标为导向。2)全员共享。

KPI 最大的问题就是用 OKR 里的 Key Results 拿来当目标,从而导致员工只知道要做什么,不知道为什么,不知道为什么,不能理解目标,工作也就成了实实在在的应付!

KPI本身是一种被动的、后置的考察,在工作完成之后考察员工的行为是否符合标准。因此,员工对于公司的目标漠不关心,只关心自己的KPI,因为这才是自己的最大的利益,为了达到KPI,有的员工开始不思考,并使用一些简单粗暴的玩法,其实这样既害了公司,也害了自己。自己的成长和进步也因为强大的 KPI 而抛在了脑后。

当然,KPI 绩效考核一般来说,不一定会毁掉公司的,相反,对于喜欢使用蛮力的劳动密集型的公司来说,可能还有所帮助,然而,KPI毁掉的一定是团队的文化和团队的挑战精神,以及创新和对事业的热情,甚至会让其中的人失去应有的正常的判断力(分不清充分和必要条件,分不清很多事的因果关系)。

参考链接

  1. 我看绩效考核,by 陈浩.

最近研究一个C#开源项目,发现在离线的情况下无法顺利编译链接,其原因是缺乏NuGet安装的程序集。因此研究一下NuGet打包和离线安装的方法。

NuGet简介

NuGet是一个自由开源软件包管理系统。用于Microsoft开发平台。以前称NuPack。 2010年首次发布。已经进化为一个庞大的工具与服务生态系统。

下载Nuget程序包

  1. 进入Nuget官网:https://www.nuget.org/,

  2. 搜索框里搜索需要的安装包,例如MaterialDesignThemes,一个主题包,点击自己所需的安装包。

NuGet离线安装软件包

参考链接

  1. C# NuGet打包和离线安装,by mob604756fda125.
  2. NuGet是什么?理解与使用(上),by 6号咸鱼.
  3. Visual Studio NuGet离线安装包,by 苏守坤.
0%