ios逆向笔记之反调试 以及反反调试 和反反反调试 ptrace篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios逆向笔记之反调试 以及反反调试 和反反反调试 ptrace篇相关的知识,希望对你有一定的参考价值。

参考技术A 1.ptrace(process trace进程跟踪)

为了方便软件的开发和调试 ,UNIX早期版本就提供了一种对运行进程进行跟踪和控制的手段,那就是系统调用ptrace.通过ptrace可以实现对另一个进程实现调试和跟踪.同时,ptrace提供了一个非常有用的参数,那就是PT_DENY_ATTACH,这个参数用于告诉系统阻止调试器依附

我们创建一个mac项目 因为ptrace在iphone上不提供头文件

/*

 * Copyright(c)2000-2005 Apple Computer,Inc. All rights reserved.

 *

 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@

 *

 * This file contains Original Code and/or Modifications of Original Code

 * as defined in and that are subject to the Apple Public Source License

 * Version 2.0(the 'License'). You may not use this file except in

 * compliance with the License. The rights granted to you under the License

 * may not be used to create,or enable the creation or redistribution of,

 * unlawful or unlicensed copies of an Apple operating system,or to

 * circumvent,violate,or enable the circumvention or violation of,any

 * terms of an Apple operating system software license agreement.

 *

 * Please obtain a copy of the License at

 * http://www.opensource.apple.com/apsl/ and read it before using this file.

 *

 * The Original Code and all software distributed under the License are

 * distributed on an 'AS IS' basis,WITHOUT WARRANTY OF ANY KIND,EITHER

 * EXPRESS OR IMPLIED,AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,

 * INCLUDING WITHOUT LIMITATION,ANY WARRANTIES OF MERCHANTABILITY,

 * FITNESS FOR A PARTICULAR PURPOSE,QUIET ENJOYMENT OR NON-INFRINGEMENT.

 * Please see the License for the specific language governing rights and

 * limitations under the License.

 *

 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@

 */

/* Copyright(c)1995 NeXT Computer,Inc. All Rights Reserved */

/*-

 * Copyright(c)1984,1993

 *    The Regents of the University of California.  All rights reserved.

 *

 * Redistribution and use in source and binary forms,with or without

 * modification,are permitted provided that the following conditions

 * are met:

 * 1. Redistributions of source code must retain the above copyright

 *    notice,this list of conditions and the following disclaimer.

 * 2. Redistributions in binary form must reproduce the above copyright

 *    notice,this list of conditions and the following disclaimer in the

 *    documentation and/or other materials provided with the distribution.

 * 3. All advertising materials mentioning features or use of this software

 *    must display the following acknowledgement:

 *    This product includes software developed by the University of

 *    California,Berkeley and its contributors.

 * 4. Neither the name of the University nor the names of its contributors

 *    may be used to endorse or promote products derived from this software

 *    without specific prior written permission.

 *

 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

 * ANY EXPRESS OR IMPLIED WARRANTIES,INCLUDING,BUT NOT LIMITED TO,THE

 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

 * FOR ANY DIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,OR CONSEQUENTIAL

 * DAMAGES(INCLUDING,BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS

 * OR SERVICES;LOSS OF USE,DATA,OR PROFITS;OR BUSINESS INTERRUPTION)

 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,WHETHER IN CONTRACT,STRICT

 * LIABILITY,OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY

 * OUT OF THE USE OF THIS SOFTWARE,EVEN IF ADVISED OF THE POSSIBILITY OF

 * SUCH DAMAGE.

 *

 *    @(#)ptrace.h    8.2(Berkeley)1/4/94

 */

#ifndef _SYS_PTRACE_H_

#define _SYS_PTRACE_H_

#include <sys/appleapiopts.h>

#include <sys/cdefs.h>

enum

    ePtAttachDeprecated __deprecated_enum_msg("PT_ATTACH is deprecated. See PT_ATTACHEXC")= 10

;

#define PT_TRACE_ME    0      /* child declares it's being traced */

#define PT_READ_I      1      /* read word in child's I space */

#define PT_READ_D      2      /* read word in child's D space */

#define PT_READ_U      3      /* read word in child's user structure */

#define PT_WRITE_I      4      /* write word in child's I space */

#define PT_WRITE_D      5      /* write word in child's D space */

#define PT_WRITE_U      6      /* write word in child's user structure */

#define PT_CONTINUE    7      /* continue the child */

#define PT_KILL        8      /* kill the child process */

#define PT_STEP        9      /* single step the child */

#define PT_ATTACH      ePtAttachDeprecated    /* trace some running process */

#define PT_DETACH      11      /* stop tracing a process */

#define PT_SIGEXC      12      /* signals as exceptions for current_proc */

#define PT_THUPDATE    13      /* signal for thread# */

#define PT_ATTACHEXC    14      /* attach to running process with signal exception */

#define PT_FORCEQUOTA  30      /* Enforce quota for root */

#define PT_DENY_ATTACH  31

#define PT_FIRSTMACH    32      /* for machine-specific requests */

__BEGIN_DECLS

int    ptrace(int _request,pid_t _pid,caddr_t _addr,int _data);

__END_DECLS

#endif  /* !_SYS_PTRACE_H_ */

2.写入函数

/**

 arg1:ptrace要做的事情

 arg2:要操作进程的ID

 arg3(地址)\arg4(数据):取决于arg1

 */

    ptrace(PT_DENY_ATTACH,0,0,0);

然后我们来Xcode调试发现进程断开了 这样就做到了防止调试

思考 :

我们首先思考下 ptrace是系统函数 我们hook系统函数的fishhook刚好可以解决这个问题 那么我们接下来我们hook这个ptrace这个函数

1).我们新建一个动态库

为了防止被其他人注入动态库hook我的函数 我可以自己注入动态库先调用ptarce

这里要注意一点 

1)工程优先加载自己工程的动态库 

2)然后加载注入的动态库 按照添加编译的顺序执行

3)最后加载我们的target 按照添加编译的顺序执行

按照这个原理我们就可以防止别人注入动态库

Crimsonland 血腥大地 逆向无敌通关分析报告配置文件加密Dll隐藏MD5检测补丁反调试函数反反调试

 

一、工具及游戏介绍

 使用工具:Ollydbg,PEID,Beyond Compare,Cheat Engine

实现功能:无敌,全部通关。

 

Crimsonland 血腥大地

技术分享图片

技术分享图片

 技术分享图片

二、实现无敌:

 使用CE查找全局变量。

无敌成功。

 

技术分享图片

三、通关:

1、文件对比

原始关卡: 

 

技术分享图片

   

这里先采用上一篇文章的方法。

渡者方案2:通过文件资源管理器的时间排序,来找到最后修改的文件,确定配置文件。

游戏过关,并查看文件资源管理器。

 

技术分享图片

   

替换未过关的game.cfg文件,发现关卡回到了之前,可以确定是game.cfg文件

这里保存了未过关的game.cfg game2.cfg

和 过关的 game3.cfg game4.cfg

 

技术分享图片

   

进行两两对比。

game.cfg game2.cfg

 

技术分享图片

   

game3.cfg game4.cfg

   

技术分享图片

 

技术分享图片

   

用010Editor查看。

经过两两比较并多重测试,确定跟关卡相关是这几个点,暂且叫做关卡数据点。

当 关卡数据点 或者 非关卡数据点 的数据改变时,后面方框内的两组数据都会变,且变化无规律。

个人猜测:两组数据类似于对文件的数据计算,类似于哈希值算法。

接下来只能动用OD了。

 2、OD调试

2.1、查壳

很可惜,没加壳。

以下PEID 和 OEP特征可验证无壳:

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

2.2、下断

先查找字符串,在调用字符串资源的地方下断。

再在一些文件操作函数下断。

 

技术分享图片

   

技术分享图片

   

首先在字符串资源地方断下。

并找到了 字符串拼接路径 函数。

 

技术分享图片

 

技术分享图片

   

技术分享图片

   

猜测接下来调用CreateFile,果然。

   

技术分享图片

2.3、追踪关键代码

栈回溯返回用户界面,查看文件句柄。

   

技术分享图片

   

F9接下来是ReadFile

 

技术分享图片

 

显而易见:

在游戏运行时 就已经读取文件game.cfg到内存了。

此时ReadFile的Buff是配置文件的缓冲区。

目标:从Buff下手,追踪修改数据的关键代码。

2.4、继续追踪

重复以上步骤,确认逻辑正确,现在句柄是0x190

   

技术分享图片

   

技术分享图片

   

在此块内存上设置内存访问断点

   

技术分享图片

   

 对断下来的地方进行分析

 

技术分享图片

   

技术分享图片

   

retn出函数后,似乎进入了循环,但这里只执行一次,把缓冲区的首个字节拷到483220地址上。

暂且把483220处的内存命名为 缓冲区2

 

技术分享图片

技术分享图片

技术分享图片

   

跳到的一个地方,往下执行,直到调用函数,拷贝完接下来的267个字节。 

 

技术分享图片

技术分享图片

   

往下分析,发现把存放 缓冲区缓冲区2地址都加到了末尾。

   

技术分享图片

   

接下来,按道理来说:跟踪数据,查看数据头部是否被修改,数据尾部是否增加。

   

技术分享图片

技术分享图片

   

但这里 直接再下一次内存断点,这次往缓冲区2【483220】处下内存写入断点

断下的地方证明了猜想,执行指令 往存放 缓冲区2 地址加4,也就是说 缓冲区2 总共预定存放0x268+0x4 == 0x26C 个字节。

 

技术分享图片

 

我们再看看配置文件字节数,正好是0x26C个字节,正好吻合

 

技术分享图片

 

 2.5、锁定关键代码

再继续分析,真正进入了一个大循环,且不断循环执行。

推断是解密算法。

   

技术分享图片

   

直接循环后,查看 缓冲区2 【483220】结果:

   

技术分享图片

 

2.6、OD RUN跟踪

进一步验证,分析循环次数。

此处循环判断是CMP ESI 0x10B18

通过ESI的数值判断。

 

技术分享图片

   

由图可知比较esi来判断循环结束,esi算法复杂。

直接采用Run跟踪。

   

技术分享图片

技术分享图片

   

全局统计循环了 616次,

616 == 0x268,正好是拷贝的0x268个字节。

实际应该是0x26C个字节,那末尾的四个字节呢?

带着疑问继续跟踪。

   

技术分享图片

   

发现此处指令往数据末尾写入4个字节,正好凑齐0x26C个字节,Perfect。

 

技术分享图片

技术分享图片

   

2.7、总结与实施方案

 解密了0x268个字节,解密后,再写入四个无加密字节。

最后四字节是此处代码生成,写进文件中会覆盖掉原数据,所以后续操作中不用考虑。

   

所以得出结论:此处就是解密算法 。

所以可以肯定的是 配置文件数据的确经过加密。

 

往下分析,写入文件时,遇到加密算法

   

技术分享图片

   

解决方案:

  1. 由经过解密算法后的配置文件可以看出,头个字节就是关卡数,所以经过算法修改首个字节就行。
  2. 直接去掉程序算法,配置文件以原样数据保存。再修改配置文件。
  3. 逆算法,写一个翻译器。

   

本文选择高端而又简洁一点的操纵,第二种。

此处直接NOP掉算法代码。

   

四、路途曲折与反反调试

本文的最高潮来了。

1、出师不利

就在我修改完代码,保存文件,满怀期待地 双击运行的时候,弹出了这个小框框:

 

技术分享图片

 

说实话,当初这东西对我地信心打击不小呀,但秉着不气馁不认输地倔强脾气,决定继续分析。

但得先思考思考,猜测是exe模块内存方面的反调试,类似于模块的哈希值。

 

 首先,既然弹框,往MessageBox上下断点。然后往上回溯。

可以看到弹框的关键跳转。

   

技术分享图片

   

往上分析,弹框的条件取决于此函数返回的EAX值。

   

技术分享图片

   

1. 跟进函数,发现LoadLibrary加载grim.dll后返回EAX为零值。

2. 为了进行比较,打开正常游戏,跟到此处,LoadLibrary加载grim.dll后返回却为正常值。

 

技术分享图片

 

1. 分析下面发现后面还jmp 隐藏调用了grim.dll里的GRIM_GetInterface函数。

2. 此处为什么要隐藏调用。虽然这一点在文章后面用不上,但猜测是其它功能破解的线索,所以晒出来,以后或许用得上。

 

技术分享图片

 

总结一下:

正常情况下,加载grim.dll后是有正常返回值的。

当修改了指令也就是模块内存后,保存exe,运行,加载grim.dll后返回空值,导致函数调用失败,外部EAX返回值使弹出MessageBox程序运行失败。

LoadLibrary —失败—>> 函数 —失败—>> EAX返回值 —导致—>>弹出MessageBox 程序运行失败

 

推测是程序 再次打开exe进程,校验模块内存,所以在进程相关函数下断。特别是CreateProcess

但从程序开始运行到弹窗,无一次断下。

2、峰回路转

不是模块内存,又必须对字节进行校验,剩下的可能,推测是进行了磁盘文件校验。

验证:用正常exe打开游戏进程后,替换dump的exe,发现依然存在错误,可以推断不是依靠进程内存判断的,而是通过磁盘文件

在CreateFile、ReadFile下断点。并进行参数过滤。

   

技术分享图片

   

技术分享图片

   

技术分享图片

   

查看ReadFile的Buff,的确读取的游戏exe文件。 

   

技术分享图片

   

ReadFile一次读取0x1000个字节,需要调用多次。

 

接下来要找到反调试的关键代码。

回溯:找到调用ReadFile的循环。

 

技术分享图片

3、直击敌营

分析到这里就可以一口气开干了。

逆向分析代码:

目的:分析出算法计算最后得出的值,值的传递,并与谁比较。

   

技术分享图片

   

分析可以得出此算法是计算文件的哈希值【MD5】

并拿计算好的MD5原MD5进行比较。 

 

技术分享图片

   

进行修改指令,dump grim.dll即可。

 

技术分享图片

   

再替换原有的游戏exegrim.dll。

 

技术分享图片

   

成功。

 

技术分享图片

   

最后一步:

修改配置文件

   

可以看出修改后的exe用WriteFile写出来的配置文件 清晰明了。

 

技术分享图片

 

技术分享图片

4、大获全胜

通关成功。

技术分享图片

   

 

个人总结:灵活运用硬件断点、内存断点、栈回溯。

硬件断点和内存断点

硬件断点能快速定位关键点

方便,但逻辑较乱

栈回溯

栈回溯能顺藤摸瓜

需要耐心,但逻辑清晰

 

附件: 

 Crimsonland_血腥大地_外挂文件

 

 KID

以上是关于ios逆向笔记之反调试 以及反反调试 和反反反调试 ptrace篇的主要内容,如果未能解决你的问题,请参考以下文章

逆向分析反调试程序

C++ 反反调试(TLS回调函数)

IDA动态调试破解AliCrackme与反调试对抗

IDA动态调试破解AliCrackme与反调试对抗

Android签名验证与反调试机制的对抗技术

Android签名验证与反调试机制的对抗技术