UPX基本处理+魔改+手动脱壳
UPX (Ultimate Packer for eXecutables) 是一种流行的运行时压缩壳,拥有多平台支持和较高的压缩率但保护强度较低等特点。在逆向工程的题目中算是一个常见的考点。 基础解法下载upx.exe加/脱壳工具,将其与目标可执行文件放在同一目录下,在当前目录下打开cmd输入如下指令: 1upx -d 要脱壳的程序名.exe 即可完成脱壳 加壳可使用如下指令 1upx -1 要加壳的程序名.exe #更快 或 1upx -9 要加壳的程序名.exe #更好的压缩率 魔改UPX修改UPX头标准的UPX头在010Editor中查看内容如下: 会发现里面有UPX0,UPX1等特别的字符(注意是大写),若将其修改,就不能直接用upx.exe脱壳了 拖入Die或ExeinfoPE中,仍能检查出UPX壳并指出可能错误的地方。(本题用小写的“upx”进行混淆 自行在二进制编辑器中进行修改即可恢复 修改入口点用x64dbg打开加壳程序,将入口点处的4个push指令全部nop掉并保存 然后其也不能直接用upx.exe脱壳了...
ADB调试
模拟器+jadx+adb调试(Java/Smali层)模拟器本人选择BlueStack5为例,首先点开模拟器的设置 菜单: 在“手机”一栏中勾选启用Root权限 在“高级”一栏中找到Android调试(ADB),勾选以127.0.0.1:5555连接到Android 然后用jadx分析要调试的apk文件,点开右上角的调试配置 用命令行打开adb,并输入如下指令连接模拟器服务 1adb connect 127.0.0.1:5555 可使用如下指令确认设备连接状态 1adb devices 此时jadx的调试配置窗口就会出现对应的设备及其包含的程序,选择要调试的程序,点击运行APP即可开始调试 可在Smali层中对指令打断点,运行使断点命中即可。步进、步过、步出功能与IDA类似,可在下方的调试窗口中按按键使用 已Root实机+IDA 8.3+adb调试(Native层)将已Root的实机用USB连接到电脑,打开命令行输入如下指令查看已连接的设备信息 1adb devices 打开IDA所在根目录,在/dbgsrv处找到对应的调试...
AES算法总结
算法详解AES(Advanced Encryption Standard)是新一代的加密标准,其分组长度为128位,密钥长度常为128位。AES的SPN(Substitution-Permutation Network,代换-置换网络) 结构是其加密过程的核心设计思想。SPN 是一种对称密钥分组密码结构,通过多轮重复的 代换(Substitution) 和 置换(Permutation) 操作,结合密钥扩展机制,实现高效的混淆(Confusion)和扩散(Diffusion),从而确保安全性。 AES加密算法的SPN结构有四步操作:逐字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。 逐字节替代SubBytes: AES 加密中的核心非线性操作步骤,通过S盒对状态矩阵的每个字节进行替换,实现混淆。代码中,SubBytes通过查表高效实现: 123456789101112131415// S 盒定义(部分) unsigned char S[256] = { 0x63, 0x7...
RC4算法及例题总结
算法详解RC4是一种流加密算法,其工作原理可以分为两个主要部分:密钥调度算法KSA和伪随机生成算法PRGA。 KSA密钥调度算法: 初始化一个256字节的数组S,S[i] = i。 根据密钥对S进行混排。通过循环交换S数组中的元素,确保密钥影响S的内容。 PRGA伪随机生成算法: 使用KSA生成的S数组,通过循环更新和交换元素生成伪随机字节。 生成的字节与明文进行异或运算,得到密文。 RC4的加密和解密过程相同,因为它是基于与伪随机流的异或运算。 实战识别在逆向分析实战中判断RC4算法的可从其会初始化一个256字节的数组 和将一个key填充到数组中以及加密函数大概率有两个参数,一个是key 一个是keylen 代码实现下面是RC4算法加 /解密过程的C语言代码实现 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include &l...
DES算法总结
算法详解Data Encryption Standard是一种对称密钥加密算法,由IBM公司开发,并于1977年被美国国家标准局采纳为联邦信息处理标准。DES使用56位的密钥和64位的明文分组,通过16轮的Feistel网络进行加密。 DES使用的Feistel网络的结构分为很多个轮(DES为16轮),其中一轮的流程大致为:将输入的64位明文分为长度相等的左右两部分,右半部分直接保留,左半部分由本轮产生的子密钥和右半部分代入轮函数f所得的结果与原左半部分进行异或运算得到,然后将左右两部分交换,进行下一轮加密。其示意图可表示为: 本人用自己的语言总结其算法如下: 在加密时,首先进行一次IP置换,然后即进入Feistel网络,轮函数f的具体过程为先对左半部分进行E置换将其从32位扩展为48位,然后与轮秘钥按位异或,然后分为8组,每组6位,用这六位的首位和末位作为列索引,用剩下4位作为行索引,从对应的S盒中取出对应的值,然后进行P置换,将结果与右半部分进行异或运算,最后将结果与左半部分交换,进行下一轮加密。在最后一轮加密结束后,进行一次逆IP置换得到最终的密文。 而密钥生成过程则是...
TEA算法及例题总结
算法详解TEA在加密的过程中要加密的明文 使用2个32位无符号整数(2×4字节),秘钥 为4个32位无符号整数(4×4字节),更长的明文可通过分为多个4字节为单位的小组分别进行加密(循环) 加密流程示意图: 实战识别在逆向分析实战中判断TEA算法的可从其3行核心加密中出现的右移4左移5,两行各有3个小括号互相异或的加密流程 和单次加密循环32次 以及运算中出现的sum和delta变量看出 代码实现下面是TEA算法加密 过程的C语言函数实现 123456789101112131415#include <stdio.h> #include <stdint.h> void encrypt(uint32_t* temp, uint32_t* key) // 解密函数 { uint32_t v0 = temp[0], v1 = temp[1]; int sum = 0; // 初始sum值,注意此处要修改为delta的32倍 uint32_t delta = 0x9e3779b9; // 和加密函数一致...
XTEA算法及例题总结
算法详解在TEA中,密钥是直接分成4个32位部分(总共128位),每轮加密过程中使用这些部分直接参与计算。密钥在整个加密过程中的使用比较固定,没有变化。这样,攻击者只需要通过分析固定密钥的几轮加密就能发现模式,从而降低了加密算法的安全性。 在XTEA中,以及密钥并不是每轮加密中直接使用固定的部分 。相反,XTEA通过密钥的不同部分在每一轮加密中进行动态调度 ,密钥在加密过程中会经过多次变换,从而增强了密钥的复杂性和加密过程的不可预测性。 加密流程示意图: 代码实现下面是XTEA算法加密 过程的C语言函数实现 12345678910111213void encrypt(uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; for (i=0; i < 64; i++) // XTEA默认循环64轮,与TEA不同,题目也可能修改循环次数 { ...
XXTEA算法及例题总结
算法详解XXTEA使用更复杂的运算方式,它的块大小可以是任意的,密钥也可以是任意长度的(可以不是4的倍数)。 在加密时,XXTEA会对明文进行分块 ,然后每个块都会进行加密,加密后的结果再进行拼接,最终形成密文。 在解密时,XXTEA会对密文进行分块 ,然后每个块都会进行解密,解密后的结果再进行拼接,最终形成明文。 加密过程示意图: 代码实现下面是XXTEA算法加 /解密过程的C语言函数实现 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include <stdint.h> #include <stdio.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^...
初识反调试
IsDebuggerPresent()函数包含在debugapi.h头文件中,函数原型: 1BOOL IsDebuggerPresent(); //未在调试器中运行时返回值为零,否则为非零值 该函数允许程序确定是否正在由用户模式调试器(如 OllyDbg 或 x64dbg)调试它,以便可以修改其行为。通常,该函数只检查进程环境块 (PEB) 的 BeingDebugged 标志。 Assembly: 1234567 call IsDebuggerPresent test al, al jne being_debugged ... being_debugged: push 1 call ExitProcess C/C++: 12if (IsDebuggerPresent()) ExitProcess(-1); CheckRemoteDebuggerPresent()函数包含在kernel32中的CheckRemoteDebuggerPresent()检查调试器(在同一台计算机...
