JavaWeb
Java用来开发动态Web的一系列技术(JavaWeb)
JavaWeb的三大组件(接口)【Servlet、Filter、Listener】
Servlet****:处理请求的一段服务器小程序;
继承HttpServlet;处理请求,给浏览器响应数据
重写 doXxx():doGet、doPost
HttpServletRequest:封装HTTP请求报文数据
req.getParameter():获取请求参数(报文:首行url?、请求体)
req.getHeader():获取请求头
HttpServletResponse:封装HTTP响应报文数据;
响应首行:响应状态码,响应消息
200:ok;成功
302:重定向; 响应头 Location:指向新位置
404:未找到; 路径不对,服务器处理不了
500:服务器内部异常; 程序内部出错
resp.setHeader():设置响应头
resp.getWriter().write():给响应体写数据;
转发和重定向:前后不分离,服务端渲染页面
转发:req
重定向:resp
JSP:动态页面技术
**${}**:去域对 ...
XML&HTTP&Tomcat
XML什么是XMLxml(可扩展标记语言) 是一种用于存储和传输数据的标记语言
其核心设计目的是保存数据、传输数据而非显示数据
基础语法一个XML文档必须包含根元素,所有其他元素都包含在根元素内
<?xml version="1.0" encoding="UTF-8"?> <!-- XML声明 --><root> <!-- 根元素 --> <!-- dom4j xpath sax --> <child>Content</child></root>
HTTP报文格式请求报文首行:请求首行、响应首行
头:请求头、响应头
空行
体(真正交换的数据):请求体、响应体;
Sec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflate, br, zstdAccept-Language: zh-CN,zh;q=0.9,en;q=0. ...
MySql
数据库基础什么是数据库数据库(Database)是一种用于高效存储、管理和组织数据的系统。
它通过特定的数据结构将数据有序存储,并提供强大的查询、修改、删除和安全控制功能,确保数据的一致性、完整性和可访问性。
数据库是“数据的仓库”,但远不止于简单的存储,更强调对数据的高效管理与利用。
常见数据库类型
关系型数据库(RDBMS, Relational Database Management System)
数据模型:基于数学中的“关系理论”,数据以二维表格(关系表)形式存储,表之间通过“键”(如主键、外键)关联。
特点:严格的结构化、支持复杂查询(如多表关联)、强一致性。
典型产品:MySQL、Oracle、PostgreSQL、SQL Server。
适用场景:需要精确数据关联和事务的场景(如银行交易、财务系统、电商订单管理)。
类似于 excel 存储数据的方式
非关系型数据库(NoSQL, Not Only SQL)
数据模型:打破传统表结构,采用更灵活的模型(如键值对、文档、列族、图),适合存储非结构化或半结构化数据(如JSON文档、日志、社交关系)。
特点:高 ...
aosp
配置ububtu22.04安装过程参考以下文章:
VMware虚拟机安装Ubuntu详细教程_vmvare安装ubuto-CSDN博客
安装curl工具
sudo apt-get install curl
更换软件下载源
命令行方式
修改 /etc/apt/soruces.list文件
sudo apt-get update 更新源
图形化方式
关于 -> 软件更新 -> 下载自 -> 其他站点 -> aliyun
使用命令行方式时,要先对原来的配置文件进行备份:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.baksudo rm -rf /etc/apt/sources.list
然后从清华大学镜像站获得url:
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
然后使用nano编辑器进行编辑:
sudo nano /etc/apt/sources.list
安装源码下载前置知识aosp源 ...
unidbg
unidbg介绍unicorn介绍都需要自己来实现
好比是一个CPU,可以模拟执行各种指令
提供了很多编程语言接口,可以操作内存、寄存器等
但它不是一个系统,内存管理、文件管理、系统调用等
基于unicorn开发的框架cemu 用来学习汇编的好工具
AndroidNativeEmu Python开发
unidbg Java开发
unidbg支持模拟JNI调用
支持模拟系统调用指令
支持ARM32和ARM64
支持Hookzz、Dobby、xHook、原生unicorn Hook等Hook方式
支持Android、iOS
好比是在CPU上搭建了一个系统,因此可以很方便地在PC端模拟运行so
学习成本较低,不需要复现so算法,补环境后直接运行即可
unidbg项目地址https://github.com/zhkl0228/unidbg
导入工程从GitHub下载项目,解压后,使用IDEA打开
工程结构unidbg-master -> unidbg-android -> src
main 工程源码
test 测试案例
java 测试案例的源码
resources 测试案例的资源
...
lsposed
lsposed模块开发
AndroidManifest.xml -> application 标签中加入以下内容
<meta-data android:name="xposedmodule" android:value="true" /><meta-data android:name="xposeddescription" android:value="xiaojianbang Hook Demo" /><meta-data android:name="xposedminversion" android:value="54" />
app -> build.gradle -> dependencies 中加入以下内容
compileOnly files('libs\\api.jar')
将 api.jar 放入 libs 目录下, 在 api.jar ...
androidSo
枚举各种let imports = Process.findModuleByName("libxiaojianbang.so").enumerateImports();for(let i =0; i<imports.length; i++){ let _import = imports[i]; if(_import.name.indexOf("pthread_create") !== -1){ console.log(JSON.stringify(_import)); }}let exports = Process.findModuleByName("libxiaojianbang.so").enumerateExports();for(let i =0; i<exports.length; i++){ let _export = exports[i]; if(_export.name.indexOf("Java ...
ARM汇编
寻址方式ARM汇编转换网站:https://armconverter.com/
寄存器间接寻址LDR指令将内存中的数据加载到寄存器中
ARM32: LDR R1, [R2] --> R1 = *R2处理器执行 LDR R1, [R2] 时,它会查看寄存器 R2 里存储的数值,将其作为一个内存地址,然后从这个内存地址对应的存储单元中读取数据,最后把读取到的数据存放到寄存器 R1 中。ARM64: LDR X1, [X2] --> X1 = *X2LDP X1, X2, [X0]从 X0 寄存器的值所表示的内存地址处,读取一个 64 位的数据,并将其存储到寄存器 X1 中。接着,从 X0 + 8(因为每个 64 位数据占 8 字节)所指向的内存地址处,再读取一个 64 位的数据,并将其存储到寄存器 X2 中。
STR指令将寄存器的数据存入内存中
ARM32: STR R1, [R2] --> *R2 = R1该指令会把寄存器 R1 里的数据存到以寄存器 R2 的值作为地址的内存单元中。比如,若 R1 中的值是 0x1234,R2 中的值是 0x40000000,那么就会 ...
ndk
学习目的:学会ndk编程编写基本c代码so中常用的log输出//引入头文件#include<android/log.h>//第一个参数为日志等级,第二个参数为tag,第三个参数为输出文本__android_log__print(int prio, const char* tag, const char* text);//为了方便起见,通常这样定义#define LOGD(......) __android_log__print(ANDROID_LOG_DEFAULT, TAG, __VA_ARGS__)
NDK多线程创建多线程//线程id,其实就是longpthread_t thread;//线程id 线程属性 函数 传递pthread_create(&thread, nullptr, myThread, nullptr);//等待线程执行完毕//默认的线程属性是joinable随着主线程结束而结束//线程属性是dettah,可以分离执行pthread_join(thread, nullptr);//子线程中使用它来退出线程pthread_exit(0)
传参 ...
frida的Python库使用
学习目标:了解frida的python库的使用为什么需要使用frida的python库
之前介绍的frida更多是用于手工调试阶段,如果要用代码自动化处理,还需要其他语言介入,比如python爬虫
后续介绍的frida算法转发方案的rpc也需要使用python,算法转发和rpc能给逆向带来无比便捷的体验
frida可以实时与python进行数据交互,可以把数据发送给python,等待python处理完后,接收返回值,frida再接着往下执行代码
python提供的各种库,让代码编写更为简单
包名注入# -*- coding: UTF-8 -*-import frida, sysjsCode = """ Java.perform(function(){ var RequestUtil = Java.use('com.dodonew.online.http.RequestUtil'); RequestUtil.encodeDesMap.overload('java.lang.Strin ...