注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

碳基体

http://weibo.com/tanjiti

 
 
 
 
 

日志

 
 

objective-c runtime安全措施之一:反调试  

2012-04-01 11:12:25|  分类: iOS app security |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
<<O'Reilly.Hacking.and.Securing.iOS.Applications>>读书笔记

反调试:检查是否有debuggertrace游戏进程 (预防动态调试进程)

方法1: 检查进程的状态是否为 P_TRACED 

原理:当进程被调试的时候,内核自动设置进程选项为P_TRACED。因此可以通过检查该标记来确认是否被调试

例子1check_debugger()

#include <unistd.h>

#include <sys/types.h>

#include <sys/sysctl.h>

#include <string.h>

static int check_debugger( ) __attribute__((always_inline));

int check_debugger( )

{

size_t size = sizeof(struct kinfo_proc);

struct kinfo_proc info;

int ret, name[4];

memset(&info, 0, sizeof(struct kinfo_proc));

name[0] = CTL_KERN;

name[1] = KERN_PROC;

name[2] = KERN_PROC_PID;

name[3] = getpid();

if (ret = (sysctl(name, 4, &info, &size, NULL, 0))) {

return ret; /* sysctl() failed for some reason */

}

return (info.kp_proc.p_flag & P_TRACED) ? 1 : 0;

}

【注意】

1. 为了让程序以inline方式编译,需要设置编译器的优化选项,-0z(函数以inline方式编译),-fast(加快编译速度)

2. 为了避免sysctl被替换,需要在调用该函数前验证其完整性(在下面会介绍如何验证sysctl函数完整性)

--------------------------------------------------------------------------------------------------------------------------------------------------

方法2:调用ptrace请求来检查进程是否被调试

原理,调用ptrace请求的PT_DENY_ATTACH方法。使用该方法后,下面两种情况都会导致调试器崩溃,应用退出。

1)如果应用使用调试器来运行,调试器会崩溃;(下面以调试iTunes为例)

$ gdb -q /Applications/iTunes.app/Contents/MacOS/iTunes

Reading symbols for shared libraries .................................... done

(gdb) r

Starting program: /Applications/iTunes.app/Contents/MacOS/iTunes

Reading symbols for shared libraries ++++++++++++++++++++++++++++++....++++

+....................................................................................

............................................................... done

Program exited with code 055.

(gdb)

2)如果应用运行中,使用调试器,调试器也会崩溃。

$ gdb -q -p 3933

Attaching to process 3933.

Segmentation fault: 11

 

Mac OS X系统中

#include <sys/ptrace.h>

int main( ) {

ptrace(PT_DENY_ATTACH, 0, 0, 0);

...

}

iOS系统中

int main( ) {

ptrace(31, 0, 0, 0); //因为PT_DENY_ATTACH只存在于iOS模拟器头文件中,所以用31来代替

...

}

【注意】

1. ptrace方法可以通过打断点的方法绕过,如下所示:

# gdb ?1 ./main

Reading symbols for shared libraries . done

(gdb) b ptrace

Function "ptrace" not defined.

Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (ptrace) pending.

(gdb) commands

Type commands for when breakpoint 1 is hit, one per line.

End with a line saying just "end".

>return

>continue

>end

(gdb) run

Starting program: /private/var/root/main

Reading symbols for shared libraries .............................. done

Breakpoint 1 at 0x342afa98

Pending breakpoint 1 - "ptrace" resolved

Breakpoint 1, 0x342afa98 in ptrace ()

I'm doing something really secure here!!

2.由于可能被攻击者绕过该方法的调用,在应用的多处增加ptrace函数会提高应用的安全性


  评论这张
 
阅读(2097)| 评论(1)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017