逆向反汇编基础之二十三:SEH(FS 0号)检测发现跟踪就悲剧

这个CM比较特别,加入了FS:[0]SEH检测OD跟踪的功能~

但是我们并不倡导跟踪和调试,要学会把握静态反汇编,所以这对我们无障碍

若真要跟踪,直接把SEH去掉便是~

/*****************************************************/

00401103   .  C705 08304000>mov     dword ptr [403008], 0040112C
0040110D   .  892D 04304000 mov     dword ptr [403004], ebp
00401113   .  68 00104000   push    00401000
00401118   .  64:FF35 00000>push    dword ptr fs:[0]
0040111F   .  8925 00304000 mov     dword ptr [403000], esp
00401125   .  64:8925 00000>mov     dword ptr fs:[0], esp
0040112C   .  64:8F05 00000>pop     dword ptr fs:[0]
00401133   .  83C4 04       add     esp, 4
00401136   .  C705 08304000>mov     dword ptr [403008], 0040116A
00401140   .  892D 04304000 mov     dword ptr [403004], ebp
00401146   .  68 00104000   push    00401000
0040114B   .  64:FF35 00000>push    dword ptr fs:[0]
00401152   .  8925 00304000 mov     dword ptr [403000], esp
00401158   .  64:8925 00000>mov     dword ptr fs:[0], esp
0040115F   .  33DB          xor     ebx, ebx
00401161   .  33D2          xor     edx, edx
00401163   .  B8 02000000   mov     eax, 2
00401168   .  F7F3          div     ebx
0040116A   .  64:8F05 00000>pop     dword ptr fs:[0]

/*****************************************************/

这个CM要注意,隐藏的规定Name长度

一组可以Key:

ShadowKong

b30101b8

http://dl.dbank.com/c0a5szasew

MASM`s 指令速查

指令 功能
AAA 调整加
AAD 调整除
AAM 调整乘
AAS 调整减
ADC 进位加
ADD
AND
ARPL 调整优先级
BOUND 检查数组
BSF 位右扫描
BSR 位左扫描
BSWAP 交换字节
BT 位测试
BTC 位测试求反
BTR 位测试清零
BTS 位测试置一
CALL 过程调用
CBW 转换字节
CDQ 转换双字
CLC 进位清零
CLD 方向清零
CLI 中断清零
CLTS 任务清除
CMC 进位求反
CMOVA 高于传送
CMOVB 低于传送
CMOVE 相等传送
CMOVG 大于传送
CMOVL 小于传送
CMOVNA 不高于传送
CMOVNB 不低于传送
CMOVNE 不等传送
CMOVNG 不大于传送
CMOVNL 不小于传送
CMOVNO 不溢出传送
CMOVNP 非奇偶传送
CMOVNS 非负传送
CMOVO 溢出传送
CMOVP 奇偶传送
CMOVS 负号传送
CMP 比较
CMPSB 比较字节串
CMPSD 比较双字串
CMPSW 比较字串
CMPXCHG 比较交换
CMPXCHG486 比较交换486
CMPXCHG8B 比较交换8字节
CPUID CPU标识
CWD 转换字
CWDE 扩展字
DAA 调整加十
DAS 调整减十
DEC 减一
DIV
ENTER 建立堆栈帧
HLT
IDIV 符号整除
IMUL 符号乘法
IN 端口输入
INC 加一
INSB 端口输入字节串
INSD 端口输入双字串
INSW 端口输入字串
JA 高于跳转
JB 低于跳转
JBE 不高于跳转
JCXZ 计数一六零跳转
JE 相等跳转
JECXZ 计数三二零跳转
JG 大于跳转
JL 小于跳转
JMP 跳转
JMPE 跳转扩展
JNB 不低于跳转
JNE 不等跳转
JNG 不大于跳转
JNL 不小于跳转
JNO 不溢出跳转
JNP 非奇偶跳转
JNS 非负跳转
JO 溢出跳转
JP 奇偶跳转
JS 负号跳转
LAHF 加载标志低八
LAR 加载访问权限
LDS 加载数据段
LEA 加载有效地址
LEAVE 清除过程堆栈
LES 加载附加段
LFS 加载标志段
LGDT 加载全局描述符
LGS 加载全局段
LIDT 加载中断描述符
LMSW 加载状态字
LOADALL 加载所有
LOADALL286 加载所有286
LOCK
LODSB 加载源变址字节串
LODSD 加载源变址双字串
LODSW 加载源变址字串
LOOP 计数循环
LOOPE 相等循环
LOOPNE 不等循环
LOOPNZ 非零循环
LOOPZ 为零循环
LSL 加载段界限
LSS 加载堆栈段
LTR 加载任务
MONITOR 监视
MOV 传送
MOVSB 传送字节串
MOVSD 传送双字串
MOVSW 传送字串
MOVSX 符号传送
MOVZX 零传送
MUL
MWAIT
NEG 求补
NOP
NOT
OR
OUT 端口输出
OUTSB 端口输出字节串
OUTSD 端口输出双字串
OUTSW 端口输出字串
POP 出栈
POPA 全部出栈
POPF 标志出栈
PUSH 压栈
PUSHA 全部压栈
PUSHF 标志压栈
RCL 进位循环左移
RCR 进位循环右移
RDMSR 读专用模式
RDPMC 读执行监视计数
RDSHR
RDTSC 读时间戳计数
REP 重复
REPE 相等重复
REPNE 不等重复
RET 过程返回
RETF 远过程返回
RETN 近过程返回
ROL 循环左移
ROR 循环右移
RSM 恢复系统管理
SAHF 恢复标志低八
SAL 算术左移
SALC
SAR 算术右移
SBB 借位减
SCASB 扫描字节串
SCASD 扫描双字串
SCASW 扫描字串
SETA 高于置位
SETB 低于置位
SETE 相等置位
SETG 大于置位
SETL 小于置位
SETNA 不高于置位
SETNB 不低于置位
SETNE 不等置位
SETNG 不大于置位
SETNL 不小于置位
SETNO 不溢出置位
SETNP 非奇偶置位
SETNS 非负置位
SETO 溢出置位
SETP 奇偶置位
SETS 负号置位
SGDT 保存全局描述符
SHL 逻辑左移
SHLD 双精度左移
SHR 逻辑右移
SHRD 双精度右移
SIDT 保存中断描述符
SLDT 保存局部描述符
SMI
SMINT
SMINTOLD
SMSW 保存状态字
STC 进位设置
STD 方向设置
STI 中断设置
STOSB 保存字节串
STOSD 保存双字串
STOSW 保存字串
STR 保存任务
SUB
SYSCALL 系统调用
SYSENTER 系统进入
SYSEXIT 系统退出
SYSRET 系统返回
TEST 数测试
UD0 未定义指令0
UD1 未定义指令1
UD2 未定义指令2
UMOV
VERW 校验写
WAIT
WBINVD 回写无效高速缓存
WRMSR 写专用模式
WRSHR
XADD 交换加
XBTS
XCHG 交换
XLAT 换码
XOR 异或
XSTORE

指令 功能
EMMS 媒体空MMX状态
F2XM1 浮点栈顶绝对值
FADD 浮点加
FADDP 浮点加出栈
FBLD 浮点加载十数
FBSTP 浮点保存十数出栈
FCHS 浮点正负求反
FCLEX 浮点检查错误清除
FCMOVB 浮点低于传送
FCMOVBE 浮点不高于传送
FCMOVE 浮点相等传送
FCMOVNB 浮点不低于传送
FCMOVNBE 浮点高于传送
FCMOVNE 浮点不等传送
FCMOVNU 浮点有序传送
FCMOVU 浮点无序传送
FCOM 浮点比较
FCOMI 浮点比较加载标志
FCOMIP 浮点比较加载标志出栈
FCOMP 浮点比较出栈
FCOMPP 浮点比较出栈二
FCOS 浮点余弦
FDECSTP 浮点栈针减一
FDISI 浮点检查禁止中断
FDIV 浮点除
FDIVP 浮点除出栈
FDIVR 浮点反除
FDIVRP 浮点反除出栈
FENI 浮点检查禁止中断二
FFREE 浮点释放
FFREEP 浮点释放出栈
FIADD 浮点加整数
FICOM 浮点比较整数
FICOMP 浮点比较整数出栈
FIDIV 浮点除整数
FIDIVR 浮点反除
FILD 浮点加载整数
FIMUL 浮点乘整数
FINCSTP 浮点栈针加一
FINIT 浮点检查初始化
FIST 浮点保存整数
FISTP 浮点保存整数出栈
FISTTP
FISUB 浮点减整数
FISUBR 浮点反减整数
FLD 浮点加载数
FLD1 浮点加载一
FLDCW 浮点加载控制器
FLDENV 浮点加载环境
FLDL2E 浮点加载L2E
FLDL2T 浮点加载L2T
FLDLG2 浮点加载LG2
FLDLN2 浮点加载LN2
FLDPI 浮点加载PI
FLDZ 浮点加载零
FMUL 浮点乘
FMULP 浮点乘出栈
FNCLEX 浮点不检查错误清除
FNDISI 浮点不检查禁止中断
FNENI 浮点不检查禁止中断二
FNINIT 浮点不检查初始化
FNOP 浮点空
FNSAVE 浮点不检查保存状态
FNSTCW 浮点不检查保存控制器
FNSTENV 浮点不检查保存环境
FNSTSW 浮点不检查保存状态器
FPATAN 浮点部分反正切
FPREM 浮点部分余数
FPREM1 浮点部分余数二
FPTAN 浮点部分正切
FRNDINT 浮点舍入求整
FRSTOR 浮点恢复状态
FSAVE 浮点检查保存状态
FSCALE 浮点比例运算
FSETPM 浮点设置保护
FSIN 浮点正弦
FSINCOS 浮点正余弦
FSQRT 浮点平方根
FST 浮点保存
FSTCW 浮点检查保存控制器
FSTENV 浮点检查保存环境
FSTP 浮点保存出栈
FSTSW 浮点检查保存状态器
FSUB 浮点减
FSUBP 浮点减出栈
FSUBR 浮点反减
FSUBRP 浮点反减出栈
FTST 浮点比零
FUCOM 浮点无序比较
FUCOMI 浮点反比加载标志
FUCOMIP 浮点反比加载标志出栈
FUCOMP 浮点无序比较出栈
FUCOMPP 浮点无序比较出栈二
FWAIT 浮点等
FXAM 浮点检查
FXCH 浮点交换
FXTRACT 浮点分解
FYL2X 浮点求L2X
FYL2XP1 浮点求L2XP1
MOVED 媒体双字传送
MOVEQ 媒体四字传送
PACKSSDW 媒体符号双字压缩
PACKSSWB 媒体符号字压缩
PACKUSWB 媒体无符号字压缩
PADDB 媒体截断字节加
PADDD 媒体截断双字加
PADDSB 媒体符号饱和字节加
PADDSIW
PADDSW 媒体符号饱和字加
PADDUSB 媒体无符号饱和字节加
PADDUSW 媒体无符号饱和字加
PADDW 媒体截断字加
PAND 媒体与
PANDN 媒体与非
PAVEB
PCMPEQB 媒体字节比等
PCMPEQD 媒体双字比等
PCMPEQW 媒体字比等
PCMPGTB 媒体字节比大
PCMPGTD 媒体双字比大
PCMPGTW 媒体字比大
PDISTIB
PMACHRIW
PMADDWD
PMAGW
PMULHRIW
PMULHRWC
PMULHW
PMVGEZB
PMVLZB
PMVNZB
PMVZB
POR 媒体或
PSLLD 媒体双字左移
PSLLQ 媒体四字左移
PSLLW 媒体字左移
PSRAD 媒体双字算术右移
PSRAW 媒体字算术右移
PSRLD 媒体双字右移
PSRLQ 媒体四字右移
PSRLW 媒体字右移
PSUBB 媒体截断字节减
PSUBSB 媒体符号饱和字节减
PSUBSIW
PSUBSW 媒体符号饱和字减
PSUBUSB 媒体无符号饱和字节减
PSUBUSW 媒体无符号饱和字减
PSUBW 媒体截断字减
PUNPCKHBW 媒体字节高位解压
PUNPCKHDQ 媒体双字高位解压
PUNPCKHWD 媒体字高位解压
PUNPCKLBW 媒体字节低位解压
PUNPCKLDQ 媒体双字低位解压
PUNPCKLWD 媒体字低位解压

逆向反汇编基础之二十二:算法逆

今天这个CM主要的是算法逆向的问题…一段简单的算法代码:

/************************************************/

00401199   .  33C9          xor     ecx, ecx
0040119B   .  33DB          xor     ebx, ebx
0040119D   >  36:0FB69429 3>movzx   edx, byte ptr ss:[ecx+ebp-C4]
004011A6   .  03DA          add     ebx, edx
004011A8   .  6BDB 10       imul    ebx, ebx, 10
004011AB   .  41            inc     ecx
004011AC   .  3BC8          cmp     ecx, eax
004011AE   .^ 75 ED         jnz     short 0040119D
/************************************************/

其中eax==KeyLen

明显这个CM的验证格式是 f1(Name)==f2(Key);

写注册机的时候f1是非逆,所以f1(Name)的值很容易得到,写注册机的关键是逆f2();

这里的注册机只逆了当NameLen<=0x05的情况….

完美的注册机可以参考这注册机代码后再斟酌斟酌

一组可以Key:

Kong

=416530

注册机f2()逆完全是我个人推算出 和CM本身算法有点小区别

可以在Key前面加任何多个任何字符都OK~

http://dl.dbank.com/c0jglan3as

逆向反汇编基础之二十一:作者怎么做到的?居然把算法内嵌到API中?(原理已查明)

正如标题所言,这个CM仅次于之前的构造:

004xxx01  Call 004xxxx1

004xxx01  cmp EDI,0

004xxx01  JNZ offset[ 悲剧]

……..

……..

004xxxx1  XOR EDI EDI

004xxxx2  NOP

004xxxx3  RETN

机器码小关键CALL的CM,构造机器码的这个CM是迄今为止我觉得最有水平的 虽然可能这个CM的水平一般~但思路非常牛B

今天这个CM的关键算法位置居然是在API MessageBox的跳转过程中嵌入~怎么做到的??一般人肯定不会去跟一个对它非常熟悉的API

就像我第一次肯定不会去跟MessageBox一样..但重要部分恰恰在其中.非常希望能知道作者是怎么办到的~非常高明啊 佩服作者的思维和想法~

/*经过这几天的试验,其实实现这种方式很简单,这涉及API调用的高效和低效的问题

首先  高效的API调用一般都是:

CALL DWORD PTR [ FUNCTION OFFSER IN LAT]

低效的API调用一般是:

CALL  @F

@@:

JMP WORD PTR [FUNCTION OFFSET IN LAT]

如果在一个低效的API的JMP前加入算法CALL的话  这就可以实现类似这个CM的情况了~

理论上应该是这样子的 通过修改DASM绝对可以实现  但是通过MASM编程直接实现可能还要委婉一点~

.还最后要说的是 API调用的高效低效  还和约定调用方式有关*/

一组可用Key:

ShadowKong

16f267241d165BBC694a463A3802694A1a68105A

http://dl.dbank.com/c0qiw24o8e

逆向反汇编之二十:他的CODE的DASM能让人赏心悦目

今天这个CM非常漂亮!很多地方可圈可点啊~今天拿几个地方出来自我欣赏欣赏~

One:

00401390    55              push    ebp
00401391    8BEC            mov     ebp, esp
00401393    83C4 FC         add     esp, -4
00401396    60              pushad
00401397    C745 FC 0000000>mov     dword ptr [ebp-4], 0
0040139E    8B7D 08         mov     edi, dword ptr [ebp+8]
004013A1    FF45 FC         inc     dword ptr [ebp-4]
004013A4    47              inc     edi
004013A5    8A07            mov     al, byte ptr [edi]
004013A7    84C0            test    al, al
004013A9  ^ 75 F6           jnz     short 004013A1
004013AB    8B45 FC         mov     eax, dword ptr [ebp-4]           ; KeyLen
004013AE    F6D0            not     al
004013B0    04 0F           add     al, 0F
004013B2    75 5D           jnz     short 00401411                   ; 14个
004013B4    8B7D 08         mov     edi, dword ptr [ebp+8]
/*看下面这段,非常精彩的非明码确认字符
仔细阅读代码 你会发现其实就是在判断是否是’-‘(ASC为0x2D)
但是作者这种方法可谓非常巧妙~一眼看去还以为是啥重要算法=.=*/

继续阅读“逆向反汇编之二十:他的CODE的DASM能让人赏心悦目”

逆向反汇编基础之十九:完美编码算NameLen

今天的CM是控制台的呵呵~

也算是一种类型了,完全没有API调用(其实API调用也就是封掉了一些东西 或者说MS直接给个函数你用 而不用你自己Dim),虽然是用PHI写的,但估计用0x10Asm写的也这样差不多~

反汇编这类小CM要主意的是.找对关键算法CALL,此CM依然算法简单到鬼一样~

但是其中PHI控制台的编码结构能让人眼前一亮 如果你长时间和各种invoke打交道的话~

但是这不是我今天要说的,我今天要说的是比较底层(16位汇编)的编码取得NameLen(用户名长度)或者KenLen 或者各种Len的问题.

首先看下面一段小代码:

00405BE4  /$  89FA          mov     edx, edi
00405BE6  |.  89C7          mov     edi, eax
00405BE8  |.  B9 FFFFFFFF   mov     ecx, -1
00405BED  |.  32C0          xor     al, al
00405BEF  |.  F2:AE         repne   scas byte ptr es:[edi]
00405BF1  |.  B8 FEFFFFFF   mov     eax, -2
00405BF6  |.  29C8          sub     eax, ecx
00405BF8  |.  89D7          mov     edi, edx
00405BFA  \.  C3            retn

请把地址忽略只看中间0x00405BED到0x00405BDF1部分,如果你经常在您的程序中调用API 你就会知道 这个其实很简单,不就是GetDlgItemTextA/W的返回值么?对的 就是取这个返回值,我们看不用API的情况下是怎么取得的~就是这三句代码,运用搜索SCAS返回NameLen

可见这是逐个判断 然后JNE则+1的~这比直接调用API得到返回值更清晰细腻

知道这个有什么用?一般如果是crackme 而且是反汇编后看不到一大堆API调用的crackme,都会有关于计算这类Len的CALL

在大堆Call中识别出这类Call能帮助你更快速的找到关键算法Call 而没有必要一个一个Call跟进去..好了 就这小目的而已 适合我等菜~

一组可用Key:

ShadowKong

115

http://dl.dbank.com/c01tq7y8q3

逆向反汇编基础之十八:DDMM,一个简单的算法,适合各种菜

如标题,这个CRACKME非常简单…也非常适合我等熟悉反汇编,每日一CrackMe还是必须要做的工作~

呃 今天有点晚呢~

下次争取剪短时间完成!

用了内联反汇编还搞那么慢,实在非常~

一组可用Key:

ShadowKong

643062706f1b3

http://dl.dbank.com/c0kkfatx8v

逆向反汇编基础之十七:平安保险那小妞你秀逗了,乐了我一天

今天的CM还是一如既往的不难,适合各种练手~

还是一如既往的反汇编直接读写~

今天那平安保险的小妞给我打电话笑死哥了~

请问先生您生日多少呢?

呃`不想告诉你咋办?

#$@$10秒后 请问先生您的生日是多少呢?我们不会打听您的隐私~

呃`不能告诉你咋办?

@$@#$@20秒后 那请问先生您的生日多少呢?

呃~就不告诉你!

!@#@#30秒后 那先生你可以挂电话咯~

呃~靓妹你也可以挂电话了~

电话那头笑趴了~这头也趴了


一组可用KEY:

ShadowKong

ACA0-0193-DAF5-396F

http://dl.dbank.com/c0rfr9vb5q

.Net下IL ASM的HelloWorld

每当接触一种语言或者一个编程构架,无论在那一本书,那一个坛子的教程~

HelloWorld小程序都是开书或者开贴的第一印象~

YOUS 今天刚刚接触ILAsm 来个ILAsm 的HELLOWORLD,

从此,HelloWorld又多了一种写法…

/**********************************************************/

.assembly extern mscorlib{}
.assembly hello{}
.module hello.exe
.class public auto ansi class1 extends System.Object
{
.method public static void addTwoInts()
{
.entrypoint
ldstr “Hello ILAsm`s World!”
call void [mscorlib]System.Console::WriteLine(string)
nop
ret
}
}
/*保存为HELLO.IL 然后CMD (ILASM.EXE HELLO.IL)*/

/**********************************************************/


如果你是清风等.net高手,相信一眼遍明白所有指令…

话说ILASM也不错…

可惜我完全不会.NET编程(C# 版HelloWorld除外~)

逆向反汇编基础之十六:少了个0x05,浪费1小时,汇编指令BOUND会被历史遗忘么?

今天拿到此CM无壳还OK,虽然简单的壳很好玩,但是重的壳我等菜如何招架~

话说回来..

此CM算法一般,自反汇编一下就知道,实在不行你就跟踪下也能知道,再不行你就跟踪几次肯定能知道.我们今天要说的是反汇编中一个特殊的指令~

此CM最大区别在于在反汇编中用到BOUND指令~

看此处:

/*****************************************************************************/

00427AC0  |. |B9 0A000000   |mov     ecx, 0A                         ;  0x0A
00427AC5  |. |99            |cdq
00427AC6  |. |F7F9          |idiv    ecx                             ;  /10?
00427AC8  |. |6215 3C7B4200 |bound edx, qword ptr [427B3C]
/*看这句代码 可知道 bound 是双操作数的指令/*
/*稍微往下看,[427B3C]处…发现什么?是00 00 00 00 0C 00 00 00*/
/*一堆0忽略 我们看0x0C,0x0C=12,12是啥?12正是我们算法序列中的一个数组数量~*/
/*换言之,bound指令的作用就是检查数组,获取(offse[数组]):[edx]处的元素~*/
/*分析到这里bound的作用应该一目了然了吧~*/
00427ACE  |. |8A92 84884200 |mov     dl, byte ptr [edx+428884]
00427AD4  |. |8D45 F0       |lea     eax, dword ptr [ebp-10]
00427AD7  |. |E8 FCBBFDFF   |call    004036D8
00427ADC  |. |8B55 F0       |mov     edx, dword ptr [ebp-10]
00427ADF  |. |8D45 F4       |lea     eax, dword ptr [ebp-C]
00427AE2  |. |E8 D1BCFDFF   |call    004037B8
00427AE7  |. |8BC3          |mov     eax, ebx
00427AE9  |. |B9 0A000000   |mov     ecx, 0A
00427AEE  |. |99            |cdq
00427AEF  |. |F7F9          |idiv    ecx
00427AF1  |. |8BD8          |mov     ebx, eax
00427AF3  |. |4E            |dec     esi
00427AF4  |.^\75 C8         \jnz     short 00427ABE
00427AF6  |>  8B45 F4       mov     eax, dword ptr [ebp-C]
00427AF9  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
00427AFC  |.  E8 BFBDFDFF   call    004038C0
00427B01  |.  75 07         jnz     short 00427B0A
00427B03  |.  BB 4E61BC00   mov     ebx, 0BC614E
00427B08  |.  EB 05         jmp     short 00427B0F
00427B0A  |>  BB 91D61200   mov     ebx, 12D691
00427B0F  |>  33C0          xor     eax, eax
00427B11  |.  5A            pop     edx
00427B12  |.  59            pop     ecx
00427B13  |.  59            pop     ecx
00427B14  |.  64:8910       mov     dword ptr fs:[eax], edx
00427B17  |.  68 317B4200   push    00427B31
00427B1C  |>  8D45 F0       lea     eax, dword ptr [ebp-10]
00427B1F  |.  BA 04000000   mov     edx, 4
00427B24  |.  E8 2FBAFDFF   call    00403558
00427B29  \.  C3            retn
00427B2A   .^ E9 A9B4FDFF   jmp     00402FD8
00427B2F   .^ EB EB         jmp     short 00427B1C
00427B31   .  8BC3          mov     eax, ebx
00427B33   .  5E            pop     esi
00427B34   .  5B            pop     ebx
00427B35   .  8BE5          mov     esp, ebp
00427B37   .  5D            pop     ebp
00427B38   .  C3            retn
00427B39      00            db      00
00427B3A      00            db      00
00427B3B      00            db      00
00427B3C      00            db      00
00427B3D      00            db      00
00427B3E      00            db      00
00427B3F      00            db      00
00427B40      0C            db      0C
00427B41      00            db      00
00427B42      00            db      00
00427B43      00            db      00
/*****************************************************************************/

一组可用KEY:

ShadowKong

N6N465AA5A

http://dl.dbank.com/c0cn87dscz