逆向和保护
文章平均质量分 52
奈沙夜影
这个作者很懒,什么都没留下…
展开
-
190328 逆向-浅谈反调试
调试机制Linux通过ptrace系统调用来调试子进程对于create类型,与正常创建子进程工序相同,通过fork创建子进程后使用traceme来告知内核它需要被调试,这样等到exec执行的时候内核就会产生SIGTRAP,此时调用wait的父进程就会接收到这个信号并ptrace子进程,从而使得调试优先于子进程的所有内容而对于attach类型,是父进程直接使用ptrace去调试其他进程,如果...原创 2019-03-29 01:11:02 · 24720 阅读 · 0 评论 -
180517 逆向-反控制流平坦化(符号执行脚本)
控制流平坦化的相关理论百度有很多,简单来讲就是将代码块之间的关系打断,由一个分发器来控制代码块的跳转 正常流程如下 经混淆后的流程如下 破坏了代码块之间的关系后,整个程序的逻辑将很难辨认 符号执行的思路是遍历所有路径,将分发器等无用的代码跳过,恢复代码块之间的联系 由于跳转的代码极有规律,因此在跨过分发器,找到代码块之间联系的基础上修复控制流就难度不大了 符号执行反...原创 2018-05-17 21:37:40 · 4823 阅读 · 0 评论 -
180321 逆向-代码的二次开发(3)获得函数的调用
1625-5 王子昂 总结《2018年3月21日》 【连续第536天总结】 A. 代码的二次开发(3) B.获得函数的调用在扩充程序功能时,有时会遇到调用的API函数不在输入表中 在应用程序调用DLL中的函数之前,DLL文件映像必须被映射到调用进程的地址空间中方法有两种: 1. 加载时的隐式链接。即修改输入表,增加需要的API函数 2. 运行时的显示链接。即显式链接调用D...原创 2018-04-11 16:58:30 · 555 阅读 · 0 评论 -
180320 逆向-代码的二次开发(2)手工构造区块
1625-5 王子昂 总结《2018年3月20日》 【连续第535天总结】 A. 代码的二次开发(2) B.手工构造区块区块间隙的空间大小是有限的,如果所需代码不多,那么上述方法方便快捷。但是如果需要添加的代码比较多的话,区块间隙就不够用了。此时必须手动添加区块。手工构造区块必须熟悉PE格式,实际操作时一般可用工具辅助。 主要有3个工作要做: 1. 增加块头 2. 增加块头...原创 2018-04-11 16:32:23 · 315 阅读 · 0 评论 -
180319 逆向-代码的二次开发(1)区块间隙的利用
1625-5 王子昂 总结《2018年3月19日》 【连续第534天总结】 A. 代码的二次开发(1) B. 前言这里的二次开发主要指的是在没有源码和接口的情况下扩充可执行文件的功能,目标是二进制的EXE或DLL文件,需要用汇编实现相关功能,或构造一个接口,调用其他语言实现功能。该技术主要是修改扩充PE结构,对PE文件进行DIY,因此又叫PEDIY技术增加空间最首要解...原创 2018-04-03 23:23:59 · 387 阅读 · 1 评论 -
180316 逆向-反调试技术(9)防止附加和父进程检测
1625-5 王子昂 总结《2018年3月16日》 【连续第531天总结】 A. 反调试技术(9) B.防止调试器附加R3调试器的附加使用的是DebugActivePocess函数,在附加相关进程时,会首先执行到ntdll.dll下的ZwContinue函数,最后停留在ntdll.dll的DbgBreadkPoint处可以通过Hook上述两个函数,如果执行了则说明有调试器附加 ...原创 2018-04-03 17:25:32 · 2151 阅读 · 0 评论 -
180315 逆向-反调试技术(8)调试器漏洞
1625-5 王子昂 总结《2018年3月15日》 【连续第530天总结】 A. 反调试技术(8) B.调试器漏洞只要是软件,就存在漏洞,调试器当然也不例外。 以OD为例OutputDebugStringA 这个API向调试器发送一个格式化的串,OD会在底端显示相应的信息 而OD中对这个API存在一个格式化字符串漏洞 有些版本的OD已经修复了这个漏洞DRx清理BUG...原创 2018-04-03 17:02:06 · 448 阅读 · 0 评论 -
180314 逆向-反调试技术(7)调试器检测
1625-5 王子昂 总结《2018年3月14日》 【连续第529天总结】 A. 反调试技术(7) B.调试器检测书上讲了很多SoftICE的检测方法,但是那玩意儿连XP都不支持,时代的眼泪了……OD的检测方法查找特征码 遍历进程,将特定地址处的值与OD的特征码进行比对,相同则确定是OD 不过这种方法只针对特定版本的软件,不同版本可能会使得特征码不同,因此有一定缺...原创 2018-04-03 16:57:18 · 1909 阅读 · 0 评论 -
180313 逆向-反调试技术(6)Hook和AntiHook
1625-5 王子昂 总结《2018年3月13日》 【连续第528天总结】 A. 反调试技术(6) B.Hook和AntiHook壳通过调用ThreadHideFromDebugger检测调试器,于是OD的HideOD插件就是通过对ThreadHideFromDebugger的Hook来对抗的最早期直接在入口写入retn 10来直接返回,防止函数的调用 于是外壳也进行了改进:...原创 2018-04-03 00:07:07 · 1278 阅读 · 0 评论 -
180312 逆向-反调试技术(5)NativeAPI
1625-5 王子昂 总结《2018年3月12日》 【连续第527天总结】 A. 反调试技术(5) B.NativeAPIAPI的调用过程中,User态和Kernel态的通信仅通过ntdll.dll 换句话说,Win32子系统和兼容的Win16、MSDOS、OS/2等子系统都是通过kernel32.dll或直接调用ntdll.dll的 然后ntdll.dll通过int 0x...原创 2018-04-02 23:46:35 · 375 阅读 · 0 评论 -
180515 逆向-被隐藏的真实(DDCTF_Re3)
这题本来单纯地以为是很简单的题,听欧佳俊师傅讲了一下出题思路才发现他的想法真的比答题人多得多……main函数里调用了三次get_pwd()这个函数来check输入 get_pwd中接受输入,然后对count自增,调用了Bitcoin对象的一个函数来校验输入 如果熟悉C++逆向的话,一眼就能看出来这是在调用虚函数 因为v2是对象的空间,在C++的对象构造中,开头4个字节指向的是虚函...原创 2018-05-15 00:47:07 · 1378 阅读 · 0 评论 -
180715 安卓-防护基本策略(Native方法)
Native方法安卓的底层是Linux实现,但实际上程序入口是在Dalvik虚拟机中,作为字节码和运行在虚拟机中的代码本身就不具备太强的安全性,另一方面虚拟机的执行效率也是众所周知的因此安卓允许通过so库的加载来调用底层linux执行代码,这就是Native方法具体使用方法为在java层中使用System.loadlibrary(“test”),虚拟机会去载入libtest.so文件,...原创 2018-07-18 00:43:54 · 437 阅读 · 0 评论 -
190320 逆向-单字节穷举
单字节穷举前言穷举是做任何题都最简单的方法但考虑输入为任意字符串,则穷举空间就有95len(95是常见可见字符的数量),随便一个flag长度为几十就会导致计算时间突破天际所以一般情况下不会考虑穷举但当题目具备一些特殊情况时就可以通过一些手段来降低穷举空间到可以接受的大小最简单的情况当然就是程序每接收一个字符都会做出反馈攻击者只需要穷举91*len次即可得到正解,即将穷举空间从几何级降...原创 2019-03-21 01:55:23 · 550 阅读 · 0 评论 -
190319 逆向-花指令
以前也接触过简单的花指令,基本上就是jz/jnz式的固定跳转前几天的某比赛中出现了一个相对而言比较复杂的花指令,参考pizza的笔记开始一阵学习XD前言花指令指的是没有卵用,会干扰代码阅读甚至反编译,却不影响程序功能的代码。广义上来说OLLVM、VMP一类的代码改变型混淆也属于花指令,本文所指的是指会干扰反汇编、影响机器码解析但不影响正常机器码的字节。原理产生花指令的根本原因是x86指...原创 2019-03-20 00:15:53 · 4938 阅读 · 0 评论 -
181007 安卓-构建数据库
安卓自带一个Sqlite数据库,但是我对sql不是很熟~毕竟不会开发不会web的逆向菜狗233正好看到书上有讲Litepal这个方便的工具,部署也超级简单,就实践了一下Litepal方便之处在于可以将数据库的记录与Java对象建立映射,通过Bean类来快捷地操作记录首先在build.gradle里的dependencies加上compile 'org.litepal.android:core...原创 2018-10-08 02:00:02 · 323 阅读 · 0 评论 -
180730 安卓-签名攻防
大多数App、Web等需要和服务器交互的程序中,为了保证请求是由程序自己发出的,通常会结合参数和时间戳通过一些算法来生成一个signature,即签名服务器再通过上述参数和算法同样生成sig,与请求中携带的sig进行比较,不符则认为是第三方调用的,进行特殊处理于是攻击者也会试图获得sig,一种方法是静态分析算法,用脚本如法炮制 静态的防御通过混淆、加壳等手段可以比较好的增加难度而另一...原创 2018-08-01 01:51:15 · 264 阅读 · 0 评论 -
180713 安卓-防护基本策略(混淆和签名)
混淆众所周知安卓是Java的一个分支,默认情况下Java编译时都会将变量名、方法名都信息全部包含进去,安卓也是同样与编译型语言(可以)将符号信息全部舍弃,完全依赖地址区分变量不同,解释型语言通常将信息和变量绑定使用,因此无法丢弃符号信息代码混淆编译型语言例如C语言,可以在编译时加上去除符号表和重定位信息的选项来减小生成文件的体积,对应的也会使反编译困难许多解释型语言虽然不能完全...原创 2018-07-16 00:57:18 · 260 阅读 · 0 评论 -
180712 安卓-入门
安卓逆向反编译Apk结构classes.dex java层的主要代码,即主程序META-INF 签名和证书相关文件lib native层的动态链接库文件(.so)目录,按照CPU架构作为子目录存放不同的soassets 打包的静态文件,通常存放需要读取的图片、加密代码等等res 资源目录AndroidManifest.xml 配置文件,默认状态为编译后的二进...原创 2018-07-12 23:35:48 · 509 阅读 · 2 评论 -
180705 逆向-Linux的逆向
常用工具和命令nm 列出目标文件的所有符号objdump -d参数表示反编译.text段中的程序代码readelf 查看ELF文件的各种信息IDAgdbIDA与PE程序基本类似,将ELF程序拖入IDA也可以快速的反汇编,主要借助hex-ray插件来反编译出可读性较高的伪代码实验-passwd_generatortrickpatchdynam...原创 2018-07-12 23:34:29 · 1560 阅读 · 0 评论 -
180717 安卓-特殊权限简介
前言Android的权限机制使得应用必须在用户同意的前提下才能进行一些敏感操作,而Android6.0新增了一个被称为运行时权限的功能。 这个功能可以申请许多用户体验很好的产品,但随之而来的是一些隐私安全问题辅助功能权限许多安卓使用者因为各种情况而需要以特殊方式与手机交互,包括无法看屏幕、使用触屏、接收语音消息等等,因此安卓提供了辅助功能和服务来帮助这些用户更简单地操作设备,包括...原创 2018-07-18 01:33:17 · 733 阅读 · 0 评论 -
180716 安卓-防护基本策略(反调试)
java层Dalvik虚拟机没有提供反调试的方法,但是可以通过反射方法来使得方法的调用变得扑朔迷离 动态获取类是更进阶的方法,通过一些解密计算等操作来得到类,可以使得动态调试较为困难native层Native层实质上就是Linux程序,因此反调试手段也跟Linux下的反调试基本相同主要还是alarm, ptraceme, tracepid等常见手段具体描述在前几天的Lin...原创 2018-07-18 01:01:33 · 337 阅读 · 0 评论 -
180224 逆向-脱壳技术(7)
1625-5 王子昂 总结《2018年2月24日》 【连续第511天总结】 A. 脱壳技术(7) PE文件的优化 B.脱壳后的优化一般脱壳没有将外壳本身的代码去除,资源也没有完全释放,此时脱壳后的程序会比原始程序大 另外虽然能正常运行,但在一些场合下可能会遇到问题,例如一些汉化工具不识别脱壳后的文件,或某些功能无效等优化输入表存放位置用ImportREC重建输入表,一...原创 2018-03-21 18:33:58 · 463 阅读 · 0 评论 -
180223 逆向-脱壳技术(6)
1625-5 王子昂 总结《2018年2月23日》 【连续第510天总结】 A. 脱壳技术(6)附加数据 B.附加数据某些PE文件在各个区块之后还有一些数据,它们不属于任何区块,由于PE文件被映射到内存是按区块映射的,因此这些数据是不能被映射到内存中的,这些额外的数据就被称为附加数据(overlay)附加数据的起点是最后一个区块的末尾,终点是文件末尾dump程序内存的时候,...原创 2018-03-21 18:33:37 · 249 阅读 · 0 评论 -
180306 逆向-反调试技术(1)BeingDebugged
1625-5 王子昂 总结《2018年3月6日》 【连续第521天总结】 A. 反调试技术(1) B. BeingDebuggedWin32API为程序提供了IsDebuggerPresent来判断自己是否处于调试状态,懒惰的程序员使用这个API来自欺欺人 实现源码为:IsDebuggerPresent(VOID){ return NtCurrentPeb(...原创 2018-03-22 16:44:04 · 1837 阅读 · 0 评论 -
180305 逆向-文件完整性校验(1)
1625-5 王子昂 总结《2018年3月5日》 【连续第520天总结】 A. 文件完整性校验(1) B. 反调试、加密保护等的对抗措施通常是Patch,即修改程序 另一方面,为了防止程序被篡改而产生的病毒破坏、信息改动等 产生了完整性校验的技术 通常使用哈希函数来计算文件的散列值,并保存该值,然后运行时再次哈希,并比对。磁盘文件校验CRC算法可以对一段字符串进行...原创 2018-03-22 16:43:38 · 717 阅读 · 0 评论 -
180304 逆向-抵御静态分析(3)
1625-5 王子昂 总结《2018年3月4日》 【连续第519天总结】 A. 抵御静态分析(3) B. 信息隐藏为了提高界面的友好度,大多数软件都会在大量地方显示提示语。 而这些提示语由于特殊性和特征明显,经常被作为静态分析的突破口。(例如IDA的Shift+F12,OD的智能搜索字符串233) 破解者循着破解点的字符串即可直接找到破解点的代码,进行操作。 为了防范...原创 2018-03-22 16:34:08 · 271 阅读 · 0 评论 -
180303 逆向-抵御静态分析(2)
1625-5 王子昂 总结《2018年3月3日》 【连续第518天总结】 A. 抵御静态分析(2) B. SMC技术SMC(Self-Modifying Code),即自修改代码 34c3ctf的re1就是使用这项技术的题目,结合随机数使其静态分析看起来很迷惑。相当有意思的题目 SMC技术是事先将代码进行加密,存放在程序中。然后程序运行时对其解密,使其成为可执行的代码后...原创 2018-03-22 16:33:37 · 304 阅读 · 0 评论 -
180302 逆向-抵御静态分析(1)
1625-5 王子昂 总结《2018年3月2日》 【连续第517天总结】 A. 抵御静态分析(1) B. 静态分析是逆向工程中常用的手段。 因此抵御静态分析也是一个很值得深入的话题。花指令在反汇编的过程中,存在着几个关键的问题。 其中之一就是数据与代码的区分问题。 汇编指令长度、多种多样的间接跳转实现形式,反汇编算法必须对这些情况作出恰当的处理,保证反汇编结果的正确性。 ...原创 2018-03-22 16:32:44 · 488 阅读 · 0 评论 -
180301 逆向-防范算法求逆(3)
1625-5 王子昂 总结《2018年3月1日》 【连续第516天总结】 A. 防范算法求逆(3) B. 游击战术将验证函数F分解成多个互不相同的Fi,然后将Fi尽可能地隐藏到程序里去层层叠叠通过任意一个Fi的验证都只是注册码合法的必要条件,而非充分条件。真正合法的注册码能够通过所有的Fi的验证。而仅仅通过部分验证的R会在其他通不过的验证处被发现。 这种方法虽...原创 2018-03-22 16:32:16 · 283 阅读 · 0 评论 -
180228 逆向-防范算法求逆(2)
1625-5 王子昂 总结《2018年2月28日》 【连续第515天总结】 A. 防范算法求逆(2) B. 堡垒战术事实上,在通信领域,人们早就开始对身份校验的研究,发展出了散列加密和非对称加密等优秀的密码学算法,其中的MD5算法和RSA算法很适合在软件注册算法中运用MD5Message Digest Algorithm MD5(消息摘要算法第五版),是一种广为运用...原创 2018-03-22 16:31:53 · 260 阅读 · 0 评论 -
180227 逆向-防范算法求逆(1)
1625-5 王子昂 总结《2018年2月27日》 【连续第514天总结】 A. 防范算法求逆(1) B. 基本概念软件保护的目的是向合法用户提供完整的功能,因此身份校验是必须的 这一环节通常采用注册码验证的方式实现 流程用户向作者提供用户码U, 申请注册作者计算出注册码R=f(U),返回给合法用户合法用户在软件中输入U和R软件验证F(U, R)来判断...原创 2018-03-22 16:31:32 · 266 阅读 · 0 评论 -
180226 逆向-脱壳技术(9)
1625-5 王子昂 总结《2018年2月26日》 【连续第513天总结】 A. 脱壳技术(9)加密壳的一些技术 B. 加密壳ASProtect这款壳由于过于经典,因此在看雪等论坛上有多篇分析文章,不再赘述脱壳方法 主要列举一些技术 Emulate standard system functions 它将API入口一段代码抽到外壳里,然后输入表里填充外壳地址,...原创 2018-03-22 16:30:56 · 372 阅读 · 0 评论 -
180307 逆向-反调试技术(2)CheckRemoteDebuggerPresent
1625-5 王子昂 总结《2018年3月7日》 【连续第522天总结】 A. 反调试技术(2) B. CheckRemoteDebuggerPresentBOOL CheckRemoteDebuggerPresent(HANDL hProcess, PBOOL pbDebuggerPresent);这是另外一个MSDN上提供的检测调试器的函数,测试发现及时修改Be...原创 2018-03-23 12:40:22 · 1562 阅读 · 2 评论 -
180310 逆向-反调试技术(3)DebugObject
1625-5 王子昂 总结《2018年3月10日》 【连续第525天总结】 A. 反调试技术(3) B. DebugObject之前都是从被调试进程入手找痕迹,除此以外调用了DebugAPI的调试器必然要向系统进行声明注册,因此从调试器一边寻找痕迹也是可行的 调试器与被调试程序建立关系有两种途径在创建进程时设置DEBUG_PROCESS调用DebugActiveP...原创 2018-03-23 12:42:18 · 745 阅读 · 0 评论 -
180222 逆向-脱壳技术(5)
1625-5 王子昂 总结《2018年2月22日》 【连续第509天总结】 A. 脱壳技术(5) DLL文件脱壳 B.DLL文件脱壳简介Dll是Dynamic Link Library动态链接库的缩写,它与EXE同属PE文件,结构大体相同 但由于无法独立运行,必须借助exe来导入加载,因此相比exe的动态调试起来要麻烦一些另一方面由于加载基址不定(EXE的加载基址默认...原创 2018-03-21 18:33:17 · 243 阅读 · 0 评论 -
180221 逆向-脱壳技术(4)
1625-5 王子昂 总结《2018年2月21日》 【连续第508天总结】 A. 脱壳技术(4) 重建输入表 B.重建输入表外壳程序会破坏原程序的输入表,因此Dump内存以后必须要修复输入表才能正常运行原理IAT结构用于保存API的实际地址 PE文件在初始化输入表时,Windows装载器首先搜索OriginalFirstThunk,如果存在,加载程序迭代搜索数组中的每...原创 2018-03-21 18:32:54 · 262 阅读 · 0 评论 -
180220 逆向-脱壳技术(3)
1625-5 王子昂 总结《2018年2月20日》 【连续第507天总结】 A. 脱壳技术(3)抓取内存映像 B.抓取内存映像又叫转存、Dump 就是把内存中的指定数据保存为文件,写入磁盘中脱壳时,如果将解密后的原程序dump出来,就得到了原程序的核心部分,只要修复IAT等部分就基本还原了而在何时dump文件是有一定技巧的。 一般在OEP处dump。 如果运行以后du...原创 2018-03-21 18:32:31 · 448 阅读 · 0 评论 -
180219 逆向-脱壳技术(2)
1625-5 王子昂 总结《2018年2月19日》 【连续第506天总结】 A. 脱壳技术(2)寻找OEP B. 寻找OEP外壳保护的程序运行时,首先会执行外壳 将原程序解密到内存中,再将控制权转交给原程序来正常执行无论是脱壳恢复原程序还是调试,都需要找到原程序的入口点,即OEP找OEP有以下几种方法 根据跨段指令 大多数PE加壳程序会在被加密的程序中加...原创 2018-03-21 18:32:07 · 298 阅读 · 0 评论 -
180218 逆向-脱壳技术(1)
1625-5 王子昂 总结《2018年2月18日》 【连续第506天总结】 A. 脱壳技术(1) B. 加载过程壳和病毒在有些方面类似,都需要比源程序代码更早的获得控制权。保存入口参数 初始化时保存各寄存器的值,执行完毕后再恢复各寄存器。通常使用pushad\popad, pushfd\popfd获取壳自己所需要使用的API 一般外壳的输入表中只有GetProc...原创 2018-03-21 18:31:42 · 472 阅读 · 0 评论 -
180217 加密-专用加密软件(3)
1625-5 王子昂 总结《2018年2月17日》 【连续第505天总结】 A. 专用加密软件(3) B. 虚拟机保护软件这里的虚拟机指的不是VMWare一类虚拟出较完整的系统的软件,而是类似JVM对指令码进行转换的解释器组成一个虚拟机引擎由编译器、解释器和VPU Context(虚拟CPU环境)组成,再配上一个或多个指令系统。原理虚拟机运作的时候,先把...原创 2018-03-21 18:30:42 · 313 阅读 · 0 评论