From:IDA Pro7.0 使用 妙技 记忆:https://www.52pojie.cn/thread-886103-1-1.html IDA Pro 7.7 全插件绿色版:https://www.chinapyg.com/thread-142494-1-1.html hex-ray 官网 ida pro 版块 :https://hex-rays.com/products/ida/news/ hex-ray 官网文档:https://hex-rays.com/documentation/小初足交
安全探究著述 ( 车联网 ):https://zhuanlan.zhihu.com/p/559716931 向分析东谈主员常用 API 列表:https://zhuanlan.zhihu.com/p/465387959 IDA Pro反汇编器具初识及逆向工程解密实战:https://zhuanlan.zhihu.com/p/461862715
俗语说,工欲善其事,必先利其器,在二进制安全的学习中,使用器具尤为环节,而 IDA 又是玩二进制的神器。参考《IDA pro巨擘指南》(第二版),纪录一些使用过程。
IDA Pro 装配得手会后会流露两个运行轨范 “IDA Pro(32bit)” 和 “IDA Pro(64bit)”,分别对应32位和64位轨范的分析。idaq.exe发达反编译32位可推论文献,idap64.exe发达反编译64位可推论文献。IDA 救援常见的PE样式,DOS、UNIX、Mac、Java、.NET 等平台的文献样式。
:https://bbs.kanxue.com/thread-271124.htm
硬件断点、软件断点
硬件断点:由硬件特色已毕(数量有限),是通过监测地址来触发断点的。是以,硬件断点不错诞生在职何所在,岂论是 FLASH,ROM 如故 RAM,只消给定地址就不错了。软件断点:是通过监测特定的指示来触发断点的。在某个地址诞生软件断点的时候,仿真器会将这个地址的 "数据 / 指示" 替换成一个特殊样式的指示。断点单元通过监测这个特殊样式的指示来触发断点。因为需要推论替换操作,是以软件断点只可诞生在RAM里面。软件断 适用于运行于内存中的轨范(软件已毕)。以x86为例,向某个地址打入断点,履行上即是往该地址写入断点指示INT 3,即0xCC。谋划轨范运行到这条指示之后就会触发SIGTRAP信号,gdb拿获到这个信号,把柄谋划轨范现时罢手位置查询gdb爱戴的断点链表,若发目前该地址如实存在断点,则可判定为断点射中。硬件断点是对地址的径直监测,依赖于CPU寄存器,是以数量有限,软件断点因为是监测替换后指示无为是无尽的。硬件断点比软件断点的功能更强。硬件断点的本色即是在指定内存下断点,内存不错位于代码段(函数断点)也不错是数据段(数据断点)。不错诞滋事件有推论、写入、读写时中断。
1、一些 二进制 器具在《IDA pro巨擘指南》的开篇一两章中,先是先容了几款常用于二进制议论的器具,我这里约略的记了几个,先容一波:
C++filt:不错用于显泄露c++中复杂的重载后的函数称呼PE tools:是一组用于分析Windows系统中正在运行的程度和可推论文献的器具string:不错用于径直搜索出 elf 文献中的统统字符串。参数 -a 暗示搜索统统这个词文献,参数 -t 不错显泄露每一个字符串的偏移,参数-e 不错用于搜索更多的字符编码的字符串,如Unicode编码strip:可用于 elf 去象征,去象征后仍然保持宽泛功能但加多了逆向的难度,出题恶东谈主必备开发 IDA 的天才是 Ilfak,他的个东谈主博客有许多 IDA 的教程:https://www.hexblog.com/
linux 下可推论文献分析:https://zhuanlan.zhihu.com/p/319710983
1. file 可推论文献 可稽查可推论文献是ARM架构如故X86架构2. nm 可推论文献 可稽查文献中的象征,包括全局变量,全局函数等3. ldd 可推论文献 可稽查文献推论所需要的动态库4. strings 可推论文献 可稽查文献中统统的象征,包括编译器版块信息5. readelf 可推论文献 可稽查文献的统统详备信息,包括文献的头信息,动态库信息,段信息等 file 基本信息稽查linux 下有个最常用的通用敕令,来分析任何文献的基本样式,那即是file 不错看到基本信息,比如是什么类型文献,只是空洞,还有些其他选项,不错用-h 稽查。
-b:列出辨识驱逐时,不流露文献称呼;-c:详备流露指示推论过程,便于排错或分析轨范推论的情形;常与 -m 一齐使用,用来在装配幻数文献之前调试它-f <文献名>:指定一个或多个文献名,让file依序辨识这些文献,样式为每列一个文献称呼;-L:径直流露象征联接所指向的文献类别;-m <魔法数字文献>:指定魔法数字文献;-v:流露版块信息;-z:尝试去解读压缩文献的内容。-i:流露MIME类别 ldd 打印轨范依赖的分享库-v 详备信息模式,打印统统探究信息 -u 打印未使用的径直依赖 -d 推论重定位和呈文任何丢失的对象 -r 推论数据对象和函数的重定位,而况呈文任何丢失的对象和函数 --help 流露匡助信息
示例:ldd /bin/vim
xxdxxd敕令不错为给定的模范输入或者文献作念一次十六进制的输出,它也不错将十六进制输出更始为蓝本的二进制样式,行将放浪文献更始为十六进制或二进制样子
dddd敕令用指定大小的块拷贝一个文献,并在拷贝的同期进行指定的更始。
nm 象征稽查nm敕令是Linux下自带的开阔的文分内析器具,是敕令着手于name的简写。该敕令用来列出指定文献中的象征(如常用的函数名、变量等,以及这些象征存储的区域)。它流露指定文献中的象征信息,文献不错是对象文献、可推论文献或对象文献库。要是文献中莫得包含象征信息,nm呈文该情况,单不把他诠释为出错。nm缺省情况下呈文十进制象征暗示法下的数字值。
关于一些动态库,径直nm可能查不到信息,不错通过nm -D敕令稽查。
参数说明:
-A / -o / --print-file-name: 在输出时加上文献名; -a / --debug-syms: 输出统统象征,包含debugger-only symbols; -B / --format=bsd: BSD码流露,兼容MIPS nm; -C / --demangle: 将初级象征名默契为用户级名字,不错使得C++函数名更具可读性; -D / --dynamic: 流露动态象征。该选项只对动态谋划(如特定类型的分享库)有真义; -f format / --format=format 使用format样式输出。format不错及第bsd、sysv或posix,该选项在GNU的nm中有用。默许为bsd -g / --extern-only: 只流露外部象征; -l / --line-numbers: 关于每个象征,使用debug信息找到文献名和行号; -n / -v / --numeric-sort: 按象征对应地址的律例排序,而非按象征名字字符律例排序; -P /--portability: 按照POSIX2.0模范样式输出,等同于使用 -f posix; -p / --no-sort: 按照谋划文献中遭遇的象征律例流露,不排序; -r / --reverse-sort: 回转排序; -s / --print-armap: 当列出库成员象征时,包含索引。索引的内容:模块和其包含名字的映射; -u / --undefined-only: 只流露未界说象征; --defined-only: 只流露界说了的象征。
图片小初足交
常用选项: -A 每个象征前流露文献名 -D 流露动态象征 -g 仅流露外部象征 -r 反序流露象征表
strings 稽查二进制文献中的字符串strings信息不错打印二进制文献中的字符串信息,结合grep进行搜索,用grep敕令其实不错径直在二进制文献中搜索内容,可是不够直不雅,用strings看起来的更直不雅些
strings 会把任何可打印字符串都显泄露来,比nm的内容更多
-a --all:扫描统统这个词文献而不是只扫描谋划文献运逶迤和装载段 -f --print-file-name:在流露字符串前先流露文献名 -n --bytes=[number]:找到而况输出统统NUL断绝符序列 - :诞生流露的最少的字符数,默许是4个字符 -t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制 -o :肖似--radix=o -T --target= :指定二进制文献样式 -e --encoding={s,S,b,l,B,L} :聘请字符大小和排列律例:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit @ :读取中选项
查找ls中包含libc的字符串,不永诀大小写:strings /bin/ls | grep -i libc
objdump 将二进制代码转汇编指示objdump是个值得深远学习的指示,不光不错还原汇编指示,还不错读取二进制中特定段的信息,更可怕的是,要是咱们的轨范是以-g -o0等调试不优化的情况下,用objdump -S指示可能尽可能地还原源代码信息(没看错,是还原出源代码信息),其实也不错阐明这些信息是好意思满的在可推论文献中的,要否则gdb调试的时候没主义单步追踪了,
-a, --archive-headers 流露档案头信息,展示档案每一个成员的文献样式。效用等同于敕令 ar -tv -b, --target=BFDNAME 指定谋划码样式。这不是必须的,objdump 能自动识别许多样式,比如 objdump -b oasys -m vax -h fu.o 流露 fu.o 的头部摘录信息,明确指出该文献是 Vax 系统下用 Oasys 编译器生成的谋划文献。objdump -i 将给出这里不错指定的谋划码样式列表 -C, --demangle[=STYLE] 谋划文献中的象征解码成用户级称呼。比如移除象征修饰时在变量与函数名前添加的下划线等。 -d, --disassemble 反汇编谋划文献,将机器指示反汇编成汇编代码 -D, --disassemble-all 与 -d 肖似,但反汇编统统段(section) -z, --disassemble-zeroes 一般反汇编输出将概略零块,该选项使得这些零块也被反汇编 -EB, -EL,--endian={big | little} 指定谋划文献的字节序,在谋划文献没描摹字节序时很有用,举例 S-records。这个选项只影响反汇编 -f, --file-headers 流露每一个谋划文献的头信息 -F, --file-offsets 反汇编时,打印每一个象征的偏移地址 --file-start-context 流露源码/汇编代码(假定为 -S)时,将高下文推广到文献的发轫 -g, --debugging 流露调试信息。企图默契保存在文献中的调试信息并以 C 谈话的语法显泄露来。只是救援某些类型的调试信息。有些其他的样式被readelf -w救援 -e, --debugging-tags 肖似 -g 选项,可是生成的信息是和ctags器具相兼容的样式 -h, --section-headers, --headers 流露谋划文献各个 section 的头部摘录信息 -i, --info 流露关于 -b 或者 -m 选项可用的架构和谋划样式列表 -j, --section=NAME 仅流露指定称呼的 section 的信息 -l, --line-numbers 用文献名和行号标注相应的谋划代码,只是和 -d、-D 或者 -r 一齐使用 -S,--source 反汇编时尽可能使用源代码暗示。隐含了-d参数 -m, --architecture=MACHINE 指定反汇编谋划文献时使用的架构,当待反汇编文献本人没描摹架构信息的时候(比如S-records),这个选项很有用。不错用-i选项列出这里或者指定的架构 -M, --disassembler-options=OPTIONS 给反汇编轨范传递参数,不错指定多个,使用逗号分隔 -p, --private-headers 打印谋划文献样式的特定信息。打印的信息取决于谋划文献样式,关于某些谋划文献样式,不打印任何附加信息。 -P, --private=OPTIONS 打印谋划文献样式的特定信息。OPTIONS 是一个逗号分隔的列表。举例关于XCOFF,可用的选项有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc -r, --reloc 流露文献的重定位进口。要是和-d或者-D一齐使用,重定位部分以反汇编后的样式显泄露来 -R, --dynamic-reloc 流露文献的动态重定位进口,只是关于动态谋划文献真义,比如某些分享库 -s, --full-contents 流露section的好意思满内容。默许统统的非空section都会被流露 -W[lLiaprmfFsoRt],--dwarf=[rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index] 流露文献中调试段的内容,要是存在的话 -G, --stabs 流露肯求的任何 section 的全部内容。流露段 .stab、.stab.index 和 .stab.excl 的内容 -t, --syms 流露文献的象征表进口。肖似于nm -s提供的信息 -T, --dynamic-syms 流露文献的动态象征表进口,只是对动态谋划文献真义,比如某些分享库。它流露的信息肖似于 nm -D,--dynamic 流露的信息 -x, --all-headers 流露所可用的头信息,包括象征表、重定位进口。-x 等价于 -a -f -h -p -r -t 同期指定 -w, --wide 为具有跨越80列的输出劝诱样式化某些行。也不要在流露符堪称呼时截断符堪称呼 --start-address=ADDRESS 从指定地址脱手流露数据,该选项影响 -d、-r 和 -s 选项的输出 --stop-address=ADDRESS 流露数据直到指定地址为止,该项影响-d、-r和-s选项的输出 --prefix-addresses 反汇编的时候,流露每一瞥的好意思满地址。这是一种比拟老的反汇编样式 --no-show-raw-insn 反汇编时,不流露汇编指示的机器码。当使用--prefix-addresses时,这是缺省选项 --adjust-vma=OFFSET 当默契信息时,最先给统统的段添加偏移值offset。当段地址与象征表不符时,这个选项很有用。比如将段扬弃到特殊地址,因为某个样式无法暗示段地址,比如 a.out --special-syms 流露特殊象征与用户不热心的象征 --prefix=PREFIX 当使用 -S 时,指定前缀添加到实足旅途中 --prefix-strip=LEVEL 指定剥离实足旅途中若干个前缀目次名。此选项唯独在使用了选项 --prefix=PREFIX 才有用 --insn-width=WIDTH 指定反汇编后的指示输出的行宽,单元字节 -V, --version 版块信息 -H, --help 匡助信息
readelf 读取ELF文献样式要是二进制文献是ELF样式的,通过file文献不错稽查文献样式.使用readelf指示不错绵薄分析ELF文献的结构,比如节信息,elf头文献信息,比如咱们在分析文献是否为病毒文献的时候,需要读取elf文献头信息,作念一些特征的判断,或看成特征参与机器学习的判断。
示例:readelf -h xxx
动态稽查文献结构 ltrace追踪程度调用库函数过程 ltrace ./a.out 这在稽查系统调用耗时很有用。 # -T 是稽查调用时候支出 ltrace -T #-t -tt -ttt 是稽查调用实足时候,t越多越精准 ltrace -t ltrace 稽查系统调用信息 ltrace -S
stracestrace和ltrace的敕令差未几,strace更偏向于系统调用的追踪或信号产生的情况。装配敕令 yum -y install strace
强地面方在于不错指定系统调用的类型:
-e trace=set 只追踪指定的系统 调用.举例:-e trace=open,close,rean,write暗示只追踪这四个系统调用.默许的为set=all. -e trace=file 只追踪关联文献操作的系统调用. -e trace=process 只追踪关联程度限度的系统调用. -e trace=network 追踪与积贮关联的统统系统调用. -e strace=signal 追踪统统与系统信号关联的 系统调用 -e trace=ipc 追踪统统与程度通信关联的系统调用 -e abbrev=set 设定 strace输出的系统调用的驱逐集.-v 等与 abbrev=none.默许为abbrev=all. -e raw=set 将指 定的系统调用的参数以十六进制流露. -e signal=set 指定追踪的系统信号.默许为all.如 signal=!SIGIO(或者signal=!io),暗示不追踪SIGIO信号. -e read=set 输出从指定文献中读出 的数据.举例: -e read=3,5 -e write=set
GDB 敕令gdb敕令其实是咱们最常用的,调试轨范的利器,用来稽查二进制文献的结构,止境合适,不错把轨范运行起来通过gdb -p pid绵薄地调试。 也可如下运行:
PEiD、 Exeinfo 检测 PE文献PEiD只救援检测32位的可推论文献,要是流露不是有用的PE文献,说明你的可推论文献为64位,不可用 PEiD 检测。不错使用 Exeinfo PE 稽查,Exeinfo 相当于 PEiD 的升级版,可稽查64位的可推论文献
全功能的二进制文献分析器具 Radare2 指南把柄其 https://github.com/radareorg/radare2,Radare2(也称为 r2)是一个“类 Unix 系统上的逆向工程框架和敕令行器具集”。它名字中的 “2” 是因为这个版块从新脱手重写的,使其愈加模块化。
:https://linux.cn/article-13074-1.html
IDA Pro 插件IDA Pro 插件:https://www.52pojie.cn/thread-1016307-1-1.html
:https://github.com/search?q=ida+plugin
图片
2、IDA 目次结构在 IDA 的装配根目次下有许多文献夹,各个文献夹存储不同的内容
cfg:包含各式成立文献,基本IDA成立文献ida.cfg,GUI成立文献idagui.cfg,文本模式用户界面成立文献idatui.cfg,idc:包含IDA内置剧本谈话IDC所需要的中枢文献ids:包含一些象征文献loaders:包含用于识别息争析PE或者ELFplugins:附加的插件模块procs:包含处理器模块图片
图片
3、翻开 ida、关闭 ida 翻开 ida翻开 IDA 后,IDA 会提供 3 种不同的翻开方式:New(新建),Go(运行),Previous(上一个)。
图片
New 选项标明反编译新可推论文献,Go 选项标明径直参加主界面,Previous 选项标明加载已反编译的文献选项。其中 previous 会给出给出之前逆向过的文献
初度翻开的时候聘请 GO 就不错了。参加之后,聘请左上角的 file 中的 open 翻开文献。
图片
ida 能自动识别加载的可推论文献类型。IDA 加载文献后,会生成一个可能的文献类型列表,在顶部流露,它将流露最合适处理文献的加载器。 Binary File(二进制文献) 是列表临了一个选项,会一直流露,是IDA加载无法识别文献的默许选项,提供最先级的加载方法。需要使用二进制加载器的情形包括:分析从积贮数据包或日记文献中索要出来的rom镜像和破解轨范负载。 在processor type【处理器类型】下拉菜单中,不错指定在反汇编过程中使用的处理器模块【在ida的procs目次中】。多数情况下,ida将把柄可推论文献头中读取信息,聘请合适的处理器。
图片
一朝聘请“Binary file”方式加载文献,则需要用户手动填入加载段地址和相对偏移,对应上图“Loading segment”和”Loading offset”选项。该种方式主要应用场景为:分析动态保存的二进制代码、ShellCode二进制代码分析等。聘请“Binary file”方式加载文献,IDA不会自动分析代码,用户需把柄具体需求自行反汇编二进制代码。
Processor Type:不错指定在反汇编过程中使用的处理器模块。多数情况,IDA将从可推论文献的头中读取到信息,聘请合适的处理器。
kernel options:成立特定反汇编分析选项,IDA可利用这些选项该进递归着落过程。无为ida默许的都是最优的。
processor options:聘请适用于处理器模块的成立选项。
翻开文献以后。IDA主界面:
IDA View 三种反汇编视图:文本视图、图表视图、旅途视图IDA View-A:是反汇编窗口。( 空格键 切换 文本视图 与 图表视图 )HexView-A:十六进制样式流露的窗口,Imports: 导入表(轨范中调用到的外面的函数)。导入函数窗口Exports: 导出函数窗口Functions:轨范中统统函数Structures:结构体窗口。Enums:胪列窗口Strings:字符串窗口(字符串窗口:View --> open subviews --> Strings,或者快捷键 shift+F12)按下 F5 键不错稽查伪代码。IDA 图形视图会有推论流,
Yes 箭头默许为绿色,No 箭头默许为红色,蓝色 暗示默许下一个推论块。不错在左侧稽查代码的运行过程,按下 空格键 也不错直不雅地看到轨范的图形视图。
关闭 ida图片
dont pack database【不打包数据库】:仅刷新4个数据库,不创建idb文献 pack database【打包数据库】:将4个数据库组件文献存到idb文献中 pack database 【打包数据库,压缩】:等同于上一个,压缩到idb存档 collect garbage【积贮垃圾】:在关闭数据库之前,删除莫得的内存页面 dont save the database【不保存数据库】:删除四个数据库组件文献,保留现存未经修改idb文献
ida 创建的 数据库IDA 会创建一个数据库,名为 IDB文献,它由四个文献组成。
id0:二叉树样子的数据库id1:轨范字节象征nam:Named窗口的索引信息til:给定数据库的土产货类型界说的探究信息图片
当关闭时,不错聘请 Don't save database,就不会生成和保存这些文献。
4、IDA 主界面图片
在 IDA 界面底部有一个交互栏不错推论 Python 敕令,或者匡助咱们快速进行进制更始。
在 Python 交互中输入 0x45,由于发轫的 0x 将会被诠释为十六进制数。径直按回车可将 0x45 更始为十进制数,输出驱逐为 69
将十进制更始为十六进制数,不错使用 hex()函数。Bin()函数将其他进制的数字更始为二进制数。输出驱逐是 1000101,发轫的 0b 代表这是一个二进制数。
图片
菜单栏File:用于翻开、新建、装载、保存、关闭一个文献或是数据库 Edit:用于剪辑反汇编代码 Jump:用于跳转到某个位置、地址或是一个窗口 Search:用于搜索代码段、数据、失实等等 View:用于流露文献内容的流露方式 Debugger:调试器,集成在IDA中 Lumina:对元数据进行各式操作 Options:不错进行一些个性化的诞生 Windows Help
导航条: 蓝色: 暗示成例的指示函数玄色: 节与节之间的舛误银白色: 数据内容粉色: 暗示外部导入象征暗黄色: 暗示 ida 未识别的内容如图所示,蓝色方框 标注了 容貌和对应说明:
以上基于 IDA 默许诞生先容各式容貌在导航条的含义,IDA 同期提供了容貌诞生,绵薄用户把柄需求聘请合适的容貌,对应 “Options” 菜单的“Colors”选项中
图片
可在“IDA Colors”对话框的聘请“Navigation band”Table项,在对应选项中诞生各项数据的容貌,绵薄履行场景的分析。
跳转 探究图片
常勤快能、快捷键:空格键: 切换 文本视图 与 图表视图
ESC: 复返上一个操作地址。(唯独在反汇编窗口才是这个作用,要是是在其他窗口按下esc,会关闭该窗口)
G: 径直跳转到某个地址
N: 对象征重定名 Y: 改变变量的类型
H: 更始16进制
T: 默契结构体偏移 M: 更始为胪列类型常量
冒号键: 成例疑望
分号键: 可重叠疑望。在反汇编后的界面中写下疑望
/ : 在反编译后伪代码的界面中写下疑望
\: 在反编译后伪代码的界面中荫藏/流露变量和函数的类型描摹,有时候变量极端多的时候荫藏掉类型描摹看起来会粗略许多
Alt+M: 添加 标签
Ctrl+M: 稽查 标签
ctrl+w: 保存 ida 数据库
ctrl+shift+w:拍摄 IDA 快照
Ctrl+S: 稽查 段信息。聘请某个数据段,径直进行跳转
ctrl+鼠标滚轮:或者疗养经过视图的大小
shift+f12:不错翻开 string 窗口,一键找出统统的字符串。
X ( ctrl+X ): 对着某个函数、变量按该快捷键,不错稽查它的交叉援用。
F5: 稽查 伪代码,即 一键反汇编
Shift +F5:翻开签名窗口
ALT+L:标记(Lable)
ALT+G:更始局部变量为结构体 ALT+Enter:跳转到新的窗口
Alt+T: 搜索 字符串 (文本搜索)
Alt+B: 搜索 十六进制。无为在分析过程中不错用来搜索opcode
伪 C 代码窗口:右键 ---> comment ---> 疑望伪 C 代码。
copy to assembly : 把 伪C代码 复制到反汇编窗口的汇编代码。
IDA 不错修改 so 的 hex 来修改 so,edit,然后 edit-patchrogram,
其实也不错 使用 winhex 来已毕疏导的功能
函数 操作删除函数:函数窗口中选中函数后,按 Delete 键
P : 创建函数。即界说函数。在反汇编窗口选中对应行后,按P键。即 识别成一个函数修改函数参数:在函数窗口中选中并按 Ctrl+E 组合键,或在反汇编窗口的函数里面按 Alt+P 组合键
数据类型 操作在自动分析阶段,字节有时可能被失实地归类。数据字节可能被失实地归类为代码字节,并被反汇编成指示。而代码字节可能被失实地归类为数据字节,并被样式化成数据值。有许多原因会导致这类情况,如一些编译器将数据镶嵌在轨范的代码部分,或者一些代码字节从未被看成代码径直援用,因而IDA聘请不合它们反汇编。蒙眬轨范极端容易蒙眬代码部分与数据部分之间的区别。
在再行样式化之前最先必须删除其现时的样式(代码或数据。右击你但愿取消界说的款式,在驱逐高下文菜单中聘请Undefine(也可使用Edit Undefie敕令或热键U),即可取消函数、代码或数据的界说。取消某个款式的界说后,其基础字节将看成原始字节值再行样式化。在推论取消界说操作之前,使用“单击并拖动”操作聘请一个地址界限,不错取消大界限内的界说。底下以一个约略的函数为例:
C:光标所在地址处的内容默契成代码 D:光标所在地址处的内容默契成数据 A:光标所在地址处的内容默契成ascll码字符串 U:光标所在地址处的内容默契成未界说内容。
U 键:默契成未界说的内容。u:undefine,取消界说函数、代码、数据的界说D 键:让某一个位置变成数据。即 默契成 数据 C 键:让某一个位置变成指示。即 默契成 代码A 键:将聘请的信息更始成 ASCII 字符串。* 键:此处界说为一个数组O 键:将此处界说为一个地址偏移
导航 操作Esc 后退到上一位置 Ctrl+Enter 前进到下一位置 G 跳转到某一个特定位置,然后不错输入地址/照旧界说的称呼 Ctrl+S 跳转到某一区段,然后聘请区段即可
类型 操作IDA 开发了一套类型分析系统,用来处理 C/C++谈话的各式数据类型【函数声明、变量声明、结构体声明等】,而况允许用户目田指定。选中变量、函数后按 Y 键,弹出 “Please enter the type declaration”对话框,从中输入正确的 C 谈话类型,IDA 就不错默契并自动应用这个类型。
稽查 统统 子窗口:点击“View”中“Open subviews”->“Disaassembly”调出来的。
图片
IDA View 窗口图片
IDA View 包括两种浏览模式,右键或者相互跳转。也不错通过快捷键 "空格键" 相互切换
一种是Text View,一种是 Graph View,虚线:条款跳转
实线:无条款跳转
IDA View 主要包括三个区域:
地址区: PE文献加载到内存后的虚地址为准,镜像地址+偏移地址,如 0x00401000OpCode操作区: 该部分默许。因此,需要 Options->General->诞生 Number of opcode bytes为8显泄露来,它是16进制数。图片
反编译代码区: IDA主功能区域,能高亮流露,双击函数或变量名能跳转对应的地址。图片
Hex View 窗口流露16进制,默许为只读景象,不错用快捷键F2对数据区域(绿色字符区域)在只读和剪辑两种景象切换。
图片
Strings 窗口IDA 的 View 有几个按钮对定位代码很环节,如下图所示:
图片
Open exports window 翻开导出窗口Open import window 翻开导入窗口Open names window 函数和参数的定名列表Open functions window 轨范调用的统统函数窗口Open strings window 翻开字符串流露窗口点击 Strings 流露轨范中统统字符串,该窗口有助于你通过轨范的运行输出逆向找出对应的代码片段,如下图的字符串及对应的Address。
图片
双击 String 跳转 IAD View 页面,如下图所示的地址,单击会高亮。
图片
strings(快捷键f12):字符串表 包括轨范中存储的字符串常量(在逆向分析中关于定位要津函数有很大匡助)。
在逆向分析中,每每咱们不错利用 Ida 中的 "交叉援用" 功能找到援用了指定字符串的函数,从辛苦毕了要津函数的定位。比如( 在轨范的象征表被 stripped 掉的时候,无法径直搜索 main 函数) 稽查字符串 "input:flag" 的援用径直定位到 main 函数
函数 窗口 ( 环节 )函数窗口:函数称呼,区域,肇始位置,长度,描摹函数的标记。用于分析每一个单独的函数。
在逆向分析中每每都是径直利用 Function windows 查找要津函数对统统这个词轨范进行分析。该窗口提供 ctrl+F 的搜索功能,举例不错径直 ctrl+f 定位到 main 函数,选中函数后双击,即可在右侧窗口脱手分析,关于一般的函数 IDA 提供开阔的反汇编功能,(快捷键f5,f5大法好啊)径直能阅读到c代码,罢免了阅读汇编谈话的苦难。
import (导入表)、export (导出表)导出窗口列出文献的进口点,导入窗口列出由被分析的二进制文献导入的统统函数,表中内容为轨范需要的外在函数和不错被外部轨范调用的函数(触及到动态指引的探究学问)
(1) Exports窗口是导出表(so中能让外部调用的函数)(2) Imports窗口是导入表(so调用到外面的函数) 段 窗口段表 :包轨范的各个段的信息比如.text(代码段).data(数据段)(触及到PE结构的探究学问)
段窗口 segmentation:段的约略列表
结构体 窗口分析数据结构,双击数据结构称呼伸开,稽查详备布局。
要是轨范正使用某个结构体,而 IDA 并不了解其布局,这时 IDA 不错添加该结构体的布局,并将新界说的结构体包含到反汇编代码清单中。IDA 使用 Structures 窗口来创建新的结构体除非结构体照旧在 Structures 窗口中列出,否就无法将结构体包含到反汇编代码清单中。IDA将自动在 Structures 窗口中列出任何它或者识别、并细则已被个轨范使用的结构体。
IDA 之是以在分析阶段无法识别结构体,可动力于两个原因。最先,天然 IDA 了解某个结构体的布局,但它并莫得鼓胀的信息,或者判断轨范如实使用了结构体。其次,轨范中的结构体可能是一种 IDA 对其一无所知的准结构体。在这两种情况下,问题都不错得到惩处,且最先从Structures窗口下手。
胪列 窗口enums 可列举,界说胪列类型
5、IDA 常用诞生 快照由于 IDA 不提供消释的功能,要是你不防御按到某个键,导致ida数据库发生了改变,就得再行来过,是以要紧记在无为操作的时候,加上快照:file --> take database snapshot 加完快照后,会生成一个新的 ida 数据库文献,本色上是有点像另存的操作
快捷键:ctrl+shift+w
恢回应始布局 view --> open subviews: 不错回应你意外中关闭的数据流露窗口windows --> reset desktop:不错回应运转 ida 布局。约略回应GUI诞生,即回到默许视图,但不会改变任何完成的任务或者反汇编责任。Windows-Save desktop :保存这个新的视图,从而变成个东谈主的视图作风option --> font: 不错改变字体的探究属性 在经过视图中添加地址偏移IDA 中的经过视图不错说瑕瑜常的好用,脍炙生齿地能看出轨范的推论经过,尤其是在看 if 分支代码和轮回代码的时候,或者止境直不雅
图片
可是,咱们还不错改得愈加好用,在这个视图中添加地址偏移的话,咱们取地址就止境绵薄,不再需要按空格切换视图去找,在菜单栏中诞生:option --> general
图片
将该选项打钩后就不错看到效用了:
图片
自动添加反汇编疑望这个功能关于萌新来说止境友好,在刚刚入门汇编的时候, 未免遭遇几个不常用的蛇皮汇编指示,就得我方一个个去查,很贫穷,开启了自动疑望的功能后,IDA就不错径直告诉你汇编指示的意思意思
相通是在菜单栏中诞生:option --> general
图片
效用如下:
图片
导入 jni.h 分析 jni 库函数找到 jni.h 文献,单独复制一份并修改复制的文献如下:
图片
导入修改后 jni.h 文献( 快捷方式:Ctrl + F9 ---> 聘请 jni.h 头文献 ):
图片
6、IDA 常用操作 创建 数组在操作IDA的时候,无为会遭遇需要创建数组的情况,尤其是为了能绵薄咱们看字符串的时候,创建数组显得止境必要,以下我冒昧找了个数据来创建数组
最先点击选中你念念要更始成数组的一块区域:
图片
接着在菜单栏中聘请:edit --> array,就会弹出如下的选项框
图片
底下来诠释一下各个参数的意思意思:
Array element size 这个值暗示各数组元素的大小(这里是1个字节),是把柄你选中的数据值的大小所决定的Maximum possible size 这个值是由自动计较得出的,他暗示数组中的元素的可能的最大值Array size 暗示数组元素的数量,一般都把柄你采用的自动产生默许值Items on a line 这个暗示指定每个反汇编行流露的元素数量,它不错减少流露数组所需的空间Element print width 这个值用于样式化,当一瞥流露多个款式时,他限度列宽Use “dup” construct :使用重叠结构,这个选项不错使得疏导的数据值合并起来,用一个重叠说明符组合成一项Signed elements 暗示将数据流露为有象征数如故无象征数Display indexes 流露索引,使得数组索引以成例的样子流露,要是选了这个选项,还会启动右边的Indexes选项栏,用于聘请索引的流露样式Create as array 创建为数组,这个一般默许选上的创建好了以后,就变成了这么:
图片
不错看到这些数据照旧被当成一个数组折叠到了一齐,其中2 dup(0FFh)这么的,暗示有两个重叠的数据0xff
经过图 折叠经过图中的分支在经过视图中,分支过多的时候,不错在窗口标题处右击聘请group nodes,就能把现时块折叠起来
图片
效用如下:
图片
分支块是不错我方定名的,绵薄我方逆向阐明
函数调用图菜单栏中:view --> graphs --> Function calls(快捷键Ctrl+F12)
图片
这个图能很了了地看到函数之间是如何相互调用的
函数经过图菜单栏中:view --> graphs --> flowt chart(快捷键F12)
图片
这个其实跟IDA自带的反汇编经过视图差未几,他不错导出来看成单独的一张图
创建结构体: 手工创建结构体创建结构体是在 IDA 的 structures 窗口中进行的,这个操作在堆漏洞的pwn题中无为使用
图片
不错看到,这里照旧存在了四个结构体,轨范本人存在的,不错右击聘请hide/unhide,来看具体的结构体的内容
图片
创建结构体的快捷键是:insert
图片
在弹出的窗口中,不错剪辑结构体的名字
这底下有三个复选框,第一个暗示流露在现时结构体之前(就会排列在第一位,否则排列在你鼠标采用的位置),第二个暗示是否在窗口中流露新的结构体,第三个暗示是否创建连合体。
需要持重的是,结构体的大小是它所包含的字段大小的总额,而连合体的大小则等于其中最大字段的大小
在单击ok以后,就定好了一个空的结构体:
图片
将鼠标放在 ends这一瞥,单击快捷键D即可添加结构体成员,成员的定名默许是以field_x暗示的,x代表了该成员在结构体中的偏移
图片
同期,不错把鼠标放在结构体成员所在的行,按D,就不错切换不同的字节大小
默许情况下可供聘请的就唯独db,dw,dd(1,2,4字节大小)
要是念念添加型的类型,不错在option-->setup data types(快捷键Alt+D),进行诞生
图片
如图,勾选了第五个和第九个的话,就会出现 dq 和 xmmword 了(代表了8字节和16字节)
图片
要是要添加数组成员则不错对着成员所在的那一瞥,右击聘请array
图片
如图,要创建的是16个元素的4字节数组
要是要删除结构体,那么对着结构体按下delete键即可删除
要是要删除成员,则对着成员按下u(undefine)可是需要持重的是,这里只是删除了成员的名字,而莫得删除它所分派的空间
如图,咱们删除了中间的field_10的数组成员:
图片
会变成这么:
图片
数组所分派的20个字节的空间并莫得被删除,这时要是要删裁撤这些空间,就需要在蓝本数组成员所在的第一瞥中按下Ctrl+S,删除空间(Edit-->shrink struct types)
就不错着实的删裁撤成员
给结构体的成员重定名不错用快捷键N
咱们在IDA中创建好了结构体以后,即是去应用它了
如图,这是一个典型的堆的题目
图片
不错看到v1是一个新建的chunk的地址指针,尔后的操作都是往chunk不同的偏移位置写入内容,为了绵薄咱们逆向不雅察,不错将其变成一个结构体,通过v1 v1+4 v1+0x48 这么的偏移,创建好结构体后,将char *v1的类型改成mail *v1,(快捷键Y不错改变函数、变量的类型和参数)这个mail是咱们创建的结构体的称呼,效用如下:
图片
导入C谈话声明的结构体履行上,IDA有提供一个更绵薄的创建结构体的方法,即是径直写代码导入
在View-->Open Subviews-->Local Types中不错看到土产货已有的结构体,在该窗口中右击insert
不错添加新的结构体:
图片
这么就导入了新的结构体:
图片
但同期咱们发现structure视图里面,并莫得这个结构体,咱们需要对着my_structure右击,聘请 synchronize to idb
这么structure视图就有了,如图
图片
这里你会发现,多出来两个db的undefined的成员,这是因为ida默许是会把结构体长入4字节对王人的,知足结构体的大小为0x28
IDA 动态调试 elf:这里以一个在Ubuntu诬捏机中的 elf 为例子,进行调试。最先把 ida 目次中的 dbgsrv 文献夹 中的linux_server64 拷贝到 Ubuntu 的 elf 的文献夹下,这个 elf 是 64 位的统统用的是 linux_server64,要是调试的是 32 位的轨范,就需要拷贝 linux_server 紧记给他们权限,然后在终局运行,这个轨范的作用就像是联接ida和诬捏机中elf的桥梁
图片
然后再到ida中进行成立:
在菜单栏中聘请:debugger --> process options
图片
持重,application 和 input file 都是填写在诬捏机中的 elf 的旅途,紧记要加文献名 而 directory 填写 elf 所在目次,毋庸加文献名 hostname 是诬捏机的 ip 地址,port 是默许的联接端口 parameter 和 password 一般都毋庸填 诞生好了以后点击 ok
接着不错径直在反汇编视图中下断点,只重心击左边的小蓝点即可
图片
这时按下快捷键 F9,不错径直脱手调试
按下快捷键 F4,则径直运行到断点处停驻
图片
这个即是基本的各个功能区的先容,上头是我比拟可爱的常用布局,和 ida 默许的不太一样,念念要自界说添加一些视图的话,不错在 debugger --> quick debug view 中添加
另外不错在 Windows --> save desktop 来保持现时的视图布局,以后就不错径直加载使用
底下先容一些常用的快捷键
F7 单步步入,遭遇函数,将参加函数代码里面F8 单步步过,推论下一条指示,不参加函数代码里面F4 运行到光标处(断点处)F9 连续运行CTRL+F2 断绝一个正在运行的调试程度CTRL+F7 运行至复返,直到遭遇RETN(或断点)时才罢手.
知谈了这些快捷键后,调试起来就比拟容易了,ida 调试有个比拟绵薄的所在在于能径直看到函数的着实地址,下断点也止境直不雅易操作
IDA-pythonIDAPython官方函数文档: https://hex-rays.com/documentation/
IDC函数官方文档查询: IDC函数
在 IDA 的最底下有个不起眼的 Output Window 的界面,其实是一个终局界面,这里有 python 终局和 IDC 终局
图片
在 IDA 的诳骗中,咱们无为需要计较地址,计较偏移,就不错径直在这个终局界面进行操作,止境绵薄
IDA Python 常见模块先容与剧本使用。在IDA中,有三个环节的库,分别是: IDC、idautils、idaapi
IDC 他是封装 IDA 与 IDC 函数的兼容性模块.Idautils 这个是 IDA 提供给咱们的一个高档实用的模块.idaapi 他不错允许咱们走访愈加底层的数据.在 IDA 中咱们要使用剧本有三种方式
第一种 :不错径直按 shift + F2 快捷键调出界面,也不错径直在菜单中聘请敕令剧本.第二种 :不错是写一个剧本文献径直进行援用。第三种:径直在 IDA 底部写敕令。
天然上头说的只是很约略的 python 用法,着实的IDA-python的用法是这么的:
这里以约略的一谈逆向题来作念个例子
图片
这个轨范很约略,一脱手来个for轮回,把judge函数的内容全部异或0xc,这么就导致了轨范一运行就会径直破碎掉judge函数
图片
从而使得没法进行后头的flag判断
这里咱们就需要写一个剧本来先把被破碎的内容还原,这里 IDA 提供了两种写剧本操作的方法,一种即是 IDC 剧本,一种即是 python 剧本
这里只约略的先容 IDA-python
而 IDA-python 通过三个 python 模块将 python 代码注入 IDA 中:
idaapi 模块发达走访中枢IDA APIidc 模块发达提供IDA中的统统函数功能idautils 模块发达提供大都实用函数,其中许多函数不错生成各式数据库探究对象的python列表统统的 IDApython 剧本会自动导入 idc 和 idautils 模块,而 idaapi 模块得我方去导入
这里贴上 IDApython 的官方函数文档 https://www.hex-rays.com/products/ida/support/idapython_docs/,这里包含了统统函数,值得一看。
针对以上的题目,咱们只需要作念一个剧本,指定 judg 函数的 0-181 界限的字节异或 0xc,即可回应
judge=0x600B00for i in range(182): addr=0x600B00+i byte=get_bytes(addr,1)#获取指定地址的指定字节数 byte=ord(byte)^0xC patch_byte(addr,byte)#打patch修改字节
在菜单栏中 file --> script file,加载 python 剧本
接着在 judge 函数中 undefined 掉蓝本的函数,在再行生成函数(快捷键 p),就不错再行 f5 了 剧本中出现的函数都是照旧封装在 idc 模块中的,具体可查官方文档
图片
这只是一个约略的 IDApython 的使用例子,履行上这个功能止境开阔,能弄出止境骚的操作
pycharm 搭建 ida python 环境在 PyCharm 中写 IDAPython 剧本:https://blog.csdn.net/qq_45323960/article/details/125493588
先添加 诠释器,在添加 自界说旅途。旅途聘请 IDA Pro 7.7\python\3 (3 和 2 暗示 Python3 和 Python2 )
图片
之后就不错使用 PyCharm 的智能补全编写 IDAPython 轨范了。
这个方法只是在pycharm中编写轨范,同期使用pycharm的代码补全,运行是使用ida聘请文献运行
用 pycharm 调试 idapython 剧本:
python.exe -m pip install pydevd
pycharm中这么诞生
图片
然后诞生要调试的轨范
图片
这句话相当于插入一个断点
临了先运行pycharm 端的先比及起,然后翻开 ida 即可。
IDA 剧本 pythonIDA 的剧本谈话 --- IDC其中,python谈话就毋庸过多的先容了,底下约略先容一下IDC谈话。
在IDA软件的匡助选项中,包含着对IDC谈话的语法和函数的先容(相当于官方说明/API手册),如下图所示。
图片
一些常见的 IDC 函数先容如下(包括但不限于,用到可查询API手册)——
(1)读取和修改数据的函数
图片
(2)用户交互函数
图片
(3)字符串支配函数
图片
(4)代码交叉援用函数
图片
在 IDA 中运行 python、IDC 剧本/敕令 有三种方式,如下图所示。
图片
剧本示例。胪列一个函数的调用方。
图片
IDA 插件A.基础:插件开发:c++开发的dll文献。具体的学问(如插件的开发、装配、推论等)不错参考《IDA Pro巨擘指南》中第17章的内容。
B.常见插件:IDA 中自带的插件如下图所示。
图片
官方 获奖 插件:https://plugins.hex-rays.com/
(1)静态分析
IDA FLIRT Signature Database——用于识别静态编译的可推论文献中的库函数IDA signsrch——寻找二进制文献所使用的加密、压缩算法IDA scope——自动识别windows函数和压缩、加密算法Ponce—— 弱点分析和象征化推论器具snowman decompiler——C/C++反汇编插件(F3 进行反汇编)keystone—— 二进制文献修改器具,不错径直修改汇编CodeXplorer——自动类型重建以及对象浏览(C++)(jump to disasm)IDA Ref——汇编指示疑望(救援arm,x86,mips)Hexlight——大括号高亮匹配及跳转(B跳转到匹配括号)auto re——函数自动重定名nao——dead code 破除HexRaysPyTools——类/结构体创建和虚函数表检测findcrypt-yara——寻找常用加密算法中的常数(2)动态调试
IDA sploiter——漏洞利用开发器具,寻找gadgetDIE——动态调试增强器具,保存函数调用高下文信息sk3wldbg——IDA动态调试器,救援多平台idaemu——模拟代码推论(救援X86、ARM平台)
(3)其他
Keypatch --- ida补丁神器IFLFRIEND—— 用于矫正反汇编,将将寄存器/指示文档径直带入IDA视图的IDA插件。x86emu——镶嵌式x86模拟器Lighthouse—— IDA Pro 的代码狡饰资源料理器AndroidAttacherpython Editor—— 在 ida 中运行剧本文献和应用轨范。ret-sync—— ret-sync stands for Reverse-Engineering Tools synchronization. It’s a set of plugins that help to synchronize a debugging session (WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg) with IDA disassembler. The underlying idea is simple: take the best from both worlds (static and dynamic analysis).让调试器(WinDbg / GDB / LLDB / OllyDbg / OllyDbg2 / x64dbg)与IDA同步的一个插件。
IDAPython 剧本编写指南
:https://www.cnblogs.com/TJTO/p/13216673.html:https://www.cnblogs.com/TJTO/p/13284864.html Map 文献从 IDA 到 OD什么是 MAP 文献?
约略地讲, MAP 文献是轨范的全局象征、源文献和代码行号信息的唯一的文本暗示方法,它不错在职何所在、任何时候使用,不需要有额外的轨范进行救援。而且,这是唯一能找出轨范崩溃的所在的救星。
在逆向分析的时候IDA可疑取得比拟详备的map文献信息,同期结合OD动态调试将IDA均分析出的map文献导入到OD中不错起到渔人之利的效用。
IDA与OD导出使用map文献:菜单栏 ---> File ---> Produce file ---> Creat MAP file
使用IDA导出map文献时,在不需要Label信息的情况下,不要选中"dummy names"选项,否则在Ollydbg中使用LoadMapEx(by forever)加载时,会将OD的疑望替换掉
关于 dummy names,IDA匡助中的诠释是这么:
Dummy names are automatically generated by IDA. They are used to denote subroutines, program locations and data.
化名字被艾达自动生成。他们是用来暗示子轨范、轨范的位置和数据。
Dummy names have various prefixes depending on the item type and value:
假的名字有不同的前缀把柄款式类型和值:
sub_ instruction, subroutine start locret_ 'return' instruction loc_ instruction off_ data, contains offset value seg_ data, contains segment address value asc_ data, ascii string byte_ data, byte (or array of bytes) word_ data, 16-bit (or array of words) dword_ data, 32-bit (or array of dwords) qword_ data, 64-bit (or array of qwords) flt_ floating point data, 32-bit (or array of floats) dbl_ floating point data, 64-bit (or array of doubles) tbyte_ floating point data, 80-bit (or array of tbytes) stru_ structure (or array of structures) algn_ alignment directive unk_ unexplored byte
使用OD载入导出的 map 文献
图片
打 PATCH打 patch,其实即是给轨范打补丁,本色上是修改轨范的数据,指示等,这在 CTF 中的 AWD 赛制中无为用到,发现轨范漏洞后无意就要用这个功能给轨范打好 patch,精明其他军队报复咱们的gamebox
这里,我是用一个叫 keypatch 的插件进行操作的,IDA 自带的 patch 功能不太好用
装配 keypatch这个很约略,教程在 https://github.com/keystone-engine/keypatch
下载 Keypatch.py 复制到插件目次
IDA 7.0\plugins\Keypatch.py
下载装配 keystone python 模块,64位系统只需要装配这一个就行
https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi
装配好后,你就会发现这里有个 keypatch 的选项
图片
修改轨范指示要是咱们要修改轨范本人的指示,若何作念呢
图片
如图,咱们要修改 63h 这个值
将鼠标指向该行,按快捷键 Ctrl+Alt+K
图片
径直输入汇编语句即可修改,打好 patch 后效用如图:
图片
这里会生成疑望告诉你,这里打过 patch,止境东谈主性化
接着还要在菜单栏进行诞生才能着实使得 patch 见效
图片
这么一来,蓝本的轨范就照旧被修改了
消释 patch要是不防御打错了 patch,就不错在这里进行消释上一次 patch 的操作了
图片
可是要是打了许屡次patch,不好分清该消释哪一次的patch,那么不错在菜单栏中翻开patched bytes界面
图片
看到统统的patch,要消释哪一个就右击聘请 revert
图片
IDA 导出数据文献在菜单栏中,这里有个选项不错生成各式不同的输出文献
图片
这里约略的先容前两个文献,后头的全球不错我方去生成测试一下用途,我这里就不详备先容了
.map 文献 描摹二进制文献的总体结构,包括与组成改二进制文献的节关联的信息,以及每个节中象征的位置。.asm文献,也即是汇编了,径直能导出ida中反汇编的驱逐,这个止境实用,有的时候在逆向中无为遭遇大都数据加解密的情况,要是在从IDA中一个个逐步复制可就太没效用了,径直导降生成asm,在里面复制数据快许多 IDA常见定名真义IDA 无为会自动生成化名字。他们用于暗示子 "函数,轨范地址和数据"。
把柄不同的类型和值化名字有不同前缀
sub 指示和子函数滥觞 locret 复返指示 loc 指示off 数据,包含偏移量 seg 数据,包含段地址值asc 数据,ASCII字符串 byte 数据,字节(或字节数组)word 数据,16位数据(或字数组) dword 数据,32位数据(或双字数组)qword 数据,64位数据(或4字数组) flt 浮点数据,32位(或浮点数组)dbl 浮点数,64位(或双精度数组) tbyte 浮点数,80位(或推广精度浮点数)stru 结构体(或结构体数组) algn 对王人指示unk 未处理字节
IDA 中有常见的说明象征,如 db、dw、dd 分别代表了1个字节、2个字节、4个字节
IDA 反编译报错目前来说, 我遭遇的反编译报错的情况,一般是两种
一是由于轨范存在动态加密,导致轨范的某些代码段被修改,从而反编译出错,这种情况,就需要去使用 IDA-python 解密一波,再进行 F5 反汇编
二是由于某些哲学问题,径直领导了某个所在出错,一般来说,就按照 IDA 的领导,去进行修改。
比如,出现如下报错
图片
那咱们就去找 413238 这个地址的所在,领导是说 sp 指针的值莫得被找到,说明是这里出错了,那么就去修改sp的值,修改方法如下:
图片
也不错使用快捷键 Alt+K
有的时候,遭遇的这种报错
图片
就尝试着把报错的地址的汇编语句改一哈,改成 nop,就不错惩处问题
目前来说,我遭遇报错的情况未几,一般都不错通过以上方法惩处
成立 IDA在 ida 的根目次的 cfg 文献夹是特意用来存储成立文献的
ida 的主成立文献为 ida.cfg,另外的还有 idagui.cfg,idatui.cfg 这两个成立文献对应 IDA 的 GUI 成立和文本模式的版块
一、ida.cfg该文献包含了option-->general中的统统选项的成立,不错通过选项中的描摹在成立文献总找到相应的选项
这里举几个例子:
SHOW_AUTOCOMMENTS 暗示是否自动生成汇编指示的疑望
GRAPH_SHOW_LINEPREFIXES 暗示是否在经过限度视图中流露地址
VPAGESIZE 暗示内存疗养参数,当处理止境大的输入文献时,IDA可能呈文内存不及而无法创建新数据库,在这种情况下增大该参数,再行翻开输入文献即可惩处问题
OPCODE_BYTES 暗示要流露的操作码字节数的默许值
INDENTATION 暗示指示缩进的距离
NameChars 暗示IDA救援的变量敕令使用的字符集,默许是数字+字母还有几个特殊象征,要是需要添加就改变该参数
二、idagui.cfg这个文献主要成立默许的GUI行动,键盘的快捷键等,这个很少需要修改,不作念过多先容。感兴味的不错我方翻开该文献不雅察,并不难解,改改快捷键如故很容易的
三、idatui.cfg这个似乎愈加不常用。。。未几说了
需要持重的是,以上三个文献是默许成立,也即是说,每次打始创建新的ida数据库的时候,都会以这三个成立文献的诞生进行创建,之前临时在菜单栏的诞生就会消释,要永恒诞生ida的成立,就改这三个文献
但,但凡都有例外,在option-->font和option-->colors这两个选项是全局选项,修改一次就永恒见效的,毋庸在以上三个成立文献中改
x86 汇编指示在反汇编窗口中大多是 eax, ebx, ecx, edx, esi, edi, ebp, esp 等。这些都是 X86 汇编谈话中 CPU 上的通用寄存器的称呼,是32位的寄存器。这些寄存器相当于C谈话中的变量。
EAX 是”累加器”(accumulator), 它是许多加法乘法指示的缺省寄存器。EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址。ECX 是计数器(counter), 是重叠(REP)前缀指示和LOOP指示的内定计数器。EDX 则老是被用来放整数除法产生的尾数。ESI/EDI 分别叫作念”源/谋划索引寄存器”(source/destination index),因为在许多字符串操作指示中, DS:ESI指向源串,而ES:EDI 指向谋划串。EBP 是”基址指针”(BASE POINTER), 它最无为被用作高档谈话函数调用的”框架指针”(frame pointer)。ESP 特意用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。还有一些指示,如:mov,jmp等。 数据迁移指示 MOV 出动MOVC 程式缅念念体出动MOVX 外部RAM和推广I/O口与累加器A的数据传送指示PUSH 放入堆叠POP 由堆叠取回XCH 8位元交换XCHD 低4位元交换SWAP 曲折4位元交换 算术指示 ADD 两数相加ADDC 两数相加再加CSUBB 两数相减再减CINC 加一指示DEC 减一指示MUL (MUL AB乘法指示仅此一条)相乘指示,所得的16位二进制数低8位存累加器A高8位存BDIV (DIV AB 除法指示仅此一条)相除指示,所得商存A,尾数存BDA (DA A 只此一条指示)疗养为十进数 逻辑指示 ANL作念AND(逻辑与)运算ORL作念OR(逻辑或)运算XRL 作念(逻辑异或)运算CLR 破除为0CPL 取反指示RL 不带进位左环移RLC 带进位左环移RR 不带进位右环移RRC 带进位右环移 限度迁移类指示 JC C=1时跳JNC C=0时跳JB 位元=1时跳JNB 位元=0时跳JBC 位元=1时跳且破除此位元LCALL 长调用子轨范ACALL 实足调用子轨范RET 由副程式复返RETI 由中断副程式复返AJMP 实足迁移SJMP 相对迁移JMP @A+DPTR 散转,相对DPTR的盘曲迁移JZ A=0时跳JNZA 0时跳CJNE 二数比拟,不相配时跳DJNZ 减一,不等於0时跳NOP 空操作 位变量指示 SETB 设定为1ORG 轨范脱手,章程轨范的肇始地址END 轨范结尾EQU 等值指示(先赋值后使用)例:SUM EQU 30HDB 界说字节指示DW 界说字内容DS 界说保留一定的存贮单元数量BIT 位地址象征指示 例:SAM BIT P1.0RET 子轨范复返指示RETI 中断子轨范复返指示$ 本条指示地址了解这一些,服气全球不错更快的上手 IDA 这个利器了!
示例:IDA pro 调试 exe:https://zhuanlan.zhihu.com/p/80751993
通过一个约略的题来了解一下 IDA 的基本操作,题目是 bugku 的一个约略的逆向,Easy_re。
将题面前载下来,发现是一个exe可推论文献,先运行一下望望
图片
有一些字符串领导,让你输入一个字符串,领导输入flag,冒昧输入几个字符,看一下有什么领导。
然后脱手参加分析阶段,最先通过 Detect It Easy 这个软件稽查一下轨范的基本信息。
图片
这一步咱们主要念念看一下轨范时32位如故64位的,通过上图不错看到轨范属于32位轨范。然后咱们通过 IDA 对轨范进行分析,IDA 是一个静态反编译软件,用来静态的分析软件,咱们在32位的IDA中翻开re1.exe(要是轨范时64位的需要用64位的IDA翻开),他会弹出弹窗,这里毋庸管,一齐点“是(或者ok)”就行了,然后界面如下。
图片
一进来,最大的那片区域为反汇编窗口,左边为函数窗口,在反汇编窗口按空格键,会在图形视图和列表视图之间切换。然后分析轨范一般先从字符串脱手,翻开字符串窗口,View --> open subviews --> Strings,或者快捷键shift+F12。
图片
轨范中每每包含许多字符串资源,这些资源存在于 PE 文献的 rdata 段,不错看到运行轨范时出现过的 "DUTCTF" 字符串,双击它找到他的位置
图片
图片
图片
不错看到 aDutctf 字符串周围还有许多字符串,咱们把它们都变成可流露字符,驱逐如下,由于本题比拟约略,是以径直出现了flag。
图片
天然,本文是为了先容 IDA 的使用,是以咱们连续往下分析,找到要津的字符串后,在字符串的位置,按快捷键x,稽查轨范在那儿援用了它,比如这谈题莫得给出 flag,咱们需要在领导信息处(也即是 aDutctf 的位置)按快捷键x,不错看到唯唯零丁援用了它。
图片
咱们跟进去看一下,找到了援用它的位置,这一步是 为了找到轨范的主要逻辑 在哪,因为有时候IDA 可能分析不出函数名来,你就没主义通过左边的函数窗口定位轨范的主要逻辑位置,也有可能轨范的主要逻辑不在 main 函数里,在一个其他的函数里。
是以说,先运行轨范,找到轨范运行时出现的领导字符,然后定位领导字符出现的位置,用这么的方法来找轨范的主要逻辑比拟靠谱一些。
图片
找到了要津位置后,发现是一堆汇编代码,看不懂若何办?IDA 的开阔之处还在于他不错将分析的轨范以伪代码的样子给出,快捷键为F5(不是统统轨范都能以伪代码的样子流露,也不是统统函数都能以伪代码的样子流露,要是没主义流露伪代码,那只可刚汇编了),下一步即是分析轨范的逻辑了,至于若何分析,这里就未几赘述了。
图片
在关闭 IDA 的时候他会领导你是否保存 database,你不错聘请保存,下次用 IDA 翻开这个轨范的时候不错加载这个数据库,里面保存了你前次的操作。
底下给出了一些常用的快捷键
图片
参考:IDA Pro 巨擘指南 (第2版)
示例:IDA Pro 动态调试 so********************* 前提条款 和 运行环境 一定要写了了,否则会有许多坑,坑死东谈主。 *********************
雷电、蓝叠的 cpu 是 x86 的,ida不可宽泛调试,需要用 Android 编译器自带的创建模拟器。 ida 模拟器动态调试,当推论到断点时会出现失实。可是不错用 Android studio 创建模拟器会出现底下的选项,聘请 Other Images 选项,这时显泄露 armeabi-v7a,聘请这个创建模拟器,即是 arm 的模拟器不是 x86,能宽泛调试。
图片
IDA 动态调试 AndroidIDA 静态分析 与 动态分析:https://zhuanlan.zhihu.com/p/38983223
IDA 动态调试:https://zhuanlan.zhihu.com/p/145383282
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码):https://zhuanlan.zhihu.com/p/23321571
IDA动态调试android的so文献(二):https://blog.csdn.net/binbin594738977/article/details/106070388
在调试 so 库的时候 先推论.init_array 其次 JNI_OnLoad,在调试 so 库的许多时候要双开 IDA 动静太结合的双调,因为 IDA 在编译的过程不可全部展示所要调用的函数,指针还有内存地址
动态调试 总览:https://blog.csdn.net/AHuqihua/article/details/127269887
1. 将IDA pro下的android_server出动到android手机中, 并运行,得手后不要关闭该cmd 2, 新建设cmd, 端口转发: # 前边是电脑的端口,后头是手机的端口 adb forward tcp:23946 tcp:23946 # 调试模式翻开APP, 否则IDA发现不了该APP adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity 3. 参加IDA,聘请对应的轨范,参加调试窗口。并记好该app对应的PID. 4. adb forward tcp:8700 jdwp:(APP程度号) 5. jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 6. 在IDA中进行调试。
手机端 推论 android_server ,恭候 IDA Pro 的联接Android未root环境下使用IDA调试:https://blog.csdn.net/lsg305/article/details/103638118
1. 复制 android_server 文献到手机的 /data/local/tmp 目次下。 敕令:adb push IDA_Pro\dbgsrv\android_server /data/local/tmp2. 添加权限,并推论 android_server adb shell su cd /data/local/tmp chmod 777 android_server ./android_server // 启动 android_server3. 端口转发。敕令:adb forward tcp:23946 tcp:239464. 启动被调试的 APP:敕令:adb shell am start -D -n com.cmxxzwy.mz/com.e4a.runtime.android.mainActivity。加了 -D 参数,此时 Android 劝诱上会给出领导:“Waiting For Debugger”,暗示正在恭候调试器的指引。【持重:也不错让 APP 宽泛启动,然后 IDA 依然不错 attach 到照旧运行的程度上,可是这么无法调试到 APP 启动阶段的逻辑。】图片
用 am 启动被调试应用 ( am是activity manager的缩写 )
欧美成人在线播放am启动轨范敕令:am start -D -n com.example.testarm/.MainActivity
am start -D -n 调试模式翻开应用 com.example.testarm 要调试启动的包名 .MainActivity 要启动的 MainActivity
启动后恭候调试器的指引。
IDA Pro 诞生 调试,联接到手机上的 android_server 并进行调试 1. IDA菜单栏 ---> debugger ---> attach ---> Remote ARM Linux/android debugger2. debug options 一定要选图片
3. 诞生 host,点击 ok 后,在弹出的程度聘请框 聘请要调试的 com.cmxxzwy.mz 程度。【启动 IDA Pro。在主菜单聘请:Debugger -> Attach -> Remote ArmLinux/Android debugger。在 setup 对话框中,hostname 输入 127.0.0.1,Port 输入 23946,点击 OK 按钮。此时会出现一个列表,罗列了 Android 劝诱上现时运行的统统程度,找到需要调试的程度点击 OK 按钮。接下来参加了调试器界面:】图片
诞生断点 ( 一定要先下断点再运行,要是有反调试时一运行就崩溃,一切的再行来过 ),然后点击 IDA 的 脱手运行 按钮。【 持重:这里 ida 的运行只是说明 ida 照旧脱手监测断点,可是此时 app 还莫得回应运行,需要使用 jdb 将 app 回应推论】图片
翻开 DDMS,下一步要用
图片
稽查要调试的程度,其中8700代表选中的程度的调试端口,不错是8700也不错是 / 左边的。比如图中的 8677
ddms 照旧废除 ,使用 monitor 替代。
tools/monitor.bat ( java8 才能运行,高版块不行 ),修改 monitor.ini 指定 jdk 版块
图片
用 jdb 将 app 回应推论。
敕令:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
这里的 8700 也不错不写 8700,不错聘请要调试的程度端口亦然不错的,否则你聘请了哪个程度哪个即是8700那么调试的即是哪个
图片
这一步的作用是使轨范回应运行。(持重这时候要是ida里还莫得点击运行,轨范是不会的确连续运行的)。这时候就不错宽泛地在 IDA 里下断调试了。F7参加函数,F8单步履试,F9跳到下一个断点,F2下断点,G调到函数地址
动态、静态 结合调试动态调试的时候濒临的都是 Arm 汇编,阐明才气要跟的上调试速率,这有点难。若何办? 那即是动静态结合调试。咱们来看动态调试窗口
图片
1 为这句代码的动态内存地址。
2 为该so文献的动态内存基地址。
3 为内存段的大小。
静态调试窗口流露的都是代码的相对偏移地址,是以咱们用 1动态内存地址 - 2内存基地址 = 静态相对偏移地址
图片
是以 F24B4 即是静态代码的偏移地址。是以咱们翻开静态调试窗口就不错看到
图片
这么,动态和静态的代码就对上了,用静态的代码来纪录动态调试的位置信息,就不怕调试过程中断带来的贫穷。而且使用 F5 来扶持阐明代码亦然棒棒哒
动态调试过程每每反反复复,敕令有时候懒得再行输入。快捷键 ctrl +c 结尾现时敕令轨范,按高下键输入之前输过的敕令。
跳转到指定地址全是 DCB 数据图片
这个时候不错按 C 键识别为代码,或者按 P 键识别为函数
动态调试 稽查 内存动态调试无为即是为了稽查内存。才略如下
图片
一些 反调试、反反调试 反动态分析最先需要说明的是,一个可推论二进制文献,比如一个 Android native so 库,它本人能作念的事情是有限的,它只可走访 system call,调用系统库函数,走访寄存器、诬捏内存、IO 劝诱等等,仅此辛苦。因此,咱们要是在它的第一条推论指示处下断点,它是无法窒碍咱们的。可是它如故或者使用许多妙技来侵扰调试器的运行,加多咱们的责任量。
持重:Android native so 中最早被推论的代码位于 ELF 的 .init_array section 中,比 JNI_OnLoad 函数中的代码推论更早。
关于底下描摹的各式反动态分析的妙技,咱们最先需要通过静态分析,来阐述被分析二进制文献的检测点,之后,咱们也许不错修改运行环境;也许不错编写特定的 IDA 推广,在运行时骗取被调试二进制的逻辑;也许不错径直修改二进制文献,删除或修改它的检测点或检测条款。
检测诬捏化分析坏心软件时,咱们每每在沙盒或诬捏化环境中调试它。诬捏化环境每每会留住一些踪影,比如使用了某个特定的诬捏硬件象征符;启用了某些诬捏机特定的机制,比如分享剪贴板;运行了某些扶持器具,比如 VMware Tools。
检测特定器具比如检测现时环境是否装配了 Wireshark 积贮捏包器具,坏心软件作家可能会以为宽泛用户不应该装配 Wireshark。
检测运行环境比如发现 Android 环境下存在一个名叫 android_server 的程度在运行,或者 23946 TCP 端口处于监听景象,则断绝程度。
检测调试器Linux / Android 程度在吞并技巧只可被 一个 程度调试,因此 so 库不错 fork 一个子程度,然后尝试 ptrace() attach 它的父程度,要是失败,则 so 库可能正在被调试器调试,此时坐窝断绝程度。
so 启动后也不错径直调用 ptrace(PTRACE_TRACEME, ...),这么后续调试器再调用 ptrace 来 attach 的时候都会失败。
Linux / Android 系统中,要是一个程度正在被调试,则 /proc/self/status 信息中的 TracerPid 项会流露调试器程度的 PID,要是莫得被调试,则 TracerPid 为 0。so 库不错编写逻辑来依期检测这个值。
检测代码推论的时候间隔参加调试器后,由于东谈主为的断点和单步操作,代码段推论的间隔一般都会权臣的拉长,so 库不错加入时候检测逻辑,要是发现大于某个阈值,则断绝程度。
临了通过这一次系统地去学 IDA,发现这个软件的确瑕瑜常强横,IDA还有许多高档的开发妙技,致使你还能自界说模块和加载器等,也能我方制作 ida 的插件,在这个过程中,发现看书的确很环节,我方看书和看网上别东谈主记忆的,完全不一样,搞二进制如故得鲁人持竿打好基础。
《 二进制分析实战》
图片
本站仅提供存储行状,统统内容均由用户发布,如发现存害或侵权内容,请点击举报。