逆向工程与软件自我保护

 

 

 

实验相关背景介绍:

(侵权联系删除)

 

 

 

  1.  查找显示注册结果相关代码

 

首先尝试输入Sssss 55555 错误,弹框Bad boy。那么bad boy有关的代码就是注册结果相关代码。

之后用OllyDbg打开crack.exe。

查找所有参考文本子串。

双击 good boy(bad boy 也可)。

就找到了注册结果相关代码。

3.修改程序跳转

爆破方法一:修改跳转条件

JNZ 改为JZ

OllyDbg修改相关代码,汇编,F9运行,查看效果。

F9运行

爆破完成

 

使用Lordpe 查看crack的文件信息。点击sections。 .text节在V偏移,文件中偏移都为1000,所以节偏移为0。之后下图给出了文件偏移地址的计算公式。

010Editor工具打开crack。  地址10F9  750C (机器指令),与OD一致

改为jz后可见机器码为 740C

pe文件,改为74

 

 

运行

在下方数据窗口,右键查看可执行文件,可见地址10F9

 

 

爆破成功。

方法二编写注册机

  1. 查找显示注册结果相关代码

同方法一,不再赘述。

 

  1. 查找注册码验证相关代码

同方法一,不再赘述。

 

  1. 根据注册码验证代码编写注册机

我们在上面找到了验证相关代码,现在通过动态调试分析具体的验证过程。

在XOR(异或)  EAX,EAX F2下断点,F9运行。

弹窗,此时输入了name abcdeserial 12345.

之后F7单步运行,观察寄存器值和堆栈信息,分析验证过程。

 

单步运行可见ECX值变为abcdeEAX清零,EDX00001908

ECX值变为61”a”ascii

下方堆栈信息

执行完CALL语句就将输入的字符串转化为整型

循环计算对应的注册码,并判断输入的用户名长度是否合法(必须是5),否则有提示。

Arg3存储输入的nameArg2(ECX)存储计算得到的注册码

Arg4存储输入的注册码,字符串转换为整型后存到EAX

然后就是CMP EAX ECX

计算过程用C++形式表示如下

 

 

编写相关程序,编译运行,输入五位字符,就会计算出相应的注册码。如图所示。

输入name aaaaa,计算出其serial 978652603.

我们在crack程序验证,确实如此。于是就生成了注册码生成机。

阶段:软件反动态调试分析

 

 

  1. 分析CrackMe1.exe是如何通过父进程检测实现反OllyDbg调试的

 

OllyDbg打开,查看调用树。

在这里下断点,开始调试。

Ntdll是获取父进程idpushedi

获取父进程名字    GetModuleFileNmeExA

这里有关闭句柄操作。

5027FE

Je没有jump

Jmp 00502705

循环可以分为三个段。

前两个做大小写转换,第三个做比较

cmp19 判断是大写还是小写,是大写+20转化为小写

test eaxeax判断循环是否结束。结束跳转到502738

JE 相同的话跳转到2712继续循环比较后续字符 

 

一次比较后

c比较过了,就去掉。

 

 2. 分析除父进程检测外,该程序用到的反动态调试技术

该程序用到的关键函数还有

  1. 加壳脱壳深入理解

PEid检测CrackmeUPX,可以发现该程序是UPX方法加壳的。

OllyDbg打开运行,查看壳的加载过程。

 

409BF0pushad保存现场环境。

单步运行查看右下角堆栈信息。

F7单步运行查看加载壳的具体过程

完成后Popad弹出保存好的信息。

 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年4月22日
下一篇 2019年4月22日

相关推荐