实验相关背景介绍:
(侵权联系删除)
- 查找显示注册结果相关代码
首先尝试输入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
爆破成功。
方法二:编写注册机
- 查找显示注册结果相关代码
同方法一,不再赘述。
- 查找注册码验证相关代码
同方法一,不再赘述。
- 根据注册码验证代码编写注册机
我们在上面找到了验证相关代码,现在通过动态调试分析具体的验证过程。
在XOR(异或) EAX,EAX 处F2下断点,F9运行。
弹窗,此时输入了name abcde,serial 12345.
之后F7单步运行,观察寄存器值和堆栈信息,分析验证过程。
单步运行可见ECX值变为abcde,EAX清零,EDX00001908
ECX值变为61,”a”的ascii值
下方堆栈信息
执行完CALL语句就将输入的字符串转化为整型
循环计算对应的注册码,并判断输入的用户名长度是否合法(必须是5位),否则有提示。
Arg3存储输入的name。Arg2(ECX)存储计算得到的注册码
Arg4存储输入的注册码,字符串转换为整型后存到EAX
然后就是CMP EAX ECX
计算过程用C++形式表示如下
编写相关程序,编译运行,输入五位字符,就会计算出相应的注册码。如图所示。
输入name aaaaa,计算出其serial 为978652603.
我们在crack程序验证,确实如此。于是就生成了注册码生成机。
第二阶段:软件反动态调试分析
- 分析CrackMe1.exe是如何通过父进程检测实现反OllyDbg调试的
OllyDbg打开,查看调用树。
在这里下断点,开始调试。
Ntdll是获取父进程id,push到edi
获取父进程名字 GetModuleFileNmeExA
这里有关闭句柄操作。
5027FE
Je没有jump。
Jmp 00502705
循环可以分为三个段。
前两个做大小写转换,第三个做比较
cmp19 判断是大写还是小写,是大写+20转化为小写
test eax,eax判断循环是否结束。结束跳转到502738
JE 相同的话跳转到2712继续循环比较后续字符
一次比较后
c比较过了,就去掉。
2. 分析除父进程检测外,该程序用到的反动态调试技术
该程序用到的关键函数还有
- 加壳脱壳深入理解
用PEid检测CrackmeUPX,可以发现该程序是UPX方法加壳的。
用OllyDbg打开运行,查看壳的加载过程。
409BF0pushad保存现场环境。
单步运行查看右下角堆栈信息。
F7单步运行查看加载壳的具体过程
完成后Popad弹出保存好的信息。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!