基础知识
除了逆向外也可以尝试爆破
|
|
Windows
kernel32.dll
:控制系统内存管理、数据输入输出、中断处理,当Windows启动时,其驻留在内存中特定的写保护区域,使别的程序无法占用该内存区域
user32.dll
:用户界面相关应用程序接口,包括Windows处理、基本用户界面
gdi32.dll
:Windows GDI图形用户界面相关程序,绘制图形、显示文字
句柄(handle):唯一整数值,标志程序中不同对象和同类对象中的不同实例
反编译
- 线性扫描(Linear Sweep):简单顺序扫描文件分析,均分析为代码,objdump, OllyDbg, x64dbg
- 递归下降(Recursive Traversal):控制流根据call指令调用关系分析,IDA pro
约定
变数名称前缀表示类型
lp
:Loing Pointerh
:Handlerdw
:DWORD
函数名称后可能有大写字母
A
:字符串参数使用ANSIW
:字符串参数使用UNICODE(Wide character)EX
:扩展(Extended)
调用约定
- x86 32位
__cdecl
:参数从右向左依次压入栈,调用完毕后,调用者caller负责清理参数,返回值位于EAX__stdcall
:(Win32 API)参数从右向左压入栈,调用完毕后,被调用者负责清理参数,返回值位于EAX__thiscall
:参数从右向左压入栈,类方法的this
指针通过ECX传递给被调用者,若参数个数确定,则参数全部压入栈后this
指针入堆栈;若参数个数不确定,调用者清理堆栈__fastcall
:函数第一个和第二个DWORD参数通过ECX和EDX传递,其他参数从右向左压入栈,被调用函数清理堆栈
- 清理栈帧指参数使用了栈则栈帧会发生变化,需要使用
add rsp, 0x??
来清理,push x次,32位下add x0x4,64位下add x0x8 - x86-64
- Microsoft x64:前四个参数放入RDI、RSI、RDX、RCX,(Windows下前四个参数让RCX、RDX、r8、r9)剩下参数从右到左压入栈,调用者caller负责清理堆栈
- SystemV x64(SysV):Linux与MacOS上使用,比Microsoft多两个寄存器,使用RDI、RSI、RDX、RCX、R8、R9,剩下参数从右向左压入栈中,调用者caller负责清理堆栈
- 局部变量:放于栈上
Eflags
- ZF(Zero Flag):零标志
- PF(Parity Flag):奇偶标志
- AF(Adjust Flag):辅助标志
- OF(Overflow Flag):溢出标志
- SF(Sign Flag):符号标志
- DF(Direction Flag):方向标志
- TF(Trap Flag):追踪标志
- IF(Interrupt enable Flag):中断允许标志
Syscall
Windows 的 syscall number 随版本更新会变更,一般呼叫API
SEH机制
Structured Exception Handling,结构化异常处理
-
VC++及Windows的异常处理机制,可利用
/0
等方式触发异常 -
以链的形式存在,第一个异常处理器中若未处理相关异常,异常会传递到下个异常处理器直到得到处理
-
1 2 3 4 5
typedef struct _EXCEPTION_REGISTRATION_RECORD { PEXCEPTION_REGISTRATION_RECORD Next; // Next值为FFFFFFFF表示最后一个节点 PEXCEPTION_DISPOSITION Handler; // 当前异常处理回调函数的地址 } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
线程信息块TIB(Thread Information Block or TEB)
|
|
调用
|
|
Linux
|
|
可执行程序报错:linux版本可能不匹配,尝试高版本打开
|
|
数学
乘法逆元: $a\cdot a^{-1}\equiv 1(mod\quad p)$
|
|
逆向下面公式
|
|
计算机组成
VA:虚拟地址
RVA:(Relative Virtual Address)相对虚拟地址,相对于镜像基址的位置,即VA = ImageBase + RVA
- Entry Point RVA - .text section RVA = Entry Point file offset - .text section file offset
- 八个比特(bit)称为一个字节(byte)
- 两个字节称为一个字(word)——16bits
- 两个字称为一个双字(dword)——32bits
- 两个双字称为一个四字(qword)——64bits
位运算
|
|
移位
|
|
数据类型大小
- short:2字节
- char:1字节
- int:4字节
- double:8字节
- long:8字节
python中将负数表示为无符号32位或64位整数
|
|
汇编
|
|
nop
为0x90
|
|
x86-64架构的SIMD寄存器,处理单指令多数据操作:xmm0
-xmm15
可以存储128位数据,IDA中显示不了xmm
寄存器值
|
|
|
|
|
|
|
|
Intel
|
|
AT&T
|
|
struct
- 分配 0x18 bytes 内存空间,内存空间起始位置存在 rbp-0x8
- 将 rbp-0x8 的值存于 rax,即 rax 是 ms 的基址
- ms->a 的偏移为 0x0,ms->b的偏移为 0x8,ms->c 的偏移为 0x10
- 1+8+4 = 13 bytes 实际用了 24 bytes
C
|
|
文件操作
|
|
宏
|
|
数据类型:LL
即long long int
其他
|
|
格式化字符串
|
|
C逆向代码
|
|
格式转换相关
|
|
C++
0xCC
是一种填充字节,通常用于调试表示未初始化的内存区域
Name Mangling:附加修饰函数名,用于辨识参数不同的同名函数
命令行使用c++filt <name>
来获取原始的函数名
或gdb上使用set print asm-demangle on
IDA相关
|
|
Windows API
|
|
可执行文件
PE文件
PE文件(Portable Executable):32位【PE32】,64位【PE+或PE32+】
- 可执行:
exe, scr
- 库:
dll, ocx, cpl, drv
- 驱动程序:
sys, vxd
- 对象文件:
obj
DOS头
DOS存根
向下兼容,用DOSBox执行PE会输出红色框中字符串
NT头
映射
节Sections
.text
:代码段.idata
:放 import tables.data
:初始化数据.bss
:未初始化数据.reloc
:relocation 信息.rsrc
:资源数据.rdata
:只读数据.tls
:Thread Local Storage,线程局部存储数据
IAT
(Import Address Table),存储在 .idata section
内的表
- 程序载入前相当于
INT
,指向IMAGE_IMPORT_BY_NAME
- 程序载入后存储外部引入函数的位置
EAT
(Export Address Table)
应用EAT来做GetProcAddress
- 从 module image base 取得指定 API address
- 从optional header 的 DataDirectory[0] 取得EAT
- 遍历AddressOfNames,寻找指定API名称
- 透过AddressOfNameOrdinals得到ordinal
- 从AddressOfFunctions得到API RVA,避免直接呼叫GetProcAddress
PEB
(Process Environment Block)
PEB断链:将特定的module隐藏(x86-64)
- 从 gs:[0x60] 取得 PEB
- 从 PEB 取得 Ldr
- 通过 Ldr 内的 InLoadOrderModuleList 遍历所有 LDR_DATA_TABLE_ENTRY 结构
- 找到指定的 LDR_DATA_TABLE_ENTRY 后,将其从三个 linked list 中删除
应用PEB来做GetModuleHandle
- 取得特定的 module image base(x86-64)
- 从 gs:[0x60] 取得 PEB
- 从 PEB 取得 Ldr
- 通过 Ldr 内的 InLoadOrderModuleList 遍历所有 LDR_DATA_TABLE_ENTRY 结构
- 比对 BaseDllName 得到 DllBase,避免直接呼叫 GetModuleHandle
DLL
- (Dynamic Link Library)导出函数给程序使用
- DLL的main为DllMain,载入、卸载时会执行
|
|
EXE文件在终端运行,不要直接双击
ELF文件
|
|
节:
- .text节:程序代码指令
- .rodata节:保存只读数据,只能在text段找到.rodata节
- .plt节:过程链接表(Procedure Linkage Table),包含动态连接器调用从共享库导入的函数所需的代码
- .data节:存在于data段中,保存了初始化的全局变量数据
- .bss节:存于data段中,保存未进行初始化的全局数据,初始化为0,程序执行可进行赋值
- .got.plt节:全局偏移表-过程链接表,.got节保存全局偏移表,.got和.plt节一起提供了对导入的共享库函数的访问入口,由动态连接器在运行时进行修改
- .dynstr节:动态链接字符串表,存放了一系列字符串,空字符作为终止符
断点
- 软件断点:
int 3
|0xcc
执行触发程序异常:breakpoint_
,或产生其他异常如0xce
- 硬件断点:调试寄存器DR0~DR3设定地址,用DR7设定状态,最多4个
- 读/写/执行某精准地址产生异常
- 内存断点:设置地址不可访问/写属性,读/写/执行该内存时产生异常,调试器判断并接管异常
- 改变某分页属性,与
VirtualProtect
函数有关 - 以一整个分页为单位的断点
- 改变某分页属性,与
- 条件断点:满足特定条件,暂停执行
大小端序
字符存储为小端序,所以编写脚本计算时需要将其倒序
栈上是小端序存储的
Python
|
|
ord()
: 字符 转换为对应的 ASCII 码值chr()
: ASCII 码值 转换为对应的 字符
转换
可以尝试用CyberChef转换,output中的魔法棒
|
|
数据处理
|
|
类
|
|
map
|
|
pip
安装指定版本的包会将原先的包给卸载,代替为指定版本
进程subprocess
|
|
JAVA
|
|
类型
Byte
: java.lang中一个类,封装byte
byte
: 基本数据类型,整型数据1字节
格式
|
|
输入输出
|
|
数据转换
|
|
异常
|
|
寄存器
x86中寄存器:EBP、ESP、EIP、EAX、EBX、ECX、EDX、EDI、ESI
x86-64中寄存器:RBP、RSP、RIP、RAX、RBX、RCX、RDX、RDI、RSI、R8~R15
工具
PE-bear
010Editor
GDB
查看格式
|
|
针对汇编cmp eax, DWORD PTR [rbp-0x94]
查看地址中内容
|
|
命令
|
|
IDA
取IDA数据时,小端序取,4个4个倒过来取
函数窗口:ctrl+F
搜索函数
导入函数窗口:Imports
窗口,导入的一些函数
添加反汇编注释:option > general > Display disassembly line parts > Auto comments
反汇编窗口字体调整:option > font
十六进制窗口编辑:F2
,F2
保存
函数窗口中shift+F5
打开应用库模块列表,继续按insert
键打开可用库模块列表,进行导入
使用d
可以将数据改变大小从byte转换为2bytes-word,4bytes-dword,8bytes-qword
或者右键设置Array
,改变数组显示
undefine
可以将识别错误的代码取消,然后右键将字节转换为相应类型
清除指针类型用于重新定义结构体:右键 > Reset pointer type
db, dw, dd, dq
分别代表 1, 2, 4, 8 字节
一般直接 shift + F12
找字符串窗口,对应字符位置ctrl + x
找到函数
|
|
查看机器码:Options
> General
> opcode
应用:
变量为64位,8字节,则在栈中需要8字节空间
|
|
插件:
Ctrl + 3
:呼出插件
-
Findcrypt:IDA9中成功,IDA7.5, 7.7, 8.3中都不显示
edit
>Plugins
>Findcrypt
:可以找到MD5, DES, CRC
等
-
E-Decompiler:IDA7.5,对易语言进行分析插件
-
ida.cfg
文件解除Block_CJK_Unified_Ideographs
前的注释 -
ida.dll
文件用IDA64打开,搜索[](),
,将有下划线一行nop掉 -
1 2 3 4 5 6
if ( !v8 || !strchr(" [](),*&", v11) ) { if ( v10 - v9 < 8 || strncmp(v10 - 8, "operator", 8ui64) ) { LABEL_23: *v10 = '_'; // nop!
-
装入插件可显示中文函数及易语言反编译
-
-
Scyllahide:反反调试工具,IDA7.5,注意要明确调试代码是32位还是64位!!
- 反调试报错:
XXXXXXXX:unknown exception code 0 (exc.code 0, tid XXXXX)
- 64位调试32位程序使用Scyllahide后会报错
- 设置扩展参数
- 运行
ScyllaHideIDAServerx86.exe
,并开始动态调试,可绕过debug检测
- 反调试报错:
快捷键:
A
:转换为字符串(ASCII)
R
:转换为char型
C
:转换为代码(code)
ctrl+shift+w
:IDA不提供撤消,使用快照功能【file > take database snapshot
】
ctrl+E
:函数窗口对函数进行编辑
X
:查看函数的交叉引用,如何被引用
Y
:修改局部变量类型
;
:汇编界面添加注释
/
:伪代码界面添加注释
Ctrl + P
:函数跳转
Alt + T
:搜索文本字符串
Shift + F2
:脚本执行窗口
F6
:回到最近操作的窗口
Ctrl + x
:对变量输入,可以获取哪个函数使用了这个变量
动态调试
选择Load WIndows debugger调试器,设置断点在某一代码行,需要在Debugger
中打开Use source-level debugging
F7
: 单步步入
F8
: 单步步出
F9
: 直接跳到下一个断点
Ctrl + F7
: 直到返回跳出函数
可以点击寄存器区的寄存器箭头前往hex程序区
想查看某变量变化:右键
> Add Watch
断点
- 可下多个断点,F9直接跳转;
- 内存断点,对数据段进行断点,每次读写该区域将会提示并停止:
点击数据所在地址
>F2
>设置是否读写 + 设置Size(可观察数组)
远程调试(如windows调试linux下文件)
- IDA pro安装目录下的
dbgsrv
文件夹下选择调试的程序linux_server - 在相应远程linux主机设置权限并执行linux_server
- IDA选择Remote Linux debugger,
Debugger > Process options
,设置远程Linux IP地址
__debugbreak()
:在代码中引入断点,系统会提示用户运行调试器
Ghidra
Symbol Tree
中包含Functions
, Classes
等,在m
中有main函数
查看函数调用关系:Window
> Function Call Graph
变量重命名:右键
> Rename Variable
,快捷键l
点亮所有变量:鼠标中键
注释:右键
> Comments
改函数签名:右键
> Edit Function Signature
改数字的进制:右键
Frida
可用于调试hook Windows的exe可执行文件进程
pip安装出现:拒绝访问。
,以管理员身份运行
|
|
DIE
(Detect It Easy)查壳工具
Peid
Exeinfo PE
查壳工具
OllyDbg
只适用32位,不再更新
F2
:下断点
F4
:运行到光标位置
F7
:单步步入
F8
:单步步过
F9
:运行,到断点处
F12
:暂停运行程序
重新开始:x
图标 + <<
图标
插件 > 中文搜索引擎 > 搜索 ASCII:找字符串
查看函数调用:右键 > 查看调用树
双击代码和注释都可直接进行修改
查找数据并修改:数据窗口 > Alt + M
打开Memory map > Ctrl + B
进行搜索 > 右键可以修改,需要进行保存【右键复制到可执行文件】 > 保存文件
跳出循环:右键 > 断点 > 运行到选定位置
工具栏窗口:
1.日志窗口(L) 2.模块窗口(E):查看每个模块的内存基址
3.内存窗口(M):查看每一个模块的段,所占用的内存区域
4.线程窗口(T):线程信息
5.窗口(W):查看程序的窗口句柄,窗口名,风格样式,回调函数等信息
6.句柄(H)
7.反汇编窗口( C)
8.补丁窗口(/)
9:堆栈窗口(K):可查看调用堆栈,调试时堆栈回溯:右键
> 显示调用
10.断点窗口(B):显示所有的F2断点
11.参考( R)
12.run跟踪窗口(…)
x64dbg
适用于32位和64位调试
反汇编显示区 | 寄存器显示区 |
---|---|
内存数据显示区 | 栈显示区 |
- 运行到用户代码 点击
Az
图标:查看字符串
循环箭头按键:为重新运行
右箭头按键:直接运行
快捷键:
ctrl+G
:跳转到目标地址/表达式
F2
:下断点
F4
:运行到光标位置
F7
:单步步入
F8
:单步步过
F9
:运行
空格修改汇编代码
可以右键修改十六进制代码:修复错误时将字节改为90(nop)
可以对代码转到对应的内存空间位置:右键 > 在内存布局中转到
搜索命令:右键 > 所有用户模块 > 命令,如寻找pushad
GNU Binary Utilities
GDB/PWNDBG
|
|
UPXshell
在Windows下进行UPX脱壳
Jadx
APK分析工具
获取反编译后的JAVA原码且可视化,能打开文件格式:.apk, .dex, .jar, .class, .smali, .zip, .aar, .ars
jd-gui
反编译jar包,获取JAVA源码
ILSpy
用于dll
文件的逆向,可以查看Program
程序代码
Z3-Solver
pip install -i ``https://pypi.tuna.tsinghua.edu.cn/simple`` z3-solver
指定镜像源安装- 一般输入的是字符串,但最终将字符串转换为了数值进行计算,最终获取数值还需要转换回字符串,注意参与计算的数值之间的顺序(小端序,如何输入)
- Linux下运行
|
|
QEMU
|
|
运行riscv程序
|
|
算法
TEA系列
均会使用特征值$\delta$:0x9e3779b9,在IDA中可能使用补码表示:0x61c88647,可使用python:
hex(0xffffffff - 0x61c88647 + 1)
得到 0x9e3779b9
TEA
Tiny Encryption Algorithm,使用Feistel分组加密框架,64轮迭代,原文以8字节(64位)为一组,密钥16字节(128位),具体实现过程:
汇编判断:花指令
|
|
加解密实现
|
|
XTEA
Delta值可以更改,tea取 key 的时候是固定下标取的,现在通过计算取
|
|
XXTEA
原字符串长度可以不是4的倍数,明文分成若干固定长度块,每个块加密后,拼接
|
|
md5
有4个固定的32bit值
SM4
- 分组密码,4组,分组长度128位,密钥长度128位,加解密算法相同,轮密钥使用次序相反,32轮非线性迭代
- 轮密钥 rK 有32个,32位为单位,每一次迭代为一轮F函数
- $X_{i+4}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rK_i)=X_i ⊕ T( X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕rK_i)$
F函数中的T函数
T:合成置换,可逆变换,由非线性变换$\tau$和线性变换$L$复合而成:$T()=L(\tau())$
- 非线性变换 A 到 B,A 和 B 均为32位,$\tau$由4个并行S盒构成【固定的256字节的数组】
$B =(b_0,b_1,b_2,b_3)= τ(A)=(Sbox(a_0),Sbox(a_0),Sbox(a_0),Sbox(a_0))$
查表规则:有 F 行 F 列,输入的32位可表示为2个十六进制数,一个做行一个做列找值替换
- 线性变换 B 到 C,均为32位,此处为循环左移
$C = L(B) = B ⊕(B«<2)⊕(B«<10) ⊕(B«<18) ⊕(B«<24)$
轮密钥扩展
密钥128位,$MK=(MK_0,MK_1,MK_2,MK_3)$,轮密钥由密钥生成
系统参数:$FK=(FK_0,FK_1,FK_2,FK_3)$,固定参数:$CK=(CK_0,CK_1,\cdots ,CK_{31})$
- $(K_0,K_1,K_2,K_3)= (MK_0⊕FK_0, MK_1⊕, FK_1, MK_2⊕FK_2, MK_3⊕FK_3)$
- $rK_i=K_{i+4}=K_i⊕T’(K_{i+1}⊕K_{i+2}⊕K_{i+3}⊕CK_i)\quad\quad [i=0,\cdots,31]$
$T’$即将 $T$ 中的 $L$ 替换为 $L’$:$L’(B)=B\oplus (B\lt\lt\lt 13)\oplus(B\lt\lt\lt 23)$
解密
由于$X_{i+4}=F(X_i,X_{i+1},X_{i+2},X_{i+3~}rK_i)=X_i ⊕ T( X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕rK_i)$
所以$X_i=F(X_{i+4},X_{i+1},X_{i+2},X_{i+3},rK_i)=X_{i+4} ⊕ T(X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕rK_i)$
将密文逆序,轮密钥也逆序,解密流程即加密流程的逆序
源代码链接借鉴:https://cloud.tencent.com/developer/article/2158867
|
|
RC4
对称加密算法,包括初始化算法(KSA)和加密算法
初始化过程
|
|
加解密过程
|
|
调用
|
|
CyberChef
|
|
python
|
|
DES
Base算法
密码+编码
base64
基于64个可打印字符来表示二进制数据,6个bit为一个单元
代码混淆
脏字节
在汇编中加入db 232
花指令
|
|
需要在汇编查看可疑跳转,IDA F5无法看出
SMC技术
Self Modifying Code:自解码代码,程序中的部分代码加密,并插入解密代码,当程序需要运行源代码时,调用解密函数解密该部分代码,再跳转执行,阻止静态分析
Windows
|
|
修改会在IDA中发现:
|
|
|
|
IDAPython
操作:File > Script command > run
|
|
IDC
|
|
动调解决
反调试
函数声明
|
|
PTRACE_TRACEME: 子进程标记
PTRACE_ATTACH: 父进程附加
PTRACE_CONT: 继续执行
绕过:通过动态调试修改RIP直接跳到main函数 或 patch/nop反调试函数
OLLVM
Obfuscator-LLVM,原理:通过修改“LLVM-IR”完成,本质是一个LLVM-PASS——一套IR代码优化脚本
控制流平坦化
将基本控制流并列,由主分发器来决定执行顺序
指令替换
基本运算公式复杂化
|
|
虚假控制流
将原本顺序执行转为条件执行,条件为“永真式”导致不会执行虚假块,但IDA会进行控制流分析
永真式:(((x - 1) * x) & 1) == 0
maze
迷宫问题
- 内存中布置一张地图(#和*显示)
- 用户输入限制在少数几个字符范围内(方向w/s/a/d等)
- 一般只1个迷宫入口、1个迷宫出口(多走法时代价最小 —> 算法问题)
迷宫初始化
|
|
回溯算法
- 深度优先算法DFS:栈
- 广度优先算法BFS:队列
DFS
|
|
壳
压缩壳
UPX
开源、压缩壳,原文件需要40kb以上才能加壳,可通过strings查看UPX字符串
脱壳原理为ESP定律(即堆栈平衡定律),可以在linux中使用:
|
|
或在Windows下使用UPX shell直接解压缩,UPX shell解压缩可能导致文件无法运行
|
|
x96dbg:F8 > 寄存器窗口 > ESP > 在内存窗口中转到
Ollydbg:只能调试32位
使用OD进行UPX手动脱壳
第一条指令一般为pushad,将寄存器值存入栈中,保存上下文
F8单步执行,此时寄存器ESP值发生改变
寄存器窗口 > ESP > HW break[ESP] 或 [数据窗口中跟随] 转到内存视图 > 此处ESP地址设置断点-硬件访问
F9运行到断点处,上图003B750F
的上一行为popad
,当执行到popad时,将会恢复ESP,此时将会触发硬件断点,中断
发现一个大跳转jmp UPX
,于是F4到jmp代码处 > F8步入
出现了正常的函数开头和结尾,即找到OEP
进行dump完成脱壳:
- 插件 > OllyDump > 脱壳在当前调试的进程 > 获取EIP作为OEP > 脱壳【由于不是windows XP会失败】
- 右键 > 用OllyDump脱壳调试进程 > 脱壳
x64dbg+手动脱壳
打开文件先查看系统断点,F9
运行进入断点处,有多个push
操作
ASPack
加密壳
ASProtect
Armadillo
EXECryptor
Themida
VMP
dll中加入了VMP壳:VMProtect
爆破脚本:爆破exe文件
|
|
混淆壳
虚拟机壳
脱壳
单步跟踪寻找OEP(original entry point,原始入口点),寻找大型跳转
API定位
Microsoft Visual C/C++ 6
VC6
写的代码,直接定位到GetVersion
下断点- x64dbg中:
视图
>模块
,GetVersion
在Kernel32.dll
中,运行,在栈中找调用函数 - OEP在GetVersion上文
ESP定律
od载入程序有pushad指令可用其脱壳
Windows API
堆API
|
|
用户API
|
|
调试API
|
|
调用库API
|
|
安卓
jadx打开文件后,AndroidManifest.xml
文件中包括配置信息等
APK
文件若PC模拟器无法打开,则直接尝试手机安装打开,版本问题
.Net
C#
python
Cython
whl
文件格式xxx-1.14-cp312-cp312-win_amd64
中cp312表示python的版本:python-3.12,需要使用对应的python版本进行安装
|
|
VM
维护opcode操作码表模拟虚拟机操作,switch
对于不同的码进行相应操作,一般来说都是对单字符进行处理(友好出题人,先使用IDA动态调试跟踪操作
Frida插桩测试
|
|
此时在输入不同值时会出现不同number,且输入正确number会增加,可利用此进行侧信道爆破
侧信道爆破
|
|
最后一个字符还需要再次爆破
|
|
易语言
- 运行exe文件寻找逻辑:找点击类似的函数,分析输入经过的过程
- 易语言加密算法可选DES和RC4,RC4与标准算法结果相同,直接RC4解即可,DES算法和其他标准算法产生结果不同
DES算法解密
|
|