CRACKME 3:来源于《逆向工程核心原理 第八章》_OneTrianee的博客-程序员宝宝

技术标签: CrackMe分析  

前言:算是第一次正规的逆向了吧,该程序用vba语言编写,逆向其算法。怎么说呢,这个程序逆向了大概三天,这三天考了三门期末,本来对期末真没有以前那种热情,该水水就水水,考完回来继续分析这个程序,在这上面的时间三天至少花了20个小时,从一开始一脸蒙蔽一窍不通到基本逆向出其算法和vba函数的作用,可以说是值得的,下面就总结一下自己的收获:

一、逆向前的准备工作:

  1. 了解其是什么语言编写,然后去查该语言的逆向心得。比如,我这次是逆向 vba程序,其显著特点是一个变量占12个字节,前2个字节特征,后面4个字节才是真正的值。我刚开始晚上完全不懂,真的很蒙蔽,怎么弄怎么不对。第二天早上才有灵感一查才知道,还发现了前两个字节的特征,比如,是整数,则为0002,这是一定要吸取的教训。

二、逆向过程中的心得:

  1. 逆向的核心是搞懂函数作用+栈帧的分布:着重强调栈帧,这个可以说四个小时前我还一脸蒙蔽,睡觉前忽然才想起这个,真是,基础不牢,地动山摇啊。所有的局部变量都存储在栈帧中。我们之前着重分析函数,太多函数,各种寄存器绕的头晕,其实,寄存器只是一个中转站,最终还是存储在栈帧中,所以,我们弄清每一个栈帧具体表示的变量,之后看汇编代码会轻松很多。就算一个栈帧可能有多个情况,我们只需要在代码调用前查看其是哪种情况就好
  2. 函数分析
    1. 若OD中给出函数名,则先百度该函数名了解其作用。
    2. 获取参数,看函数调用前的栈帧。
    3. 少数函数通过寄存器传入参数,比如 __vbavarForInit 中 n 值通过 ebx 传入,而 __vbavarMove则是 edx->ecx,这些都是你应该要注意的。
    4. 了解传入的是地址还是指针,往往前面有 lea,则是指针,确切的办法是一个个参数浏览一遍。
    5. 调试函数时,多注意对比内存地址变化,有些传入的指针就是函数结构的存储地址,观察。
  3. 未来学习方向
    1. 先学好 OD 中的条件断点,比如某个内存改变,就断下来,这语法其实在调试过程中真的很方便,肉眼看真难受。
    2. 开始学 WINDOWS 的 PE结构,这是你需要明确的。

函数分析以及加密过程:

  1. 使用 vbaI4Var 将 i 的值 获取到寄存器 eax 中
  2. 利用存储在 eax中的 i 通过 rtcMidCharVar 获取 字符串特定的个字符(整个字符串存放在 [ebp-74])
  3. 通过 __vbaStrVarVal 函数获取该字符的ASCII码的内存地址 (直接指向该字符而不是字符变量)
  4. 通过 rtcAnsiValueBstr 获取该 ASCII码 值并保存在 eax 中(eax 直接存储着这个码)
  5. 通过 vbaVarAdd 函数实现 字符的ASCII码与 加密因子 64 相加
  6. 通过 rtcHexVarFromVar 来将计算结果转换为 UNICODE 形式
  7. 通过 _vbaBarCat 来将字符串连接在一起
    以上进行四次退出循环:
    得到的秘钥与用户的输入进行比较判断是否成立。

特征:

  1. 00000002 整数类型
  2. 00360008 字符串?字符? 指针类型

栈帧:
ebp - 24 整数 保存变量 i 的
ebp - 34 输入的密码 UNICODE形式
ebp - 44 指针 保存每次计算的UNICODE结果,A8" 第二次 “A8C9”,第三次 “A8C9DA”,最后用于比较
ebp - 74 指针 保存的字符串“Deverse”,
ebp - 54 指针 保存从 [ebp-0xac]获取的单个字符
整数 保存从 ebp - 9c 过来的add计算结果
ebp - 9c 整数 保存add的计算结果
指针 保存 add 计算结果的UNICODE 形式
指针 暂时保存CAT连接结果,最后送到 ebp-44
ebp - 0xac 整数 1. 保存每次获取的字符值 “D”、“e”、“v”、“e"的ASCII值
指针 2. 保存字符粘贴结果 即第一次 “A8” 第二次 “A8C9”,第三次 “A8C9DA”
ebp - DC 整数 保存加密因子 64
ebp - 134 整数 保存 i = i+t 的 t
ebp - 144 整数 保存 变量 n

Python 写的注册机:其实可以看出算法真的不难,但自己这水平,逆向起来就是另外一回事了。

strr = input("输入用户名")

i = 0
ans = ""
while i<4 :
    ans += str(hex(ord(strr[i])+0x64))
    i += 1

ans = ans.replace("0x", '').upper()
print(ans)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/OneTrianee/article/details/91991340

智能推荐

同桌的你之程序员版[摘]_weixin_33681778的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

linux简单常用命令及个人总结_Pippo_Liang的博客-程序员宝宝

1.命令提示符[[email protected] ~]#  : 其中root为当前用户名,localhost为主机名,~为当前所在目录,#超级用户提示符,$普通用户提示符。5.cd:进入目录        选项:~ 回到家目录 , - 回到上次目录 ,..回到上级目录  .进入当前目录2.ls [选项] [参数]:查看目录的内容。       选项 :-a 显示所有文件,包括隐藏文件,

JS 里的数据类型(一)_方小圆的博客-程序员宝宝

7种类型数值(Number),基本类型字符串(String),基本类型布尔(Boolean),基本类型null,基本类型undefined,基本类型symbol,基本类型数值JS内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。JS底层没有整数,所以某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转...

linux内核分析第五周-分析system_call中断处理过程_weixin_30532369的博客-程序员宝宝

本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程。实验原理:系统调用处理过程与中断处理的机制系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中。(软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。)INT 0x80 这条指令的执行会让系统跳转到一个预设...

CCNET+MSBuild+SVN实时构建的优化总结_weixin_30258027的博客-程序员宝宝

本文不是介绍如何使用CCNET+MSBuild+SVN构建自动编译系统,相关的内容可以从很多地方获取,可以再园子里搜一下。随着我们的SVN库日益壮大,容量达到10G,几十G 甚至更大时,我们发现自动构建速度越来越慢,直到有一天你发现入了很小一段代码却不得不等待几小时构建完成,程序员的忍受是有极限的,因此我们决定采取措施实施优化。首先,我们必须分析哪些因素导致了我们构建速度的减慢,罗列一下,...

GeoServer学习笔记-4、图层加载(WMSLayer详解)[email protected]柿子树的博客-程序员宝宝_wmslayer

官方API https://developers.arcgis.com/javascript/3/jsapi/wmslayer-amd.html#wmslayer1使用WMSLayer加载WMS服务有两种方式:方式一:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直接给WMS服务所在的URL地址,在visibleLayers参数中指定要加载的图层(命名...

随便推点

时间序列预测方法汇总:从理论到实践(附Kaggle经典比赛方案)_PaperWeekly的博客-程序员宝宝

作者 | Light学校 | 中国科学院大学研究方向 | 机器学习时间序列是我最喜欢研究的一种问题,这里我列一下时间序列最常用的方法,包括理论和实践两部分。理论部分大多是各路神仙原创的高...

windbg命令_ken_scott的博客-程序员宝宝

windbg命令linux下使用ulimit -S -c unlimited命令,可以使程序崩溃时生成core文件,使用gdb exec_file core_file就可以查看崩溃的程序,接着使用bt就基本可以定位触发崩溃的代码段windows下没有这么方便,但可以使用procexp和windbg来达到相同的目的,程序崩溃后,可以打开procexp,然后在procexp中选择崩溃的程序,右

斯坦福大学自然语言处理第三课“最小编辑距离(Minimum Edit Distance)”_绝对不要看眼睛里的郁金香的博客-程序员宝宝

一、课程介绍斯坦福大学于2012年3月在Coursera启动了在线自然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课:https://class.coursera.org/nlp/以下是本课程的学习笔记,以课程PPT/PDF为主,其他参考资料为辅,融入个人拓展、注解,抛砖引玉,欢迎大家在“我爱公开课”上一起探讨学习。课件汇

七宗罪之病态的加班_普通网友的博客-程序员宝宝

0 奇怪的事情王小宝今年刚刚大学毕业,经过两轮简单的面试之后,进入了本地一家拥有20多名研发人员的IT企业,终于成为了心目中一直崇拜、向往的程序员。第一天上班,起了个大早,怀着激动的心情,迈着坚实的步伐第一个来到公司,等了十来分钟后才有人过来开门,接着是安排工位、领取入职材料,员工相互介绍,加了公司的微信群,终于入座,松了口气,心里想着,以后我就要在这个地方发光发热了,大干一场了,对自己的第一...

ECMAScript新特性_爱笑的橘子的博客-程序员宝宝

本文章将要收集自ECMAScript2017开始的ECMAScript新特性1.ECMAScript20171.字符串追加:提供了两个字符串追加的方法 String.prototype.padStart 和 String.prototype.padEnd,方便我们将一个新的字符串追加到某个字符串的头尾。'someString'.padStart(numberOfCharcters [,stringForPadding]);'5'.padStart(10) // ' 5''5'.p

推荐文章

热门文章

相关标签