草庐IT

破解练习-CRACKME001

逸聆君 2023-03-28 原文

001-注册算法分析

一、工具和调试环境

  • 动态调试工具:x64dbg
  • 系统环境:win10 1909

二、分析Serial/name的算法

由于Serial里面就是一个字符串比较,没有啥算法,这里就不详细说了,大概就是通过搜索字符串Failed,就能定位到关键位置,Serial直接可以在栈中观察到,为:Hello Dude!。所以我们主要分析Serial/name的注册算法。

直接使用提示字符串验证,得到错误提示如下

那么我们直接搜索字符串Sorry,得知有两个地方使用该字符串,都设置上断点,然后重新验证,成功断在0x0042F826处,先分析这个,另一个后面再说

断下之后向上定位到关键算法如下

0042FA87     | 8B45 F0           | mov eax,dword ptr ss:[ebp-10]      | [ebp-10]:"Please enter your name !" ; 获取name首地址
0042FA8A     | 0FB600     	 | movzx eax,byte ptr ds:[eax]        | ; eax = name[0] 取出name的第一个字符存放在eax中
0042FA8D     | F72D 50174300     | imul dword ptr ds:[431750]         | 00431750:L")"  ; ")" aiscii码为 0x29  eax = name[0] * 0x29
0042FA93     | A3 50174300       | mov dword ptr ds:[431750],eax      | ; key = name[0] * 0x29
0042FA98     | A1 50174300       | mov eax,dword ptr ds:[431750]      | ; 
0042FA9D     | 0105 50174300     | add dword ptr ds:[431750],eax      |	; key = name[0] * 0x29 * 2

通过算法key = name[0] * 0x29 * 2算出key后,紧接着拼接得到Serial,格式为:CW-key-CRACKED

三、算法核心代码模拟

char* GetSerial(char* szName)
{
    static char szSerial[60] = {};
    if (strlen(szName) < 4)
    {
        MessageBox(NULL, "Name至少需要4位", "温馨提示", MB_OK);
        return nullptr;
    }

    int key = szName[0] * 0x29 * 2;
	
    sprintf(szSerial, "CW-%d-CRACKED", key);
    return szSerial;
}

有关破解练习-CRACKME001的更多相关文章

  1. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  2. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  3. ruby-on-rails - Ruby to_proc 破解与绑定(bind) - 2

    我正在尝试创建一个小的Rubyhack来制作类似于Symbol#to_prochack的反向操作。而Symbol#to_prochack使这成为可能:some_array.each(&:some_method)与相同some_array.each{|obj|obj.some_method}我想让这成为可能:some_array.each(&[:some_method])会和一样some_array.each{|obj|some_method(obj)}问题在于,除非some_method是内核方法,否则它的真正含义是:some_array.each{|obj|self.some_met

  4. ruby - 破解 rails.vim 以与 Padrino 一起工作 - 2

    我最近克隆了rails.vim(vim-rails),希望对其进行修改以用于Padrino项目。目前我正在尝试获取Rcontroller命令不仅可以查看app/controllers(非常适合rails),还可以查看项目中具有名为“controllers”的子文件夹的任何文件夹。因此,当我在命令模式下键入Rcontroller并点击Tab键时,我应该能够通过Tab键浏览admin/controllers/base.rb。,admin/controllers/accounts.rb,app/controllers/events.rb等。这将使插件的用户跳转到Padrino应用程序的“子应

  5. ruby-on-rails - Rails for Zombies Lab 4 > 练习 3 - 2

    我在第三个练习中停留在第四个RailsforZombies实验室。这是我的任务:创建将创建新僵尸的操作,然后重定向到创建的僵尸的显示页面。我有以下参数数组:params={:zombie=>{:name=>"Greg",:graveyard=>"TBA"}}我写了下面的代码作为解决方案:defcreate@zombie=Zombie.create@zombie.name=params[:zombie[:name]]@zombie.graveyard=params[:zombie[:graveyard]]@zombie.saveredirect_to(create_zombie_path

  6. 防止暴力破解ssh的四种方法 - 2

    一.方法介绍防止暴力破解的四种方法:1密码要写的足够的复杂,通常建议将密码写16位,并且无连贯的数字或者字母;当然也可以固定一个时间修改一次密码,推荐是一个月修改一次会稳妥一些2修改ssh的端口号,给对方一些迷惑性,因为远程linux服务器默认端口是22,修改成其他的端口,三位数,四位数的都行,这样能避免大部分的暴力破解的可能性3通常我们远程登录都是使用root用户进行登录的,我们将root用户设置成系统用户,并且不允许root账号直接登录,添加一个普通用户,给它赋予root用户的权限,这样也能极大的避免对方破解成功的可能性。4使用秘钥认证的方式登录,在客户端上生成公钥和私钥,将公钥发送给需要

  7. javascript - 001 形式的数字 - 2

    001格式的数字有没有专门的名字。例如,数字20将是​​020,1将是001。当你不知道某个东西的名字时,很难谷歌搜索!因为我已经在浪费你们的时间了,有人知道一个函数吗用于将数字更改为这种格式。 最佳答案 我认为这通常被称为“填充”数字。 关于javascript-001形式的数字,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6823592/

  8. javascript - Eloquent JavaScript 2nd Edition 递归练习解答 - 2

    我试图解决在线书籍eloquentjavascript2ndedition的递归练习:问题是这样的:We’veseenthat%(theremainderoperator)canbeusedtotestwhetheranumberisevenoroddbyusing%2tocheckifit’sdivisiblebytwo.Here’sanotherwaytodefinewhethera(positive,whole)numberisevenorodd:Zeroiseven.Oneisodd.ForanyothernumberN,itsevennessisthesameasN-2.De

  9. javascript - React-native 的 Code Push 破解 Jest 测试 - 2

    我已经为代码推送配置了一个应用程序,除了Jest测试外,它运行良好。由于此错误而无法呈现应用程序:TypeError:Cannotreadproperty'CheckFrequency'ofundefinedatObject.(app/index.js:7:66)atObject.(index.ios.js:5:12)atObject.(__tests__/index.ios.js:4:12)在这一行中:constcodePushOptions={checkFrequency:codePush.CheckFrequency.MANUAL};测试代码为:importAppfrom'../

  10. javascript - 对javascript练习的困惑 - 2

    我刚拿到DouglasCrockford的Javascript:TheGoodParts,我在理解他关于原型(prototype)的示例之一时遇到了一些困难。书中代码如下:if(typeofObject.create!=="function"){Object.create=function(o){varF=function(){}F.prototype=o;returnnewF;};}我假设此代码用于定位函数的原型(prototype)。但为什么要使用如此复杂的方法呢?为什么不直接使用variable.prototype?Crockford是Javascript方面的领先专家,因此我确

随机推荐