逆向攻防的那点事

攻:

 用monkey将逆向的项目ipa导入其中,用hook你要重写或者修改的代码。


第一种防护:

创建类,在类中load方法中 fishhook 对 runtime的 method swizz 及 setIMP,getIMP函数进行替换,打入动态库,mokeyapp就不能hook了,


攻:

越狱手机中,用theos工具创建Tweak项目,tweak编辑plist需要hook的进程。hook中编写hook的方法,打入动态库。当程序启动时,苹果会通过plist找到进程,将动态库注入到项目中。


第二种防护:

在项目中other linker flags 增加 _RESTRICT _restrict,dyld有2种阻止动态库的代码,1,设置uid,gid,但是上线后是不允许改变,还一种就是dyld会遍历macho文件中_RESTRICT _restrict字段是否存在,存在就会阻止动态库的注入。


攻:

更改macho文件中的_restrict的二进制字段。


防:

通过第一种防护,另外通过dyld的阻止方法可以判断macho中是否存在_restrict,如果不存在,则程序退出。


防止别人调试:

通过syscls可以获取当前进程是否被操作,通过与操作获取控制码。

通过prace 有个拒绝连接(PT_DENY_ATTACH),如果有直接闪退。(支付宝就是这样进行防护的)。


攻:

首先在monkey中增加一个符号(prace或者syscls)断点,bt获取其地址,再imagelist获取指令的动态库首地址,算出偏移地址,再找到app中的防护动态库中的可执行文件,用hopper打开,找到算出来的偏移地址(获取的偏移地址是指向下一条指令)。对此函数的汇编代码进行修改后导出,直接将前三段bl跳转到倒数后三段,即跳过你防护的代码。如果是fishhook改变runtime的method swizz,改变汇编获取常量的偏移地址。


防:

1.代码混淆,在pch文件中对需要防护的类名及方法名用宏定义,对方用hopper及ida对macho文件是很难找不到其方法名及方法。

2.字符串加密,将字符串放到char数组中最后加上\0,并对每个字符进行异或操作,然后再char数组再进行一次异或回来。

3.隐藏CCCrypt,加密都会用到此函数,通过dlopen获取句柄(第一个参数是CCCrypt动态库路径,第二个参数以懒加载形式RTLD_LAZY),通过dlsym(第一个参数是句柄,第二个是字符串“CCCrypt”,此字符串需要用第二个字符串加密)将CCCrypt结构体替换成自己写的结构体。

4.使用汇编进行系统调用,防止符号断点调试进行定位汇编代码。通过asm链接汇编代码,通过汇编代码svc  #0x80触发中断。通过syscall头文件找到底层函数名对应的定义数值。如prace汇编

asm(

 "mov x0,#31\n"

 "mov x1,#0\n"

 "mov x2,#0\n"

 "mov x3,#0\n"

 "mov w16,#26\n"//26就是prase,上面四个是传入的参数

 "svc  #0x80"//触发中断

)

5.重签名防护 ,描述文件的组织单位,通过字符串截取出来进行比较,此方法把前四种全部加进去进行防护,对方很难进行逆向项目的。

6.利用防护工具,LLVM进行逻辑混淆,防止classDump。

你可能感兴趣的:(逆向攻防的那点事)