网页 序列号 逆向linux,逆向序列号生成算法(一)

2023-11-20

对逆向工程一直很感兴趣,工作之余自己也研究一下,好久没有练手了,OllyDBG的使用都感觉生疏了,晚上抽空先去补了补OllyDBG的使用方法,然后看到一个叫做CycleCrackMe的序列号保护练手程序(如图1),刚好是OllyDBG入门文章里面提到的一个演示用程序,只是把OllyDBG的消息断点及RUN的跟踪相关的知识讲了一下,对CycleCrackMe里面具体的加密算法留给读者自己去研究,正好给了我一个练手的机会。

0818b9ca8b590ca3270a3433284dd417.png

(图1)

首先我得把其加密的算法部分剥离出来,通过OllyDBG的动态分析,我把其加密的过程分成了三个函数抽离了出来,分别是:

void ExtendNameTo16Bytes( char *pStrName );

void CalculateKeyStep1( const char *pStrName, const char *pStrSerialNum,

DWORD &outTempNum1, DWORD &outTempNum2 );

bool CalculateKeyStep2( const DWORD nTempNum1, const DWORD nTempNum2,

const char *pStrName, const char *pStrSerialNum );

将抽离的函数实现都抽离出来,容易用C++表示的就用C++逆向出来。得出的实现代码如下:

void ExtendNameTo16Bytes( char *pStrName )

{

assert( NULL != pStrName );

if ( NULL == pStrName ) return;

size_t nStrLen = strlen(pStrName);

int nNeedtoExtend = 16 - nStrLen;

if ( nNeedtoExtend <=0 )

return;

int nCount = 0;

while ( nNeedtoExtend-- )

{

*(pStrName+nStrLen+nCount) = *(pStrName+nCount);

++nCount;

}

}

void CalculateKeyStep1( const char *pStrName, const char *pStrSerialNum,

DWORD &outTempNum1, DWORD &outTempNum2 )

{

assert( NULL != pStrName );

assert( NULL != pStrSerialNum );

if ( NULL == pStrName || NULL == pStrSerialNum )

return;

DWORD nNameTemp1 = *(DWORD*)pStrName;

DWORD nNameTemp2 = *(DWORD*)(pStrName+4);

DWORD nSerialTemp1 = *(DWORD*)pStrSerialNum;

DWORD nSerialTemp2 = *(DWORD*)(pStrSerialNum+4);

nNameTemp1 ^= nSerialTemp1;

nNameTemp2 ^= nSerialTemp2;

nNameTemp1 &= 0x7F3F1F0F;

nNameTemp2 &= 0x7030100;

DWORD nEAX=0;

DWORD nEBX=0;

DWORD nECX=0;

DWORD nEDX=0;

__asm

{

xor ecx, ecx

mov eax, nNameTemp1

mov ebx, nNameTemp2

label3: mov esi, eax ; esi=eax

mov edi, ebx ; edi=ebx

shl esi, cl

shl edi, cl

and esi, 0x80808080 ; esi 与 80808080h

and edi, 0x80808080 ; edi 与 80808080h

mov edx, esi ; edx=esi

shr dh, 7 ; dh,8位右移7位

shl dx, 7

shr edx, 8

shr dh, 7

shl dx, 7

shr edx, 8

shr dh, 7

shr dx, 1

mov esi, edx ; esi=edx

mov edx, edi ; edx=edi

shr dh, 7

shl dx, 7

shr edx, 8

shr dh, 7

shl dx, 7

shr edx, 8

shr dh, 7

shr dx, 5

mov edi, edx ; edi=edx

xor edi, esi ; edi = edi xor edx

mov edx, edi ; edx = edi

and edx, 0x0FF ; edx &= 0xff

push ecx

push edx

mov edx, 8 ; edx=8

xchg eax, ecx

cmp eax, 3

jg short label1

mul dl

pop edx

add eax, 8

xchg eax, ecx

rol eax, cl

xor eax, edx

ror eax, cl

jmp short label2

label1: sub eax, 3

mul dl

pop edx

xchg eax, ecx

rol ebx, cl

xor ebx, edx

ror ebx, cl

label2 :pop ecx

inc ecx ;ecx++

cmp ecx, 8 ;循环8次

jnz label3

mov nEAX, eax

mov nEBX, ebx

}

outTempNum1 = nEAX;

outTempNum2 = nEBX;

}

bool CalculateKeyStep2( const DWORD nTempNum1, const DWORD nTempNum2,

const char *pStrName, const char *pStrSerialNum )

{

DWORD nMagicNum = 0xfedcba98;

__asm

{

mov eax, nTempNum1

mov ebx, nTempNum2

mov ecx, 0xff01

push ecx

call Func

cmp ecx, 1

je label6

jmp label7

Func: pop edi

pop ecx

push edi

cmp ecx, 0x80

jle short label1

push ecx

mov esi, ecx

and ecx, 0xFF

mov edi, eax

cmp ecx, 8

jle short label2

mov edi, ebx

shr ecx, 4

label2: rol edi, 8

shr ecx, 1

jnz short label2

shr esi, 8

and edi, esi

and edi, 0xFF

pop ecx

label4: mov esi, 0x80

label5: test esi, edi

je short label3

xor edi, esi

push edi

and ecx, 0xFF00

xchg esi, ecx

xor ch, cl

xor esi, ecx

xchg ecx, esi

push ecx

inc nMagicNum ;nMagicNum++

call Func

pop edi

jmp short label4

label3: shr esi, 1

jnz short label5

label1: retn

label6: mov eax, DWORD ptr [pStrName+8]

mov ebx, DWORD ptr [pStrName+ 0xc]

xor eax, ebx

xor eax, nMagicNum

or eax, 0x40404040

and eax, 0x77777777

xor eax, DWORD ptr [pStrSerialNum+8]

xor eax, DWORD ptr [pStrSerialNum+0xc]

je label8

label7: xor eax, eax ;符合序列号要求,返回false.

pop edi

pop esi

pop ebx

mov esp, ebp

pop ebp

ret

label8: mov al, 1 ;符合要求返回true.

}

}

算法流程为:首先根据输入的用户名,若不足16字节,则扩展至16字节,然后进入Step1,Step2进行计算判断用户名与序列号是否相配。

To be continued......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网页 序列号 逆向linux,逆向序列号生成算法(一) 的相关文章

  • 日志清理脚本

    需求背景 解决某些中间件或者应用日志无法自动清理的情况 比如 Nacos 的 access 日志清理 临时目录文件清理等 简介 Filename clear logs sh Revision 0 0 3 Date 2020 06 05 Au
  • 探究Xcode New Build System对于构建速度的提升

    在Xcode9发布的时候 Apple在Build System上提供了新版本的构建系统 New Build System 具体可见WWDC2017 不过令人失望的是 该新特性的讲解很简短 短到只在一页PPT上露脸 在这短短的时间里 苹果讲述
  • Python 生成器如何设置和使用

    Python 的生成器其实可以理解为一种比较复杂的迭代器 关于迭代器 可以参考 Python 迭代器的设置和使用方法 一 代码举例 def gen x y txt I love x yield txt txt 1 You love y yi
  • 作用域和内存问题

    文章目录 一 基本类型和引用类型的值 基本类型和引用类型的区别 1 动态的属性 2 复制变量值 3 传递参数 4 监测类型 二 执行环境及作用域 1 延长作用域链 2 没有块级作用域 一 基本类型和引用类型的值 变量可能包括两种不同的数据类
  • 【Docker】之安装 Redis

    一 下载 Redis 镜像 下载最新版 Redis 镜像 默认版本为 latest docker pull redis 更多版本镜像 1 访问 Docker 官网 https hub docker com 在镜像搜索栏中输入 Redist
  • flea-auth使用之用户子模块介绍

    用户子模块 本篇主要介绍笔者 授权模块 flea auth 下的用户子模块 1 总览 表名 中文描述 flea account 账户 flea account attr 账户扩展属性 flea user 用户 flea user attr
  • libevent的消息传递和回调注册函数

    参考原帖地址 https www cnblogs com secondtonone1 p 5554075 html 1 evconnlistener new bind函数 1 evconnlistener new bind 完成socket
  • JDK8下载安装

    参考 JDK8下载安装教程 涵涵想养猫的博客 CSDN博客 jdk8下载安装 下载地址 https www oracle com java technologies javase javase jdk8 downloads html 根据需
  • python 中 os._exit(), sys.exit()

    1 os exit 不抛异常 后面的代码就不执行了 不执行相关清理工作 直接退出 Python 解释器一般来说用在子线程中退出 2 sys exit 引发一个 SystemExit 异常 没有捕获这个异常 会直接退出 捕获这个异常可以做一些
  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • 禁止ios浏览器页面上下滚动 (橡皮筋效果)弹性滚动 微信的下拉回弹

    发现之前阻止页面滚动的代码e preventDefault代码失效了 于是自己折腾了一番 找到了解决办法 一 前言 浏览器在移动端有一个默认触摸滚动的效果 让我们感触最深的莫过于微信浏览器里面 下拉时自带橡皮筋的效果 然而在开发的时候我们经
  • 软件测试日常分享

    以下是测试主管 测试经理 质量保证经理的面试问题和答案 供新人和有经验的求职者获得他们梦想的工作 1 测试经理的职责是什么 QA经理的角色包括 从启动到结束管理项目 测试计划 获得客户对交付成果的认可 向客户端批准中间交付物和补丁发布 提交
  • 动手学深度学习——softmax回归(原理解释+代码详解)

    目录 1 softmax回归 1 1 分类问题 1 2 网络架构 1 3 全连接层的参数开销 1 4 softmax运算 1 5 小批量样本的矢量化 1 6 损失函数 1 6 1 对数似然 1 6 2 softmax及其导数 1 6 3 交
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 服务器如何开多个虚拟机,服务器运行多个虚拟机

    服务器运行多个虚拟机 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • SpringBoot集成Netty时在Handler类中注入service和dao为null

    最近在做一个服务器接收客户端消息 之前一直都只接触web开发 第一次接触服务器开发 接触到Netty 但在Netty的Handler类里注入为null public class HttpRequestHandler extends Simp
  • 【vue3练习 -12】vue3使用readonly(),shallowReadonly()

    作用 把一个响应式 可以是ref定义的 也可以是reactive定义的 的数据变成只读的 不可以修改 使用场景 假如你的组件有个数据 但是你不希望在使用的时候修改他就可以把他变成只读的 用法示例 import readonly shallo
  • SOLO算法解读

    论文 SOLO Segmenting Objects by Locations 论文链接 https arxiv org abs 1912 04488 代码链接 GitHub WXinlong SOLO SOLO and SOLOv2 fo
  • 安全之安全(security²)博客目录导读

    研究方向 安全之安全 研究内容 ARM RISC V安全架构 TF A TEE之安全 GP安全认证 静态代码分析 FUZZ模糊测试 IDA逆向分析 安全与功耗等 欢迎您的关注 一 ARM安全架构 1 ARM安全架构及其发展趋势 转载 2 A

随机推荐