- 博客(528)
- 资源 (13)
- 问答 (4)
- 收藏
- 关注
原创 java proguard混淆示例和结果
前言混淆基础知识混淆基础语法官方指南看了很多混淆的文章但是对于混淆的前后结果语法对比很模糊,因此写下这篇文章。-keep保持类或者成员不被混淆(obfuscate)或者移除(shrink)案例1我们工程下就两个类//MySubLib.javapublic class MySubLib { public void test() { } public String name = "hehlo"; public int age =3;}//MySubLi
2021-10-18 17:19:55 3683
原创 masm 16位汇编 函数原理
本文讲述作者在学习16汇编下函数语法,以及加深了对c++对stdcall等语法本质的理解,以及函数调用带来损耗以及我们常说的线程上下文切换带来代价。本文需要读者有一定80486汇编基础基础知识.函数我们假设需要在汇编实现一个函数需要考虑如下:函数的跳转传参函数的返回地址函数的返回值上下文切换我们首先实现一个简单的交换寄存器变量的函数.data_seg segment ;定义一个双字,注意必须定义双字否则编译器可能视为段内跳转 g_szDst db "hello wo.
2021-10-17 19:01:10 777
原创 masm 16位汇编语法
表达式masm提供了很多表达式方便我们进行编程操作例如:code segmentSTART: mov ax,65+87 mov ax,65 and 78 mov ax,65 lt 66 mov ax, 65 mod 2code endsend START上面的的操作编译器会帮我们实现进行转化为合法的汇编语法要让编译器帮我计算出结果必须提供的表达式在编译阶段就能确定。算数运算:运算符意义例子+加65+32-
2021-10-17 18:07:45 1330
原创 8086 asm文件语法-2
无条件跳转jmp short 标号段内跳,仅能跳转单个字节长度范围(255)data_seg segment g_szSrc db "abcde$" g_szDst db 255 dup(0cch)data_seg endscode segmentSTART: assume ds:data_seg mov ax,data_seg ;放入ds到正确位置 mov ds,ax ;不加 short 也是可以的 jmp short LA
2021-10-17 11:47:39 279
原创 8086 asm文件语法-1
前置的一些编译链接命令code_seg segmentLABLE1: mov ax,bxLABLE2: mov cx,dxcode_seg endsend LABLE1我们在vs插件的dosbox会有内置编译器。执行汇编:ml /c xxx.asm执行链接: link xxxx.obj语法段定义段名字 segment 段定义开始segment ends 结束段定义code_seg segmentcode_seg ends重名段可以重复定义如下面的
2021-10-10 14:42:50 1369
原创 8080汇编指令
数据传送指令(1)mov a,bb的数据传送到a处,注意不能内存到内存中(会引起机器码过长,指令周期过长)关于周期一些术语(2)xchg a,bxchg是exchange, 也叫交换指令,效率高于mov 会使用暂存器。示例[1] xchg ax,bx[2] xchg ax,[100](3) xlat实际相当于执行下面汇编代码 mov al , ds:[bx+al]百度百科xlatxlat 是translate缩写(4) push reg将数值压入栈中(ss作为基地
2021-10-04 12:33:58 625
原创 8080寻址方式总结
寻址概念:寻址表示以何种方式找到一个数据所在的地1 立即寻址直接将常量赋值给寄存器如下命令:mov al,20 #注意8位寄存器mov ax,0xffff #注意16位寄存器2 寄存区寻址数据存放在寄存器中,需要在寄存器中取出mov cl,dlmov ax,bx注意点:段寄存器之间禁止相互赋值ip寄存器不能被赋值mov ds,csmov ip,ax3 直接寻址数据在内存中mov al,[1064h] # 从ds:1064处取出数据放入al注意点:如下代
2021-09-25 22:22:17 407
原创 MsDos下的Debug调试器与8080汇编小实验
环境安装使用vs code插件模拟dos下的环境:(1)安装如下插件(2) 新建一个xxx.asm文件你可以直接在这个界面打开doxbox,然后在内部使用debug(当然你也可以直接装一个doxbox而不是通过vscode).关于插件的更多说明可参阅:VSCode插件说明DEBUG参数说明调试程序DEBUG.EXE寄存器标志位小实验Debug调试工具中标志位说明对照表实验1 查看寄存器CF标志在msdox一个小实验,去查看标志寄存器的CF(全名carry flag)状态。CF用于
2021-09-22 22:25:00 688 2
原创 com编程学习
How to use the Regsvr32 tool and troubleshoot Regsvr32 error messageshttps://pub.dev/documentation/win32/latest/win32/CoGetClassObject.htmlJAVA COM编程
2021-09-19 19:48:08 1927 2
原创 C++ 多重继承下虚表结构
前言昨天写一个项目时遇到一个很诡异的现象 如下代码所示:class ParentA {public : int a=0x123456; virtual void vFunParentA(){ std::cout << "vFunParentA" << std::endl; }};class ParentB {public: int b = 0x456; virtual void vFunParentB() { std::cout<<"vFu
2021-09-05 18:46:31 602
原创 Win32 c++链接mysql数据库
前言我们需求希望能在windows平台下编写c代码链接mysql数据库。安装流程mysql 的安装流程比较简单网上轮子也很多就不介绍了配置工程我们的mysql安装的文件夹如下图:我们打开lib目录看下查看libmysql.dll文件导出信息:具体这些函数的作用可以参考官网mysql官方函数描述配置我们的代码工程:于是乎你可以开心的撸代码:#include <iostream>#include<mysql.h>#pragma comment(l
2021-08-14 22:16:40 507
原创 Win32 网络编程模型
概述我们在进行网络编程时候往往会选择一种方式进行对多个socket进行操作。比如一个socket对应一个线程等Select模型这个模式是将若干socket交付给内核去检测是否可读可写或者有异常。如下代码HandleClientThreadFunc就是检测多个socket#include <iostream>#include<WinSock2.h>#include<WS2tcpip.h>#pragma comment(lib,"Ws2_32.lib")#
2021-08-08 19:14:33 373
原创 MMKV 原理剖析1
前言MMKV开源地址protobuf变长编码//CodedOutputData.cppvoid CodedOutputData::writeRawVarint32(int32_t value) { while (true) { if ((value & ~0x7f) == 0) { this->writeRawByte(static_cast<uint8_t>(value)); return;
2021-07-24 00:23:05 633 3
原创 win32 基础数据发送与接收
前言在Win32中发送基础网络数据相比起其他语言如java可能比较复杂。大致流程:导入Ws2_32.lib根据一定规范初始化Ws2_32.lib创建套接字对象,用于指定协议类型绑定套接字所指定的端口调用收发函数资源回收(1)导入Ws2_32.lib有两种方式指示导入动态库编译宏指示连接器#pragma comment(lib,"Ws2_32.lib")VS中配置(2)初始化Ws2_32.libWSAStartup 文档这里我们直接抄官方文档代码
2021-07-11 15:23:19 493 1
原创 Win32 init操作
前言init是文件时微软提供一种轻量级数据存储方式,对于新版的应用文档提示应使用注册表。我们首先看看init文件的格式:语法比较简单;xxxxxx 注释[xxxx] 表示某个节xxx=yyy我们做下语法总结如下:[section]key=value[section2]key=valueWritePrivateProfileStringA 文档BOOL WritePrivateProfileStringA( LPCSTR lpAppName, LPCSTR lpKey
2021-06-25 11:54:21 335 1
原创 WIN32 消息Hook API
前言在Win32中存在一个消息机制,程序任何点击或者消息都会通过窗口过程下发,而微软提供SetWindowsHookExAPI来来允许我们进行相关事件监听,并且这个监听操作是优先于原始的函数调用的。微软setwindowshookexa相关文档HHOOK SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);微软把Hook分为两种:线程钩子全局钩子
2021-06-23 19:10:09 768 1
原创 MFC dll
相比我们以前的常规c/c++库,我们有时候想添加一些特有mfc资源在里面, 这时候以前的常规库就很难满足我们的需求了。于是微软推出了mfc自己的官方库。我们新建的库的时候可以看到有三类但其实我们可以在另一个角度视为两种类别:mfc常规dllmfc扩展dllmfc常规dll可以给MFC工程和c工程使用,内部自己会在新建一个CWinApp对象其内部大致分为两种类别:静态库和动态库class CMFCShareDllApp : public CWinApp{public: CMFCSha
2021-06-23 16:46:40 899
原创 Win32 内存快照
概述CreateToolhelp32Snapshot docmentation我们可以通过获取内存的快照得到系统当前运行的信息,比如线程进程等。CreateToolhelp32Snapshot可以获得对应当前调用时刻的快照句柄,再通过对应的函数即可查询具体的信息。HANDLE CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID);dwFlags指示哪些系统信息被包含在快照中,比如线程还是module等.具体标志位
2021-06-23 16:46:02 381
原创 win32 多线程编程
#include <iostream>#include <Windows.h>#include<tlhelp32.h>using namespace std;#include <string> DWORD WINAPI myRun( _In_ LPVOID lpParameter) { cout << "子线程的第一个信息" << endl; Sleep(200); cout << "子线程的第.
2021-06-23 16:45:35 363
原创 win32 相关同步api
#include <iostream>#include <Windows.h>#include<tlhelp32.h>using namespace std;#include <string> HANDLE evenHandle;int i = 0;DWORD WINAPI myRun( _In_ LPVOID lpParameter) { cout << "子线程运行" << endl; WaitFor.
2021-06-23 16:45:17 234
原创 Win32 利用远程线程注入dll
一些程序会利用CreateRemoteThread这个函数为其他进程创建一个线程,而传入的线程回调函数地址为kernel32.dll的LoadLibraryA函数。这个函数最原始的功能是用来加载动态库的,而且这个函数可以和最原始的线程回调函数声明是相同的。因此一些Hack利用这个特性来完成一些跨进程dll注入。我们首先观察下这个函数//kernel32.dll HMODULEWINAPILoadLibraryA(_In_ LPCSTR lpLibFileName);在对比下最原始的线程回调函
2021-06-20 18:09:58 683 1
原创 SparseArray 源码分析
SparceArray效率对比我们使用HashMap来进行对比,我们这里使用androiX下面的SparceArray版本对象。实现代码: val hashMap = java.util.HashMap<Int, String>(num) var time = measureTimeMillis { for (i in 0..num) { //请勿直接使用i插入,否则一定能够是sparseArray更快,顺序插入在实际生活很少不具备
2021-06-04 17:26:42 247
原创 Android NDK独立编译链
参考独立工具链(已弃用)Cross-compilation using Clang这段时间复习NDK的时候发现已经在(r21)里面已经完全找不到gcc/g++的影子了,后来发现改用LLVM套件了。于是乎想爽一把单独使用clang进行单独编译成arm的可执行文件,但是--sysroot 等设置了都死活编译不起来报错如下:clang: error: unable to execute command: program not executableclang: error: linker comman
2021-05-29 14:21:39 725
原创 JNI字符编码
前言这段时间看MMKV的时候突然忘了JNI字符编码的= =,于是乎测试了下并记录笔记.首先要明白的概念:在JVM内存中字符串是UTF-16编码.具体可以看参考3其中部分描述如下:In the Java SE API documentation, Unicode code point is used for character values in the range between U+0000 and U+10FFFF, and Unicode code unit is used for 16
2021-05-26 13:45:31 495
原创 AMS常用知识学习 1 app与ams通信
前言其实在网上已经有数不尽的Activity启动流程分析,但是我很多时候喜欢自己在去跟着源码看一遍.加上今年花了很长时间学习Binder所以在次看源码的时候发现思考的方向也有所不同.本文讲解的源码版本为Android 5.0,不会像其他文章一样深入本文所需的前置知识:Binder驱动源码分析目录AMS 和App的关系AMS基础知识AMS全称为ActivityManagerService,在AMS启动时会向ServiceManager注册服务,服务名为activity(binder基础知识可参考
2021-05-22 20:14:03 1038
原创 Okhttp3 设计思想学习
前言Okhttp的源码其实并不难,难的是对于Http的协议的熟悉程度.比如如何缓存.其实Okhttp参考了当前很多热门的浏览器源码而编写成的客户端.你可以看到很多线程数的设置都参考了主流浏览器.你可以把Okhttp视为一个无渲染界面的浏览器即可.Http缓存想要看得懂Okhttp拦截器你首先必须对Http协议自带的缓存机制有一定的了解.这里给出两个参考1 HTTP 缓存(建议切换到英文版本)2 Wikipedia HTTP头字段3 可能是最被误用的 HTTP 响应头之一 Cache-Contr
2021-05-19 00:43:29 336
原创 Glide 自我修养系列 1
参考源码解析:Glide 4.9之缓存策略Glide 源码分析解读-基于最新版Glide 4.9.0Android主流三方库源码分析(三、深入理解Glide源码)深入分析Glide源码
2021-05-14 14:06:47 370
原创 RecycleView 缓存机制
参考文献您可以先看看下面的文章后,再看博主的也许有更大的收货.每日一问 | RecyclerView的多级缓存机制,每级缓存到底起到什么样的作用?深入理解 RecyclerView 的缓存机制RecyclerView缓存原理,有图有真相前言本文所分析的源码版本:androidx.recyclerview:recyclerview:1.1.0缓存本质思想:缓存是一种空间换时间的算法思想.recyclerview缓存了什么:缓存了ViewHolder对象.
2021-05-07 20:02:49 618
原创 Arouter 源码学习 1
前言ARouter开源地址本系列是笔者学习ARouter开篇系列.本文不是教程系列,而是大致分析Arouter路由分发逻辑.以下是一些预备知识:Arouter是一个基于apt框架,对于@Route,@Interceptor,@Autowired等注解的类会在Example/app/build/generated/source/kapt生成对应的类,如下图:注意除了Autowired注解生成在我们自己的包下,其他类全部都在com.alibaba.android.arouter.routes.(这
2021-05-04 22:39:13 286 2
原创 注解处理器常用类说明
常见类javax.lang.model.element.Element其子类可能表示为源代码文件构成的元素(Represents a program element such as a package).一般这个类结合一个工具类使用名叫Elements.包类接口方法变量Doc文档…略注意是源代码,而非java语法中具体的感念.这一点需要区分.举个例子:我们有一个文件如下:package com.example.annotationprocessstudy; //PackageE
2021-04-30 12:15:46 497 2
原创 Dagger2下的ViewModel
前言本文需要一定的储备知识,可参阅博主其他文章:Dagger2 生成类初探viewModel源码分析假设我们想我们的ViewModel注入一些Dagger2所提供的依赖怎么办?直接给ViewModel构造函数注入?如下代码//MyViewModel.javapublic class MyViewModel extends ViewModel { @Inject @Named("ActivityStr") String applicationMsg; @Inje
2021-04-28 19:58:11 575 1
原创 Dagger2 生成类初探
前言Dagger2是一个IOC容器,相比起后端的spring来说,Dagger2是编译时完成注入,而spring是运行时.关于Dagger2的基础知识请参阅官网:dagger2入门指导本文意在分析编译后的代码如何注入源码分析我们首先了解几个契约接口//Provider.javapackage javax.inject;public interface Provider<T> { T get();}//Factory.javapackage dagger.int
2021-04-28 16:02:50 388
原创 LiveData 源码初探
前言文本需要一定lifecycle基础知识.LiveData是一个基础观察者设计模式的基础框架,可结合databinding或者直接作为数据观察回调使用.class MainActivity : AppCompatActivity() { //MutableLiveData继承LiveData val mutableLiveData = MutableLiveData<String>() override fun onCreate(savedInstanceState: Bun
2021-04-26 14:15:04 166
原创 Lifecycle 源码初探
前言由于用法比较简单,所以本文不讲解基础使用,注重在源码的透彻分析上.基础使用文章:Android 架构组件之 LifeCycle详解一个小Demo:public class MyObserver implements LifecycleObserver { private static final String TAG = "MyObserver"; @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void onCreate
2021-04-26 12:03:48 212
原创 ViewModel 源码分析
预备知识在Android中我知道Activity有一个onSaveInstanceState函数,用于在Activity在不幸被回收或者配置改变时存储序列化对象,在下次重建时onRestoreInstanceState取出序列化数据.要是我们有非序列数据呢?public Object onRetainNonConfigurationInstance和public Object getLastNonConfigurationInstance()可以帮助我存储任意非序列化数据,用于下次重建复用对象onR
2021-04-25 22:53:57 293
原创 rxjava简单源码分析
前言RxJava Git地址本文基于3.0.13-RC2源码分析简单的案例public class JavaMain { public static void main(String[] args) { Observable<Integer> objectObservable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override
2021-04-22 20:35:14 179
frida-12.8.20-py2.7-macosx-10.9-intel.egg
2020-04-05
AIDL bindservice流程图
2017-09-29
fastjson 阿里巴巴的解析生成json工具
2016-09-01
Android 控件顶部阴影如何添加?
2017-04-14
Git创建本地仓库后 如何给他人地址?地址是什么
2016-10-18
安卓最新studio2.1 导入github项目选择那一项 谢谢
2016-10-13
安卓SDK目录中build-tools是用来干嘛
2016-08-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人