反汇编

安卓应用加固之静态反反汇编技术总结

佐手、 提交于 2019-11-28 11:28:17
0x00 前言 对安卓应用的静态保护增加了逆向时对应用的分析难度,可以从以下多个方面进行: 1.应用代码保护 2.资源保护 3.完整性校验 0x01 应用代码保护 所谓应用代码保护主要是对应用的源码进行保护,主要采用的保护手段是: 软件混淆技术 软件混淆技术从混淆对象上来看,可以分为代码混淆和数据混淆。从混淆时间来分类,又可以分为:1.代码混淆 2.编译期混淆 3.二进制混淆 以下主要从混淆的不同时间来探讨混淆技术 一、代码混淆 二、模板混淆(编译期混淆) 三、AST混淆(编译期混淆) 四、IR混淆(编译期混淆) 五、DEX混淆(编译期混淆) 六、DEX二次混淆(二进制混淆) 0x02 资源保护 对APK的资源文件,包括字符串资源、图片资源、脚本等进行混淆。 待更... 0x03 完整性校验 对APK是否被篡改,是否被反编译过进行校验。 待更... 来源: https://www.cnblogs.com/victor-paladin/p/11406646.html

使用gcc不同选项来编译查看中间生成文件

天大地大妈咪最大 提交于 2019-11-28 10:09:25
gcc编译C程序的总体流程如下图 用到的命令如下: .c---> .i gcc -E hello.c .c--->.s gcc -S hello.c .c--->.o gcc -c hello.c .c--->.out gcc hello.c .o反汇编 objdump -d hello.o 下面通过一个例子演示一下 首先建立一个hello.c和一个hello.h 然后使用第一条命令 gcc -E hello.c 预处理的文件内容特别多,截图只是部分内容。 然后查看汇编程序文件 gcc -S hello.c 可以看到,已经生成了一个.s文件,里面的内容很多很杂。 然后编译生成目标文件 gcc -c hello.c 由于目标文件是二进制文件,所以不能通过文本编辑器进行查看。 链接后生成可执行文件 gcc hello.c 还可以通过objdump反汇编工具查看反汇编代码 objdump -d hello.o 反汇编的代码比直接生成的汇编代码要更简洁易读(省去了很多冗余信息) 来源: https://www.cnblogs.com/zhaijiayu/p/11404294.html

Windbg的主题---Theme

Deadly 提交于 2019-11-28 05:08:53
主题是预配置的windbg工作区,其中包含调试信息窗口的有用配置。任何主题都可以保存为基本工作区。 Windows调试工具包中的主题作为一组注册表文件(扩展名为.reg)提供。 当您积累更多的调试会话时,会自动设置各种默认工作区。 这些默认工作区使用基本工作区作为起点。 有关默认工作区的详细信息,请参见 WinDbg的工作空间---Work Space 。 一、加载主题 在加载主题之前,我们建议您清除所有工作区数据。 这可以通过三种方式实现: 使用Windbg用户操作接口,在菜单“File”下的“ Clear Workspace ”的弹出窗体,选择所有,然后点击"OK" 删除注册表键HKCU\Software\Microsoft\Windbg\Workspaces下的内容 通过命令行删除 reg delete HKCU\Software\Microsoft\Windbg. 清除所有工作区数据后,运行其中一个主题。这些文件作为.reg文件存储在Windows安装调试工具的主题目录中。运行主题会将其设置导入注册表,重新定义基本工作区。加载主题后,可以将其更改为更符合您的偏好。 二、自定义主题 在自定义主题之前,必须先加载该主题。 加载主题后,在没有命令行参数的情况下启动windbg。这将打开基本工作区。 自定义主题有两个常见的焦点区域:设置路径和调整窗口位置。完成任何需要的调整后

VS2013中反汇编常用指令理解

*爱你&永不变心* 提交于 2019-11-26 23:17:56
  最近复习C语言,对反汇编感兴趣,就用下图举例解释一下我的理解,如有错还请大佬指教。   首先,认识两个常用指令 :    lea ---> 取地址赋值 mov ---> (同类型)赋值 其次理解 dword ptr [] :    dword(double word)即双字,也就是四字节    ptr(point)即指针    []放的是一个地址值,这个地址对应一个四字节数据 举个栗子, dword ptr [p1] 表示 : p1(地址值)对应的四字节数据(内容) 解释完了,现在把各部分汇编指令拿出来验证一下    来源: https://www.cnblogs.com/Duikerdd/p/11334962.html

浅谈synchronized的实现原理

╄→尐↘猪︶ㄣ 提交于 2019-11-26 06:47:49
前言 Synchronized是Java中的重量级锁,在我刚学Java多线程编程时,我只知道它的实现和monitor有关,但是synchronized和monitor的关系,以及monitor的本质究竟是什么,我并没有尝试理解,而是选择简单的略过。在最近的一段时间,由于实际的需要,我又把这个问题翻出来,Google了很多资料,整个实现的过程总算是弄懂了,为了以防遗忘,便整理成了这篇博客。 在本篇博客中,我将以class文件为突破口,试图解释Synchronized的实现原理。 从java代码的反汇编说起 很容易的想到,可以从 程序的行为 来了解synchronized的实现原理。但是在源代码层面,似乎看不出synchronized的实现原理。锁与不锁的区别,似乎仅仅只是有没有被synchronized修饰。不如把目光放到更加底层的汇编上,看看能不能找到突破口。 javap 是官方提供的*.class文件分解器,它能帮助我们获取*.class文件的汇编代码。 接下来我会使用javap命令对*.class文件进行反汇编。 编写文件Test.java: public class Test { private int i = 0; public void addI_1(){ synchronized (this){ i++; } } public synchronized void

程序的机器级表示(一)

[亡魂溺海] 提交于 2019-11-26 06:07:55
程序编码 假设一个C程序,有两个文件p1.c和p2.c。我们用Unix命令行编译这些代码: linux> gcc -Og-o p p1.c p2.c    命令gcc就是GCC编译器,这是Linux默认的编译器。编译选项-Og告诉编译器使用会生成符合原始C代码整体结构的机器代码的优化等级,使用较高级别的优化产生的代码会严重变形,以至于产生的机器代码和初始源代码之间的关系难以理解。 实际上,gcc命令调用了一整套程序,将源代码转换为可执行代码。首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。其次,编译器产生两个源文件的汇编代码,名字分别为p1.s和p2.s。接下来,汇编器会将汇编代码转换为二进制目标代码文件p1.o和p2.o。目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但是还没填入全局值的地址。最后,链接器将两个目标代码文件与实现函数(如printf)的代码合并,并产生最终的可执行文件p(由-o p指定的)。 机器级代码 对机器级编程来说,其中两种抽象尤为重要。第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。大多数ISA,包括x86-64