- 博客(110)
- 资源 (3)
- 收藏
- 关注
原创 Android app加壳原理分析及壳程序编写
Android应用程序加壳是一种保护机制,通过在原始APK文件的外部添加额外的层(壳),使得攻击者更难分析、修改或破解应用程序。下面是一个整体加载dex文件的壳程序,它会解密并加载解密后的dex文件,壳程序的实现在native层,增加了静态分析的难度。核心点在于壳程序会先于被保护的代码运行,它负责检查运行环境是否安全、解密并执行我们的代码。newDexClassLoader 创建新的类加载器,加载已解密的dex文件。壳程序启动入口,它负责解密并加载原代码dex文件,并替换当前的类加载器。
2024-01-17 10:35:23
2712
2
原创 openjdk-jdk8-b109 hotspot虚拟机启动过程分析_1
基于OpenJdk 标签 jdk8-b109版本分析HotSpot是由Oracle开发的Java虚拟机(JVM)的一种实现,也是使用最广泛的JVM之一。
2023-10-17 15:26:02
297
原创 在Windows平台编译OpenJdk8
学习了一段时间OpenJdk源码后,需要实践来验证自己对jvm各个组件运作机制的理解是否正确,这需要通过调试jvm来实现,而在windows平台编译openjdk是比较繁琐的,这其中遇到了一些坑,记录下build的过程以备不时之需。
2023-10-16 09:58:53
642
原创 .Net Core 动态加载和卸载程序集
从 .Net Core 3.0开始支持程序集的加载和卸载,在 .Net FrameWork中使用独立的应用程序域来实现同样的功能,.Net Core 不支持创建多个应用程序域,所以无法使用多个应用程序域来实现程序集动态加载和卸载。
2023-08-15 19:03:18
1644
原创 Windows 10 X64 内核对象句柄表解析
fweWindows 很多API函数都会创建和使用句柄(传入参数),句柄代表一个内核对象的内存地址,每个进程都有一个句柄表,它保存着进程拥有的句柄,内核也有一个句柄表 PspCidTable,它保存着整个系统的句柄。0xffff8d85`570ff000 notepad.exe句柄表地址,低两位为0 表示是1级表。(句柄项>>0x10)&0xfffffffffffffff0 = 对象地址(低位)句柄表地址+(进程ID>>0xa*8)-1。从内核句柄项中解析出内核对象地址。由上内核函数逆向可知。
2023-05-24 15:49:28
1717
1
原创 openpilot 项目解析及 xgnpilot
xgnpilot是我从基于openpilot-0.8.13官方分支fork并二次开发的辅助系统,它增加了一些日常驾驶中比较实用的功能,这些功能其它基于openpilot fork的分支已有实现(dragonpilot),该版本只适用于大众车系Sorry(我的车辆是大众)其它车系没有支援。全时保持踩刹车或油门时系统依然可以控制车辆方向(横向控制),复杂路况下很实用。辅助变道官方已实现了,但官方分支不支持关闭该功能,现实中该功能并不被广泛接受,我实现了该功能的开/闭控制。
2023-01-20 19:11:16
3793
3
原创 Linux内核-tasklet微任务
tasklet用于处理一些不那么紧急的任务,可以延后在将来的某个时间点来执行,linux通过中断来响应处理一些任务,这类任务通常是很紧急的需要立即处理,此类任务通常运行于interrupt context(中断上下文),存在较多限制。tasklet实现原理tasklet实现基于软中断(softirq),而软中断基于硬件中断,它们的优先级逐次递增。简单描述下处理流程,当前硬件中断时,内核根据irq号进而执行该IRQ的处理例程(ISR),irq处理例程结束后处理软中断,tasklet软中断例程遍.
2022-03-14 22:00:19
1507
原创 Linux内核中断(X86)
基本上Linux支持的平台都或多或少采用了中断的概念,中断可以周期性产生或者随机产生,如:网卡硬件在收到数据包时会产生中断,而后内核中断处理例程将进行处理。中断的分类:硬件中断由与CPU连接的外设产生的中断,外设无法产生中断,是通过一个中断控制器产生中断。软中断由内核模拟实现的一种中断机制,是平台无关的,它依赖于硬件中断。同步中断和异常:由CPU自身产生,例如 除零 或用户空间应用程序访问了一个地址空间,该地址空间没有关联物理页...
2022-02-15 10:09:55
868
原创 Linux 字符设备驱动程序
前段时间遇到一个功能需求,需要将内核空间的一些数据结构和接口导出给用户空间,当然这可以通过自定义文件系统、netlink等机制实现,但为了实现更一般的接口,决定通过字符设备来实现,编写字符设备驱动程序,向用户空间导出设备文件,这样用户空间程序可以使用简单的读写文件操作设备,由于Linux内核当前更新到5.x版本了,字符设备的实现较之前版本(很早了,我以前研究的2.6.x)还是有些区别,所以赶紧研究了5.x版本内核的驱动管理实现,并整理了当前内核版本的字符设备驱动编写流程。驱动程序是操作系统很重要组成部分
2021-09-06 15:00:51
269
原创 Linux内核模块原理
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习..
2021-06-18 18:00:42
2038
原创 X86架构保护模式研究
最近在研究X86架构保护模式,记录下研究过程,然后写了一个汇编启动程序来验证保护模式下,指令执行方式。提到保护模式就不得不提
2021-06-11 16:57:57
286
2
原创 Linux 进程调度分析
系统中存在很多进程,它们由进程调度组件调度交替运行,多个进程共享CPU时间,每个进程使用CPU时间的一部分(时间片),由于时间很快,造成了并行执行的错觉。
2021-04-27 13:24:26
224
原创 Java线程同步方式记录
jvm对java多线程做了很多优化,这里对java线程的多个同步方式做一个记录。synchronized关键字 被该关键字修饰的方法块或方法执行时,会先尝试获取锁,如果其它线程已获取锁,则等待线程释放锁,多个线程等待锁时,不是按照等待获取锁的线程顺序来获取锁,这是一个重量级锁,底层会使用monitorenter、monitorexit指令,jvm会采取一定的优化措施private void incr(){ synchronized (SyncService.cl...
2020-12-24 17:02:00
162
原创 Java9的Module机制研究
从Java9开始支持了模块化机制,可以按照模块划分功能,总结下来Module有以下优点:JRE可定制化 Java9前需要在目标机器上安装完整的JRE环境,JRE是包含运行java程序的所有需要的库,但里面的东西并不是所有应用都需要,通过Module可以为应用量身定制JRE,这大大减少了JRE的大小和运行时内存消耗,如应用只需要依赖java.base模块,那么我们可以定制一个只包含java.base模块的JRE,这样去掉用大量无需用到的类库,整个JRE的运行消耗更少,更轻量化。封装性...
2020-10-29 21:11:42
461
原创 Centos8 使用kubeadm部署k8s集群
趁着春节体验了把Centos8,用着感觉和7没有太大变化,由于重新安装了Centos8,以前配置的k8s环境要重新配置了,在Centos8上配置docker和k8s遇到了不少坑,记录一下部署过程。卸载podman,centos8默认安装了podman容器,它和docker有冲突需要卸载掉yum delete podman配置yum国内镜像https://blog.youkuaiyun.com/...
2020-01-30 22:04:48
4075
2
原创 基于代码配置的EF6
这里并不是EF的CodeFirst模式,而是把EF配置项从配置文件,移到程序代码中了,在基于配置文件的程序中,最小化的EF配置有注册提供程序、连接工厂、EF框架注册,如果项目作为DLL库需要提供给其它项目使用,那么在宿主项目的配置文件中,要包含EF的配置项,这是很不方便的,基于代码配置只需要引用DLL即可,无需在配置文件中配置EF项。建表create table student(...
2020-01-07 20:54:49
398
原创 从源码构建Kubernetes环境
Kubernetes是什么它是一个管理底层容器(Docker)的自动化平台。程序列表:etcd-v3.2.28-linux-amd64.tar.gz KV存储仓库,可以配置共享和服务发现。kubernetes 版本 v1.18.0-alpha.0 k8s源码包,基于当前最新版本Docker 容器引擎 18.09.3GoLang 1.13.4 li...
2019-12-04 11:09:17
293
原创 Windows 异常处理原理
Windows运行过程中,不可避免会产生各种异常(由内核或应用程序),系统提供了一套强大的异常处理机制,灵活的使用它,可以让我们的应用程序变的更健壮。了解涉及异常处理的数据结构IDT 系统中断表有异常产生时,处理器根据IDT的中断号,找到对应的处理函数 KiTrapxx,异常处理函数会将异常封装到一个数据结构。typedef struct _EXCEPTION_RECORD3...
2019-09-30 11:16:50
495
原创 Vue同级组件的通信
Vue父子级组件通信可以用自定义事件,通过在父组件定义一个事件,然后在子组件中$emit("事件名",....参数),即可触发父组件定义的事件,如果是同级组件就不能这样直接通信,因为脱离了事件的作用域了,但平时开发中确实会有这样的需求,可以通过一个中间组件来实现消息传递,中间组件 可以理解成 同级组件的通信桥梁,但可以通过可以访问 中间组件来获取数据。这个中间组件可以是新的Vue实例、根实例,...
2019-04-25 10:41:51
526
原创 Mybatis使用
什么是Mybatis官网的介绍 Mybatis是 支持 自定义SQL、存储过程、高级映射的基于Java语言开发的数据库持久性框架。在日常Java开发中,离不开数据库操作,Java通过JDBC来操作数据库,但JDBC操作繁琐,不利于快速开发。Mybatis把JDBC的繁琐细节都处理了,可以让我们专注业务功能的开发。首先要明白Mybatis的两个重要概念Configuration和Ma...
2019-03-18 19:15:53
179
原创 Asp.Net Core 模型绑定 浅析
Web开发中常需要在Controller的操作方法中获取客户端传递过来的值注:Asp.Net Core Web Api我们常常会这样写[Route("TestApi")] [HttpPost] public string TestApi2([FromForm]string arg1, [FromForm]int arg2, [FromForm]Date...
2019-02-20 11:21:32
1119
原创 用C语言写Python扩展 Windows
Python在各个方面的开发都有涉及,但也不是所有需求都能满足,例如对于 安全性、性能等要求比较高的场景下就不适用了。但可以通过C语言写Python扩展的方式,来扩展现有的Python功能,现在将以前写Python扩展的步骤记录下来以免忘记 #include "Python.h"/*定义一个包装函数 实现执行shell命令的功能*/static PyObject *sp...
2019-01-18 11:25:34
277
原创 EF Mysql confgi配置文件遇到的坑
<startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm
2018-11-22 17:12:11
350
原创 Java动态代理回顾
代理:代替某人做一些事情这里引申出几个属于 委托人、被委托人通俗说就是 我要找刘德华打广告,我不能直接找上他本人,我要先找他的代理人才行。为什么不能找上他本人呢?因为代理可以为他过滤掉一些收益不高或者公司实力不雄厚的广告业务,也就是说代理存在的意义是在真正做某件事前,先做一些事前准备。Java中有两种代理实现方式 静态代理、动态代理静态代理:静态代理实际上就是声明一个...
2018-09-13 12:29:01
210
原创 Net Core 微服务
现在微服务很火,越来越多的公司把以前的系统,按业务功能分割成一个个小的、独立的服务模块。Net Core可以基于以下库实现微服务Ocelot 是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成Consulgoogle开源的...
2018-09-10 14:36:09
657
原创 Asp.Net Mvc 运行机制原理分析
最近一段时间接手过的项目都是基于Asp.Net的,以前对aspnet运行机制有一个大概的了解,总觉得不够透彻,按自己的理解来分析一下。Asp.Net 运行机制理解mvc运行原理的前提是要了解aspnet运行原理,这方面网上资料多如牛毛,我这里就大致说一下aspnet生命周期Http请求到IIS后,如果是静态资源则IIS读取后返回客户端,动态请求被isap.dll 转发自net托管平...
2018-08-23 14:16:41
5063
原创 在汇编的角度来理解C语言3级指针
C语言中指针使用频率是很高的,我们知道指针一个特殊的变量,它的值是指向一块内存地址我写了一个简单的C代码void Test1(){ int ***ptr_int = NULL; int i1 = 100; int *ptr_1 = &i1; //一级内存地址空间偏移 int **ptr_2 = &ptr_1; //二级内存地址空间偏移...
2018-07-09 11:41:05
561
原创 Net Core WebApi 使用Swagger 文档
Swagger 是一个项目api文档框架,能提供更友好的api文档界面1.创建Asp.Net Core Web Api项目2. 引入NuGet包 Swashbuckle.AspNetCore3.修改Startup.cspublic void ConfigureServices(IServiceCollection services) { services.A...
2018-06-18 12:31:01
465
原创 继HttpClient类后,再一个HttpUtil用于访问http/https类,简化操作。
HttpUtilusing System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Threading.Tasks;namespace ConsoleApp2{ public stati...
2018-04-13 11:04:01
414
原创 EasyPR中文车牌识别(开源项目)
EasyPR 当前版本基于OpenCV 3.1开发。地址: 项目地址环境搭建 VS2017+OpenCV 3.1libeasypr 为项目工程demo 为Test测试演示下载OpenCV 解压到一个目录中设置 libeasypr 项目属性 VC++目录-》包含目录:D:\Projects\EasyPR-master (项目根目录)D:\opencv3.1\opencv\build\include\...
2018-03-02 14:21:21
2494
1
原创 MFC 组合按键实现
软件开中有时候需要实现按下 Ctrl+A 等组合按键,在MFC直接捕获 ON_WM_KEYDOWN 是无法触发事件,需要重载PreTranslateMessage 函数直接上代码BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG *msg){ //键盘按键 if(msg->message>=WM_KEYFIRST && msg-
2016-12-16 10:45:12
1537
原创 AndroidStudio NDK开发
以前一直用Eclipse做Android开发,后来谷歌宣布停止ADT的更新了,无奈转向使用AndroidStudio这个IDE了。Android NDK开发 :使java能够调用C/C++写的SO库,其实就是Java的jni技术好处:APK破解难度增大,把核心业务逻辑写到so库里,会增加破解的门槛。先说下我的环境Windows 7 SP1 64位JDK版本 java vers
2016-07-26 17:22:15
482
原创 C# Http网络访问类
using System;using System.Collections.Generic;using System.IO;using System.Net;using System.Text;namespace HttpClient{ /// /// 通过Http协议访问Web /// public class HttpClient {
2016-07-05 14:54:29
2732
原创 Python库应用之Json
近一年没有写博客了,现在对编程还是爱不释手。Json是一种轻量级的数据交换格式# -*- coding: utf-8 -*-import json#解析json格式字符串,返回的是一个元组jobj=json.loads('{"Key":"Value","data":[{"a1":"A1"},{"a2":"A2"}]}')#json 数组被解析成list for v in jobj
2016-03-11 09:22:02
466
原创 Java Swing 布局管理器
package javagui.ui;import java.awt.Color;import java.awt.Image;import javax.swing.ImageIcon;public class GUIMain { public static void main(String[] args) { /*Window1 win1=new Window1()
2014-07-08 11:35:29
748
原创 Java 加载Jar包
//Jar包的路径 File f=new File(""); String path=f.getAbsolutePath()+File.separator+"JavaServer.jar"; //使用类加载器加载 JarFile jarfile=new JarFile(new File(path)); URL url=new URL("file:"+path); Cl
2014-06-27 10:40:25
835
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人