推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

解决应用的反调试方案解析(修改IDA调试端口修改内核信息)

   2023-08-04 网络整理佚名2120
核心提示:首先来看看如何解决之前提到的利用检查IDA调试端口23946这个反调试方案。的确修改成功了,下面我们把拷贝到设备中运行,看看端口是否为221(0xDD):这种方式是为了解决现在常用的反调试策略,就是轮训检查进程的值,所以我们需要修改设备的boot.第二:对于监听IDA端口反调试,通过修改的启动端口,这里也学会了如何修改端口号操作。

点击上方蓝色字“Code ”关注公众号

一、简介

在上一篇文章中,我们详细介绍了现阶段可以采取的几种反调试策略。 我们在破解逆向应用的时候,通常都会回去解决第一步的反调试,否则后面的步骤就无法进行。 当然,如果你是静态分析就没有必要获取了。 但有时需要使用动态调试来破解,所以需要进行操作。 现阶段的反调试策略主要有以下几种方法:

那么本文将通过几种方式来讲解如何解决这些反调试方案。

2.方法总结

第一种方法:找到关键方法,注释掉代码

该方法需要对代码进行静态分析,找到关键方法对反调试代码功能进行注释。 该方法可以应对上述所有反调试方案,但不适合轮训检查。 为什么? 因为如果你看过这篇文章:脱掉360加固应用保护壳; 操作过的同学会发现去掉反调试功能的时候很痛苦。 所以这种注释代码,我个人认为只适合下面的反调试:

首先添加自己的进程

这样就可以用IDA打开密钥so代码,找到这个代码:(,0,0,0),然后nop即可。 这并不难,因为只有一行代码,说白了就是几条arm指令。 IDA 静态分析也毫无压力。

二、签名验证

这个在之前的文章中已经介绍过。 不了解的同学可以查看这篇文章:中途破解应用程序的签名验证逻辑; 最后总结了一个比较简单的过滤签名验证的方法:先在Jadx中打开应用程序后,全局搜索字符串的内容:“”,这样可以定位到获取应用程序签名信息的地方,然后跟踪验证依次放置。 找到具体的地方代码,直接评论。 但如果服务器端交互信息中携带有签名验证,并且其中有签名验证,则需要进行额外的操作。 这部分知识点后面会单独写一篇文章详细介绍如何破解。

三、调用系统api判断当前应用是否处于调试状态

这样我们可以看到我们实现的逻辑比较简单,直接调用系统的.os.Debug.()方法并判断当前应用程序属性:.,那么仍然可以使用全局搜索反编译的应用程序内容找到这部分内容,然后直接注释掉代码。

第二:修改IDA通讯端口

经过以上分析,直接使用静态模式+注释代码功能即可解决上述三种反调试方案。 但还有两个没有解决,下面详细介绍一个非常可靠、方便、永久的方法。 而这部分正是本文的重点。 首先我们来看看如何通过检查IDA调试端口23946来解决前面提到的反调试方案。这个思路其实很简单,因为你检查的端口号是默认的23946,所以如果我们可以改变这个端口数字改为其他值,那么它实际上就被解决了。 修改这个端口号也比较简单:网上有一个支持自定义端口号的解决方案。 命令很简单:./ -; 直接添加-p参数即可。 请注意,端口号和参数之间没有空格:

有人说这个方法这么简单,下面就不介绍了。 当然不是,我写的目的不是为了简单,而是为了让大家了解更多。 。 而且上述方法每次都要加上-p,比较麻烦。 我想用另一种方法一次性解决这个问题。 同时我想在这个过程中熟悉一下IDA的使用,并使用IDA来打开文件。 其实他是elf格式的,打开无压力,打开后使用Shift+12查看字符串内容界面:

要找到这三个关键字符串内容,我们可以通过运行过去后的提示信息来检测:

找到这三个字符串的内容,下面就简单了,一一修改,双击字符串条目的内容:

选择并按X键切换:

选择第一个跳转到arm指令:

这是图表视图,可以使用空格键切换:

我看到了arm命令,LDR R5,=; 其中十进制为23946,这是默认的端口号,所以这里我们只需要将这个arm命令改为MOVS R5,#0xDD; R5可以重新分配,这里分配的是DD,即221; 这里有一个小问题就是如何修改,IDA可以切换到Hex View视图来修改和编辑二进制文件,但是这个修改不会在源文件中生效,所以我们这里要使用一个二进制编辑器工具,之后我们用这个软件打开,使用Ctrl+G直接跳转到指定地址,使用Ctrl+F跳转到搜索内容,记住下面两个快捷键。

这里可以看到99 4D是:LDR R5,=对应的是命令的十六进制值。 对于命令和十六进制值之间的转换,可以在网上搜索一个小工具。 我们要把它变成MOVS R5,#0xDD指令,对应的十六进制为:DD 25,其中DD为立即数,25代表MOVS R5指令。 所以可以直接修改如下:

修改完成后,直接保存即可,这样我们就修改了一点,并且有两个操作是完全一样的:

继续修改,命令是一样的,记住地址:B98A,就去修改:

然后继续修改IDA 32位...

记住地址:B64C,修改即可:

这样,我们就全部改完了,保存文件,再次用IDA打开,找到一个地方查看是否修改成功:

确实,修改成功了。 让我们将其复制到设备并运行它以查看端口是否为 221 (0xDD):

这里可以看到已经修改成功了,监听端口也改变了。 打开IDA连接时需要注意端口是221而不是23946,或者可以使用adb tcp:221...命令转发!

第三种方法:修改boot.img文件,跳过反调试

这个方法是为了解决常用的反调试策略,就是轮流检查进程的值,所以我们需要修改设备的boot.img文件,直接把这个值写入0。关于如何修改操作,雪上已经有大佬讲解了非常详细的过程。 我是按照这个流程来操作的:因为每个设备的boot.img都不一样,所以操作过程中可能会遇到很多问题。 ,那么我来解释一下我在操作过程中遇到的问题,顺便简单说一下步骤:

第一步,你要有一个可以折腾的root手机

因为我现在在玩boot.img,后面还得刷机,所以你就得造一个你认为没有意义的设备,哪怕是变砖了。 当然,一般不会变成砖头。

第二步:在根环境中解压内核文件

这里我使用的是三星note2设备,并且刷了CM4.4系统。 根据大神的帖子,首先找到系统启动的文件位置。 这个路径一定要注意:/dev/block//[每个设备目录都不相同]/by-name; 每个设备的目录下的子目录都不同,所以需要注意检查你的设备目录的名称,然后输入by-name,使用ls -l命令查看详细信息,找到一个BOOT项,记住链接的路径地址,这里是/dev/block/,然后使用命令导出boot为boot.img

dd if=/dev/block/ of=/data/local/boot.img

adb pull /data/local/boot.img boot.img

这里可能有些人会遇到问题。 当看到多个BOOT,比如BOOT1、BOOT2时,可以在这里选择BOOT,有的人会发现没有这个选项,所以只能在其他系统中操作。

步骤3:使用.exe工具解压boot.img文件

稍后我会给出这个工具的压缩包,命令用法很简单,

解压后为:.exe ---boot boot.img

压缩包为:.exe ---boot

这里有一个坑,我找到了两个版本,第一个版本的工具运行后总是黑屏无法启动,最后找到了第二个版本的工具成功了。 其实这些工具的原理很简单,只是解析boot.img文件格式,因为boot和image并不是一个完整的文件系统,它们是自定义的文件格式,其中包括一个2K的文件头,后面是Next是 gzip 压缩的内核,后面是 ,后面是第二阶段加载程序(此加载程序是可选的,在某些映像中可能不存在):

我们想要的是内核信息。 那么使用这个工具进行操作后,你会发现有几个目录和文件:

解压后有一个文件,这个是内核文件,.gz是释放到设备目录即目录下的内容,输入查看内容:

看,这就是最终设备的目录结构。 可以看到有init.rc启动文件、.prop配置文件等

接下来我们对内核文件进行特殊处理:将该文件复制为.gz文件,使用工具,Ctrl+F快捷键查找十六进制内容1F 8B 08 00,找到前面的全部数据为删除,这样.gz文件就变成了标准的gzip压缩文件,这样就可以解压了。 命令:.gz; 此时我们最终要处理的文件就是解压后的文件。

第四步:IDA打开内核文件进行修改

有了上一步得到的内核文件,直接用IDA打开即可,不过打开时需要注意设置选项:

然后将起始地址设置为:

为什么在这里设置这个起始地址,因为Linux启动内核的地址是; 打开后,我们可以直接Shift+F12查看字符串的内容,因为我们要改变值,所以直接搜索字符串“”值:

双击进入,这时候我们可以记下这个地址,然后减去我们刚才的偏移地址:

也就是说-=,这里不像看雪大神的操作那么复杂,先定位到函数位置,修改指令,因为每个设备不一样,指令代码不一样,不通用,所以这里更好的解决方案是:直接改变格式字符串值,原来的格式字符串内容为:

\t%s\nTgid:\t%d\nPid:\t%d\nPPid:\t%d\:\t0\t\nUid:\t%d\t%d\t%d\t%d \nGid:\t%d\t%d\t%d\t%d\n

这里应该使用C语言中的占位符%d来填充值,那么我们可以将该项的占位符%d更改为'0',但是'%d'是两个字符,所以我们可以将其更改为'00 '、或'0\t'、或'0\n'; 只要修改后的字符串内容对齐即可。 这样,这一项的值占位符就会失效,值永远是0。而上面计算出来的地址就是我们要操作的地址,打开文件用Ctrl+G跳转到:

这里我们将其改为‘0\t’的值,对应的十六进制值为:30 09; 这样我们就修改成功了。

步骤5:生成修改后的boot.img文件

这里的操作实际上是一个逆过程。 首先使用 gzip 命令压缩上面修改后的内核文件: gzip -n -f -9 ; 然后用压缩后的.gz二进制数据覆盖1F 8B 08 00处的原文件(写回时不能改变原文件的大小和原文件后面的内容,否则会很麻烦)。 此时就获取到了新的文件内容。 这里需要强调一下,就是我踩过的坑:比如原来的大小是10M,之前删除的是1M,修改后的.gz大小是8M,所以当我们回写覆盖的时候,必须在1M~9M的位置,并且前1M的内容和后1M的内容不能以任何方式改变。 如果输入错误,刷机机将无法启动。 我用一个我操作过的案例来解释一下:

这是我修改的压缩.gz 文件。 最后的数据是,然后选择所有内容并复制。 记住后,转到原来的内容:

中的位置是,那么我们需要从这里替换刚刚分配的内容,到哪里结束呢? 只需添加这两个地址即可:+=; 也就是说,到最后:

这样一来,原来的内容大小肯定不会改变,而且永远都是,所以在替换内容的时候,内容一定不能改变。 替换完成后,用新文件替换原文件,并使用上面提到的.exe工具生成新的boot.img文件。

第六步:刷boot.img文件

这里有一个坑,刷机时使用该命令,但遇到最多的问题就是这个错误:

这是因为设备尚未激活。 每个设备的操作都不同。 比如小米采用的是电源键+音量下键,三星采用的是音量下键+HOME键+电源键; 您可以在线搜索特定设备。 进入界面后,再次运行:

闪存启动 boot-new.img

然后运行后重新启动设备。 有的同学在操作时,总是无法进入,导致命令运行不正确。 如果无法解决,请尝试使用其他手机。

这时候我们启动设备,然后调试一个app,发现它的值一直是0,因为我之前改成了一串‘00’,也是可以的:

因为感觉不规则,所以改成了‘0\t’的值。 这一切都有可能。

注意:一定要保存原来解压的内核文件boot.img。 当你的设备变砖而无法启动时,你可以刷回原来的boot.img!

3、内容延伸

不知道大家有没有看过这篇文章:去掉360加固应用的保护壳。 当时我提到了一个工具mprop,它可以重写ro的值。 属性在系统内存中,这样我们就不需要每次都反编译应用程序。 然后在 .xml 中添加 : = "true" 以使应用程序可调试。

当时据说这个工具有一个缺点,就是只能修改内存中的值,而且设备重启后就失效了。 现在我们可以让它永久有效。 事实上,这个属性值就在系统根目录下的.prop文件中。 是的,当设备启动时,它会被解析并存储在内存中。 所以如果我们可以把这个文件中的值修改为1,那么它将永久有效。 上面解压 boot.img 时,我们提到有一个目录。 事实上,.prop 就在这个目录中:

这里我们直接改成1,因为我们已经修改了boot.img的操作,所以我们也顺便把这个函数改一下。 多么方便啊!

四、提取内核操作总结

步骤1:设备root后,查看设备的内核文件路径:cd /dev/block//[check ]/by-name,然后使用命令ls -l查看启动属性,记住小路

步骤2:dd if=/dev/block/[你的内核路径] of=/data/local/boot.img

adb pull /data/local/boot.img boot.img

第三步:使用.exe工具解压boot.img; 拿到文件,将该文件复制为.gz文件,使用工具,Ctrl+F快捷键查找十六进制内容1F 8B 08 00,找到后,删除之前的所有数据,这样.gz文件成为标准的gzip压缩文件,这样就可以解压了。 命令:.gz

第四步:使用IDA打开内核文件,记得设置选项和起始地址:; 打开后,使用shift+F12查找字符串“”值,记住文件起始地址,然后相减; 打开内核文件之前,Ctrl+G跳转到该地址,修改内容,将占位符'%d'改为'0\t'并保存

步骤5:首先使用gzip命令压缩修改后的内核文件: gzip -n -f -9 ; 然后用压缩后的.gz二进制数据覆盖1F 8B 08 00处的原文件(写回去时,不能改变原文件的大小,也不能修改原文件后面的内容,否则会很麻烦)

第六步:以mode方式启动设备,然后使用命令刷入:flash boot boot-new.img,然后重启

总结一张图(点击查看高清无编码大图):

踩过坑

坑一:一定要保留最原始解压的内核文件boot.img,万一刷机失败可以恢复运行。

坑2:修改值时,只需要将‘%d’占位符改为‘0\t’即可,无需改变arm命令操作。

坑三:使用恢复后的文件时一定要记住不要改变原文件的大小。

坑4:命令运行失败,设备必须处于模式,如果不是,则换手机。

五、技术总结

第一:第一种关于反调试的解决方案比较简单,就是静态分析代码,找到反调试的位置,然后对代码进行注释。

第二:针对监控IDA端口反调试,通过修改启动端口,这里也学习了如何修改端口号操作。

第三:修改文件,使其始终为0,ro. 属性值始终为1。这个操作过程还是有点繁琐,而且肯定会遇到很多问题,而且每个人遇到的问题可能不一样,但是这是一个训练的过程,如果成功了,就意味着你已经学会了提取内核操作、了解内核文件的结构、学会分析内核文件、修改内核文件。 重要的。 比如你还可以修改设备的启动镜像,逐渐可以定制自己的rom。

第四:在上面的操作中,我也熟悉了IDA工具的使用,明白字符串的内容永远是发现问题的最佳突破口。 IDA可以搜索字符串Shirt+F12,Ctrl+G和Ctrl+F可以用来查找热键。

boot.img文件解压工具下载地址:

六、总结

本文介绍的内容主要是如何解决反调试问题。 主要有三种解决方案。 最后一项就是修改手机的内核文件。 操作比较繁琐,遇到的问题也比较多。 但如果成功的话,以后破解和逆向就会方便很多。 所以尝试看一下文章,手动做一次。 感觉自己的身体被掏空了。 看完文章记得多多点赞和分享哦。 要是有奖励就最好了!

手机看文章不方便,可以在网页上阅读

在手机上阅读文章有点困难,可以进入网页版:

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON