- 博客(61)
- 资源 (12)
- 收藏
- 关注
原创 Android 动态代码自修改原理
1.原理DexClassDef -> DexClassData -> DexMethod -> DexCode里面的 u2 insns 的值是用于存放程序实现代码的地方。程序执行时候会把整个 dex 文件加载到内存中,然后动态地解析执行 insns 中的内容。只要修改了里面的数据,就相当于修改了程序执行流程和方法。2. 内存中修改 insns主要步骤定位到 dex...
2019-11-29 11:05:14
647
原创 代码重定位技术
int g_nTest;__asm{ call Dels Dels: pop ebx lea eax, g_nTest sub eax, Dels lea edx, [ebx + eax]}...
2019-11-29 11:05:00
315
原创 Xposed的基本使用方法
1.Xposed介绍和安装Xposed 是Android 系统两大 Hook 框架之一,另一个 Cydia Substrate 主要面向 native 的 hook,而 Xposed 是面向 java 层的 hook。它的使用非常的简单,首先要在手机上安装 Xposed(手机必须先 root),本实例使用的是Xposed Installer 3.1.4官方的下载地址:http://repo....
2019-03-11 21:37:08
7405
原创 so文件混淆与修复
一、对section header进行混淆由于linker不会对section header进行加载,所以对section header进行改动,不会影响so文件正常加载到内存,因此有些程序对section header进行了混淆,导致IDA无法正常进行静态分析。混淆方法:1.将section header table中的addr、offsize等字段值清0,如果清空的是dynsym段,就...
2019-03-11 21:30:58
7053
2
原创 Android dex函数指令修改
1.原理要了解动态代码自修改原理,需要先弄懂dex文件结构,结构里面有个insns ,是用于存放程序实现代码的地方。程序执行时候会把整个 dex 文件加载到内存中,然后动态地解析执行 insns 中的内容,只要修改了里面的数据,就相当于修改了程序执行流程和方法。DEX文件可以通过以下结构找到DexCodeDexClassDef -> DexClassData -> DexMet...
2019-03-11 21:19:00
2127
原创 阿里壳2016
将壳拖入AK中分析,入口点已经修改成了StubApplication调用了方法attachBaseContext这个方法比onCreate调用的更早,很多壳会在这个方法中对原始程序进行还原除此之外还加载了mobisec.so,查看lib文件夹下的so文件可以找到这个so文件用IDA打开libmobisec后找到Jni_Onload,导入jni.h中的结构体,F5后重新注释Jni_On...
2019-03-11 09:55:51
354
原创 Eclipse中进行Jni编程
Eclipse Jni环境搭建1.在eclipse中选择Windows->Preferences->Android->NDK,设置NDK的位置。如果Android下没有NDK,需要下载个插件:链接:https://pan.baidu.com/s/1-YKXVUktq7hp_nDb1Q7dbQ,提取码:e4ks。android-ndk-r10d下载地址:链接:https:/...
2019-01-22 11:51:16
416
原创 Android Studio中进行Jni编程
1.介绍Android程序分2层,java层与native层,java层编译为dex文件,native层编译为so动态库。两者使用jni(java native interface)来进行连接。2.在Android Studio中进行Jni编程2.1 Android Studio 中Jni环境搭建Android Studio原生支持Jni编程,可以直接创建so库,不过需要修改gradle文...
2019-01-08 22:42:57
1563
原创 160个Crackme之004 ajj.1
作者:ajj难度:★★保护方式:Name/Serial(Delphi)概述运行程序程序没有确定按钮,所以直接丢到OD中分析。虽然没有确定按钮,但是有输入框,所以应该调用了GetItemTextA,可是这个程序是Delphi程序,它的API并不是GetItemTextA,所以暂时放弃这个想法。在OD中通过中文搜索引擎的智能搜索查找字符串,发现有用的字符串"恭喜恭喜!注册成功"可问...
2018-12-28 20:09:18
308
原创 160个Crackme之003 Afkayas.2
1.概述作者:Afkayas难度:★★保护方式:Nag,Name/Serial运行程序,有几秒钟的弹框,过几秒自动消失出现主窗口随意输入用户名和序列号,点击ok,弹出对话框2.算法OD加载程序,用中文搜索引擎里的智能搜索搜到字符串"You Get Wrong",跳转到代码处,向上找到函数的起始处,下断点,运行程序后,在主窗口中输入用户名和序列号点ok,程序被成功断下。第一...
2018-12-28 13:37:42
536
原创 160个Crackme之002 Afkayas.1
1.概述作者:Afkayas难度:★保护方式:Name/Serial(VB5)运行程序输入用户名tutucoo,序列号12345678,弹出对话框2. 分析首先查找字符串,跳转到字符串代码,向上查找到函数起始位置,下断点,运行程序,输入name和serial后点击OK,程序断下。F8分析汇编,发现算法:用户名长度*0x17cfb+用户名首字母ASCII,最后转十进制最后将十...
2018-12-27 00:40:14
205
原创 160个Crackme之001 Acid_burn
1.概述运行Acid burn.exe,启动界面如下:![hello you have to kill me! Welcorne to this Newbies Crackrne nude by ACiD BuRN Crac:KerWoRlD1要将上面的对话框去掉点击按钮Serial/Name,进去要求输入用户名和序列号:点击按钮Serial,进去要求输入序列号:2.Seri...
2018-12-26 22:32:37
581
原创 detours钩子库的简单使用
detours是微软的钩子库,以下是简单的使用#include "pch.h"#include <Windows.h>#include "detours.h"#include <stdio.h>#pragma comment(lib,"detours.lib")static int(WINAPI* OLD_MessageBoxW)(HWND hWnd, LP...
2018-12-24 16:37:43
4394
原创 Google C++ 命名约定
通用命名规则函数命名, 变量命名, 文件命名要有描述性; 少用缩写.int price_count_reader; // 无缩写int num_errors; // "num" 是一个常见的写法int num_dns_connections; // 人人都知道 "DNS" 是什么int n; // 毫无意义.int...
2018-12-20 14:14:05
269
原创 Vcpkg使用方法
概观Vcpkg可帮助您管理Windows,Linux和MacOS上的C和C ++库。这个工具和生态系统在不断发展; 您的参与对其成功至关重要!开始使用管理员身份打开powershell后,依次执行以下指令git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg.\bootstrap-vcpkg.bat.\vcpkg integr...
2018-12-18 14:37:04
8913
原创 代码重定位技术
代码重定位技术一般用于远程线程注入和病毒感染技术当中,当注入和感染的代码使用了全局变量,全局变局的地址就需要进行重定位,否则代码无法正常执行。这是因为,代码注入其他进程空间以后,注入的位置跟原来程序中的位置不一样,而全局变量在汇编层其实就是一个偏移,因此无法再通过原来的偏移找到全局变量了。既然如此,我们只要找到注入位置的差值,我们就能一直准确定位到我们想要的全局变量了。所以写入到目标进程的代码...
2018-12-14 17:16:31
403
原创 一种简单的PE压缩算法(Win32汇编)
这种算法的核心逻辑是:在对PE进行压缩的时候,如果碰到连续的多个0,比如说0000 0000,会将它变成0 8,0后面的8用来记录0的个数。.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incin...
2018-12-12 11:23:13
1191
转载 病毒分析报告模板
基本信息报告名称:作者:报告更新日期:样本发现日期:样本类型:样本文件大小/被感染文件变化长度:样本文件MD5 校验值:样本文件SHA1 校验值:壳信息:可能受到威胁的系统:相关漏洞:已知检测名称:简介本节的主要目的是简单介绍样本的目的,类型,一两句画龙点睛即可。例如:[样本名称 ]是一个针对FTP软件用户,窃取系统及个人信息的木马。被感染系统及网络症状本节的主...
2018-12-07 00:21:10
3549
原创 Windows内核基础之KPCR
1.概述KPCR是CPU的一个结构体,它就像EPROCESS对于进程,ETHREAD对于线程,KPCR对于CPU是非常重要的,它的全称是Processor Control Region。fs:[0]在3环时指向TEB,在0环时指向KPCR,每一个CPU核心都对应着一个KPCR,KPCR存储了CPU需要使用的一些重要信息,比如GDT\IDT以及线程相关的信息2.KPCR结构体nt!_KPCR...
2018-12-07 00:12:25
1114
原创 Windows内核基础之线程
1. 线程结构体在0环,每个线程都有一个结构体ETHREAD。nt!_ETHREAD +0x000 Tcb : _KTHREAD +0x200 CreateTime : _LARGE_INTEGER +0x208 ExitTime : _LARGE_INTEGER +0x208 KeyedWaitChain : ...
2018-12-07 00:09:54
936
原创 Windows内核基础之进程
1. 进程结构体EPROCESS每个运行中的进程在Windows内核中都有一个EPROCESS的结构体,这个结构体包含了进程所有重要的信息。在WinDbg中使用指令dt _EPROCESS可以查看进程结构体的所有成员。nt!_EPROCESS +0x000 Pcb : _KPROCESS +0x098 ProcessLock : _EX_PUS...
2018-12-07 00:08:11
875
原创 Windows内核基础之控制寄存器
1. 概述控制寄存器用于控制和确定CPU的操作模式。主要有:CR0\CR1\CR2\CR3\CR42.CR0寄存器PE:启用保护模式标志,1是保护模式,0是实模式,这个位只是开始或关闭段机制,并没有启用分页机制PG:分页机制开关,在启用之前需要确保PE是开启的,否则会出现异常WP:写保护标志,禁止0环程序向3环只读页面执行写操作,也就是说当CPL&amp;lt;3的时候,如果WP=0,可以读写...
2018-12-04 11:37:12
775
原创 Windows保护模式下的分页机制(PART2:PAE模式)
1. 概述10-10-12分页方式最多可达4GB的物理地址,但是随着硬件的发展,4GB的物理地址无法满足要求,因此出现了2-9-9-12分页,这种分布方式又被称为PAE分页。为什么会出现2-9-9-12分页?我们知道10-10-12最后的12是物理页偏移,页的大小是4KB是不能变的,所以12是定下来了。那么要想表示更多的物理内存就必须增大物理页范围,而物理页是由PTE保存的,原来的PTE是...
2018-12-03 15:26:01
504
原创 Windows保护模式下的分页机制(PART1:10-10-12模式)
1.概述一个进程的虚拟地址空间是4GB,它的物理大小并不是真的4GB,如果真的是4GB,那运行中的所有进程都加起来占用的空间是一个天文数字,事实上系统会对这4GB的地址空间进行转换,然后映射到物理内存中。换句话说虚拟地址本身并不是真实存在的。将虚拟地址转换为物理地址依赖的规则就是分页机制。物理地址也并不是内存条地址,物理地址需要再进行一层转换才能找到真正的内存条地址。我们只要会转换到物理地...
2018-12-03 00:14:23
1278
原创 Windows保护模式下的段机制(PART2:系统段介绍)
1. 概述PART1那篇文章基本上已经把段机制交待清楚了,这一部分主要是介绍在PART1里没有介绍的系统段。我们知道段描述符里的S位为1就是代码段或数据段,如果为0就是系统段。2. 调用门2.1 调用门介绍之前介绍过长调用,想通过长调用提升CPL只能通过调用门,调用门是门描述符的一种,保存在GDT中,Windows系统虽然没有使用调用门,但是为了演示提升CPL,我们可以手动构造一个调用门...
2018-11-30 23:15:00
355
原创 Windows保护模式下的段机制(PART1:段机制介绍)
文章目录1. 前置知识1.1 CPU对存储器的读写1.2 段地址1.3 段寄存器2. 保护模式3. 段机制3.1 保护模式下的段机制3.2 32位系统的段寄存器3.3 段寄存器的读写3.4 段选择子3.5 GDT和LDT3.6 段描述符3.7 段权限检查3.8 长跳转3.9 长调用与短调用1. 前置知识在了解保护模式以及分段和分页机制之前,需要知道一些必要的知识。1.1 CPU对存储器的读写...
2018-11-29 15:33:11
746
原创 手动获取函数地址
编写病毒程序时,由于各种原因不能直接调用函数,所以需要手动获取到函数然后调用它。最常见手动获取函数地址的方法是通过获取kernel32.dll句柄,然后遍历kernel32.dll的导出表找到它的GetProcAddress()函数,再通过向这个函数传递函数名就可以获取函数的地址了,最后通过一个函数指针就可以调用获取的函数。主要步骤1.通过fs寄存器获取到TEB的地址2.通过teb+0x30...
2018-11-27 15:36:12
2949
原创 Windows内核基础之虚拟内存空间布局
32位Windows操作系统支持32位寻址,因此2的32次方就等于4GB,每个程序在运行时都会被映射进4GB空间的内存空间,这4GB空间不全是用户可以使用的,其中0x7fffffff-0xffffffff是2GB的内核空间,这部分用来保存内核的数据,用户程序是无法直接访问的。进程空间的地址是一个逻辑地址,它首先通过分段机制的段选择子和偏移地址计算出一个线性地址,再由分页机制分解线性地址,最...
2018-11-26 17:18:17
1224
1
原创 Windows内核基础之权限级别
权限级别是CPU中的一个概念,CPU中包含4个权限级别,分别是0环,1环,2环,3环,CPU设计制造商最初希望0环用于运行内核,1环和2环运行设备驱动,3环运行应用程序,但是系统设计者为了简单将驱动和内核都放在0环,应用程序放在3环,没有使用1环和2环。后来CPU设计制造商干脆也和操作系统保持一致,只保留了0环和3环两个权限级别。...
2018-11-26 16:00:15
2806
原创 Windows网络编程(九):消息选择模型
概述这种模型的使用需要在调用完socket()函数以后调用WSAAsyncSelect(),这个函数的声明如下:int WSAAsyncSelect(SOCKET s,HWND hWnd,u_int wMsg,long lEvent)s:需要使用异步模式的套接字wMsg:用户自定义的消息,这个自定义消息可以是WM_USER+ 200,通过将这个消息跟回调函数映射,可以在接...
2018-11-26 15:57:10
392
1
原创 Windows网络编程(八):非阻塞模式(异步模式)
前面几篇文章介绍的无论是TCP通信还是UDP通信都是阻塞式的,它们在执行recv或recvfrom时会在线程中等待,直到接收到信息为止,所以在应用的时候一般都需要开辟子线程,在子线程里专门做这类事情,不然它会影响主线程的运行。&nbsp;系统提供三种网络模型去处理这类需求,它们都基于异步模式,在异步模式下执行recv或recvfrom时不会在线程中等待,它会接着执行下去,当接收到消息时,系...
2018-11-26 15:55:35
643
原创 Windows网络编程(七):原始套接字开发
在调用socket()函数时,如果将第二个参数填为SOCK_RAW,代表创建的是原始套接字类型,第三个参数可以选择IPPROTO_ICMP、IPPROTO_TCP、IPPROTO和IPPROTO_RAW。#include &lt;winsock2.h&gt;#pragma comment (lib, "ws2_32")struct icmp_header{ unsigned char...
2018-11-25 22:27:27
1878
原创 Windows网络编程(六):IP Helper
IP Helper是Windows系统与IP配置和管理的重要接口,通过IP Helper 可以获得很多跟网络配置相关的信息。比如说本机IP、网关设置、网卡数量和连接信息。#include &lt;windows.h&gt;#include "iphlpapi.h"/* 全局变量 */ULONG ulOutBufLen;DWORD dwRetVal;HANDLE hHeap = GetP...
2018-11-25 22:25:33
1026
原创 Windows网络编程(五):多线程消息处理
对于服务端来说,调用accept()函数同意客户端连接的请求后,需要处理完与这个客户端的通信后回到accept()继续等待下一个客户端的连接,如果一个客户端请求连接时服务端并没有在accept()处等待,客户端是无法成功连上服务端的,因此并发客户端连接的服务端必然是多线程的。服务端:#include &lt;WinSock2.h&gt;#include &lt;windows.h&gt;...
2018-11-25 22:24:24
314
原创 Windows网络编程(四):建立UDP连接和收发消息
UDP消息的发送和接收需要UDP连接,所以,上面的TCP连接已经不适用了,具体的区别主要有:创建Socket时参数不同创建服务端时不需要listen和accept操作创建客户端时不需要connect操作服务器需要bind操作,客户端不需要。发送和接收UDP消息要用到sendto和recvfrom两个函数。先来看看接收消息,当执行recvfrom时,线程会进入等待,直到接收到UDP消息为止。...
2018-11-25 22:21:18
1657
原创 Windows网络编程(三):建立TCP连接和收发消息
先看服务端:// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#define _WINSOCK_DEPRECATED_NO_WARNINGS //这个声明要在stdafx.h的后面,但要在其他头文件的前面#include &lt;winsock2.h&gt;#include &lt;stdio...
2018-11-25 22:17:37
1810
原创 Windows网络编程(二):Socket简介
Socket简介Socket被称为套接字,描述了IP和端口等信息,是一个通信链的句柄。微软专门开发了一套支持多种网络协议的网络编程接口,叫做Winsock,Winsock是Windos SDK的一部分,全称Windows Sockets API。它对多种协议做了封装,Socket就是Winsock对TCP协议的封装。vc++是微软开发的一套开发工具,它不仅支持C和C++,还提供一套可视化编程...
2018-11-25 22:14:45
283
原创 Windows网络编程(一):TCP/IP协议
概述这个协议是一个四层协议:应用层,主要协议有HTTP、FTP等传输层,主要协议有TCP、UDP等网络层,主要协议有IP等链路层,主要协议有ICMP等下层中的协议总是为上层中的协议服务的,比如说应用层的HTTP、FTP协议都是基于TCP协议的,应用层的DNS协议基于UDP协议。网络层的IP协议中记录了网络主机的IP地址,TCP协议中记录了端口号,通过这两个数据可以定位到某台主机上的...
2018-11-25 22:11:05
743
原创 Windows程序和消息机制(三):消息与进程间通信
自定义消息与进程间通信窗口程序可以接收自定义的消息类型,前提是通信的进程声明了这种消息类型,声明的方法很简单,WM_USER加一个值就可以了,一般加的值从0x400开始,其他的值已经被系统使用了。实现一个完整的自定义消息需要进行以下步骤:1.声明自定义消息类型: WM_UMSG+0x4002.添加消息映射: BEGIN_MESSAGE_MAP(CUserWMD...
2018-11-25 22:02:48
1246
原创 Windows程序和消息机制(二):消息有关的函数
不同窗口程序可以通过消息进行交互,主要用到的函数如下:FindWindow获取一个窗口的句柄。HWND FindWindow( LPCTSTR lpClassName,// 类名 LPCTSTR lpWindowName// 窗口名 );通过在参数中传递一个类名或者窗口名就可以返回一个窗口的句柄,类名可以通过spy++获取,窗口名是指窗口的标题。SendMessag...
2018-11-25 22:00:33
199
QT使用Opencv库及网络摄像头做的视频监控系统带人脸检测功能
2017-09-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人