教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

二进制文件(二进制文件分析工具)

  二进制文件(二进制文件分析工具)
  Radare2 是一个为二进制分析定制的开源工具。
  在《Linux 上分析二进制文件的 10 种方法》中,我解释了如何使用 Linux 上丰富的原生工具集来分析二进制文件。但如果你想进一步探索你的二进制文件,你需要一个为二进制分析定制的工具。如果你是二进制分析的新手,并且大多使用的是脚本语言,这篇文章《GNU binutils 里的九种武器》可以帮助你开始学习编译过程和什么是二进制。
  为什么我需要另一个工具?
  如果现有的 Linux 原生工具也能做类似的事情,你自然会问为什么需要另一个工具。嗯,这和你用手机做闹钟、做笔记、做相机、听音乐、上网、偶尔打电话和接电话的原因是一样的。以前,使用单独的设备和工具处理这些功能 —— 比如拍照的实体相机,记笔记的小记事本,起床的床头闹钟等等。对用户来说,有一个设备来做多件(但相关的)事情是方便的。另外,杀手锏就是独立功能之间的互操作性。
  同样,即使许多 Linux 工具都有特定的用途,但在一个工具中捆绑类似(和更好)的功能是非常有用的。这就是为什么我认为 Radare2应该是你需要处理二进制文件时的首选工具。
  根据其 GitHub 简介,Radare2(也称为 r2)是一个"类 Unix 系统上的逆向工程框架和命令行工具集"。它名字中的 "2" 是因为这个版本从头开始重写的,使其更加模块化。
  为什么选择 Radare2?
  有大量(非原生的)Linux 工具可用于二进制分析,为什么要选择 Radare2 呢?我的理由很简单。
  首先,它是一个开源项目,有一个活跃而健康的社区。如果你正在寻找新颖的功能或提供着 bug 修复的工具,这很重要。
  其次,Radare2 可以在命令行上使用,而且它有一个功能丰富的图形用户界面(GUI)环境,叫做 Cutter,适合那些对 GUI 比较熟悉的人。作为一个长期使用 Linux 的用户,我对习惯于在 shell 上输入。虽然熟悉 Radare2 的命令稍微有一点学习曲线,但我会把它比作 学习 Vim。你可以先学习基本的东西,一旦你掌握了它们,你就可以继续学习更高级的东西。很快,它就变成了肌肉记忆。
  第三,Radare2 通过插件可以很好的支持外部工具。例如,最近开源的 Ghidra二进制分析和逆向工具reversing tool很受欢迎,因为它的反编译器功能是逆向软件的关键要素。你可以直接从 Radare2 控制台安装 Ghidra 反编译器并使用,这很神奇,让你两全其美。
  开始使用 Radare2
  要安装 Radare2,只需克隆其存储库并运行user.sh脚本。如果你的系统上还没有一些预备软件包,你可能需要安装它们。一旦安装完成,运行r2 -v命令来查看 Radare2 是否被正确安装:$gitclonehttps://github.com/radareorg/radare2.git$cdradare2$./sys/user.sh#version$r2-vradare24.6.0-git25266@linux-x86-64git.4.4.0-930-g48047b317  commit:48047b3171e6ed0480a71a04c3693a0650d03543build:2020-11-17__09:31:03$
  获取二进制测试样本
  现在r2已经安装好了,你需要一个样本二进制程序来试用它。你可以使用任何系统二进制文件(ls、bash等),但为了使本教程的内容简单,请编译以下 C 程序:$catadder.c#include$gccadder.c-oadder$fileadderadder:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked,interpreter/lib64/ld-linux-x86-64.so.2,forGNU/Linux3.2.0,BuildID[sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240,notstripped$./adderNumbernowis:101
  加载二进制文件
  要分析二进制文件,你必须在 Radare2 中加载它。通过提供文件名作为r2命令的一个命令行参数来加载它。你会进入一个独立的 Radare2 控制台,这与你的 shell 不同。要退出控制台,你可以输入Quit或Exit或按Ctrl+D:$r2./adder  --Learnpancakeasifyouwereradare![0x004004b0]>quit$
  分析二进制
  在你探索二进制之前,你必须让r2为你分析它。你可以通过在r2控制台中运行aaa命令来实现:$r2./adder--Sorry,radare2hasexperiencedaninternalerror.[0x004004b0]>  [0x004004b0]>  [0x004004b0]>aaa  [x]Analyzeallflagsstartingwithsym.andentry0(aa)  [x]Analyzefunctioncalls(aac)[x]Analyzelenbytesofinstructionsforreferences(aar)  [x]Checkforvtables  [x]Typematchinganalysisforallfunctions(aaft)  [x]Propagatenoreturninformation  [x]Use-AAoraaaatoperformadditionalexperimentalanalysis.  [0x004004b0]>
  这意味着每次你选择一个二进制文件进行分析时,你必须在加载二进制文件后输入一个额外的命令aaa。你可以绕过这一点,在命令后面跟上-A来调用r2;这将告诉r2为你自动分析二进制:$r2-A./adder  [x]Analyzeallflagsstartingwithsym.andentry0(aa)  [x]Analyzefunctioncalls(aac)  [x]Analyzelenbytesofinstructionsforreferences(aar)  [x]Checkforvtables  [x]Typematchinganalysisforallfunctions(aaft)  [x]Propagatenoreturninformation  [x]Use-AAoraaaatoperformadditionalexperimentalanalysis.--Alreadyup-to-date.[0x004004b0]>
  获取一些关于二进制的基本信息
  在开始分析一个二进制文件之前,你需要一些背景信息。在许多情况下,这可以是二进制文件的格式(ELF、PE 等)、二进制的架构(x86、AMD、ARM 等),以及二进制是 32 位还是 64 位。方便的r2的iI命令可以提供所需的信息:[0x004004b0]>iIarchx86baddr0x400000binsz14724bintypeelfbits64canaryfalseclassELF64compilerGCC:(GNU)8.3.120190507(RedHat8.3.1-4)cryptofalseendianlittlehavecodetrueintrp/lib64/ld-linux-x86-64.so.2laddr0x0langclinenumtruelsymstruemachineAMDx86-64architecturemaxopsz16minopsz1nxtrueoslinuxpcalign0picfalserelocstruerelropartialrpathNONEsanitizfalsestaticfalsestrippedfalsesubsyslinuxvatrue[0x004004b0]>[0x004004b0]>
  导入和导出
  通常情况下,当你知道你要处理的是什么样的文件后,你就想知道二进制程序使用了什么样的标准库函数,或者了解程序的潜在功能。在本教程中的示例 C 程序中,唯一的库函数是printf,用来打印信息。你可以通过运行ii命令看到这一点,它显示了该二进制所有导入的库:[0x004004b0]>ii[Imports]nthvaddrbindtypelibname―――――――――――――――――――――――――――――――――――――10x00000000WEAKNOTYPE_ITM_deregisterTMCloneTable20x004004a0GLOBALFUNCprintf30x00000000GLOBALFUNC__libc_start_main40x00000000WEAKNOTYPE__gmon_start__50x00000000WEAKNOTYPE_ITM_registerTMCloneTable
  该二进制也可以有自己的符号、函数或数据。这些函数通常显示在Exports下。这个测试的二进制导出了两个函数:main和adder。其余的函数是在编译阶段,当二进制文件被构建时添加的。加载器需要这些函数来加载二进制文件(现在不用太关心它们):[0x004004b0]>[0x004004b0]>iE[Exports]nthpaddrvaddrbindtypesizelibname――――――――――――――――――――――――――――――――――――――――――――――――――――――820x000006500x00400650GLOBALFUNC5__libc_csu_fini85----------0x00601024GLOBALNOTYPE0_edata860x000006580x00400658GLOBALFUNC0_fini890x000010200x00601020GLOBALNOTYPE0__data_start900x000005960x00400596GLOBALFUNC15adder920x000006700x00400670GLOBALOBJ0__dso_handle930x000006680x00400668GLOBALOBJ4_IO_stdin_used940x000005e00x004005e0GLOBALFUNC101__libc_csu_init95----------0x00601028GLOBALNOTYPE0_end960x000004e00x004004e0GLOBALFUNC5_dl_relocate_static_pie970x000004b00x004004b0GLOBALFUNC47_start98----------0x00601024GLOBALNOTYPE0__bss_start990x000005a50x004005a5GLOBALFUNC55main100----------0x00601028GLOBALOBJ0__TMC_END__1020x000004680x00400468GLOBALFUNC0_init[0x004004b0]>
  哈希信息
  如何知道两个二进制文件是否相似?你不能只是打开一个二进制文件并查看里面的源代码。在大多数情况下,二进制文件的哈希值(md5sum、sha1、sha256)是用来唯一识别它的。你可以使用it命令找到二进制的哈希值:[0x004004b0]>itmd57e6732f2b11dec4a0c7612852cede670sha1d5fa848c4b53021f6570dd9b18d115595a2290aesha25613dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2[0x004004b0]>
  函数
  代码按函数分组;要列出二进制中存在的函数,请运行afl命令。下面的列表显示了main函数和adder函数。通常,以sym.imp开头的函数是从标准库(这里是 glibc)中导入的:[0x004004b0]>afl0x004004b0146entry00x004004f0441->34sym.deregister_tm_clones0x00400520457->51sym.register_tm_clones0x00400560333->32sym.__do_global_dtors_aux0x0040059016entry.init00x0040065015sym.__libc_csu_fini0x00400658113sym._fini0x00400596115sym.adder0x004005e04101loc..annobin_elf_init.c0x004004e015loc..annobin_static_reloc.c0x004005a5155main0x004004a016sym.imp.printf0x00400468327sym._init[0x004004b0]>
  交叉引用
  在 C 语言中,main函数是一个程序开始执行的地方。理想情况下,其他函数都是从main函数调用的,在退出程序时,main函数会向操作系统返回一个退出状态。这在源代码中是很明显的,然而,二进制程序呢?如何判断adder函数的调用位置呢?
  你可以使用axt命令,后面加上函数名,看看adder函数是在哪里调用的;如下图所示,它是从main函数中调用的。这就是所谓的交叉引用cross-referencing。但什么调用main函数本身呢?从下面的axt main可以看出,它是由entry0调用的(关于entry0的学习我就不说了,留待读者练习)。[0x004004b0]>axtsym.addermain0x4005b9[CALL]callsym.adder[0x004004b0]>[0x004004b0]>axtmainentry00x4004d1[DATA]movrdi,main[0x004004b0]>
  寻找定位
  在处理文本文件时,你经常通过引用行号和行或列号在文件内移动;在二进制文件中,你需要使用地址。这些是以0x开头的十六进制数字,后面跟着一个地址。要找到你在二进制中的位置,运行s命令。要移动到不同的位置,使用s命令,后面跟上地址。
  函数名就像标签一样,内部用地址表示。如果函数名在二进制中(未剥离的),可以使用函数名后面的s命令跳转到一个特定的函数地址。同样,如果你想跳转到二进制的开始,输入s 0:[0x004004b0]>s0x4004b0[0x004004b0]>[0x004004b0]>smain[0x004005a5]>[0x004005a5]>s0x4005a5[0x004005a5]>[0x004005a5]>ssym.adder[0x00400596]>[0x00400596]>s0x400596[0x00400596]>[0x00400596]>s0[0x00000000]>[0x00000000]>s0x0[0x00000000]>
  十六进制视图
  通常情况下,原始二进制没有意义。在十六进制模式下查看二进制及其等效的 ASCII 表示法会有帮助:[0x004004b0]>smain[0x004005a5]>[0x004005a5]>px-offset-0123456789ABCDEF0123456789ABCDEF0x004005a5554889e54883ec10c745fc640000008bUH..H....E.d....0x004005b545fc89c7e8d8ffffff8945f88b45f889E.........E..E..0x004005c5c6bf78064000b800000000e8cbfeffff..x.@...........0x004005d5b800000000c9c30f1f4000f30f1efa41.........@.....A0x004005e5574989d741564989f641554189fd4154WI..AVI..AUA..AT0x004005f54c8d250408200055488d2d0408200053L.%...UH.-...S0x004006054c29e54883ec08e857feffff48c1fd03L).H....W...H...0x00400615741f31db0f1f80000000004c89fa4c89t.1........L..L.0x00400625f64489ef41ff14dc4883c3014839dd75.D..A...H...H9.u0x00400635ea4883c4085b5d415c415d415e415fc3.H...A\A]A^A_.0x0040064590662e0f1f840000000000f30f1efac3.f..............0x00400655000000f30f1efa4883ec084883c408c3.......H...H....0x0040066500000001000200000000000000000000................0x004006750000004e756d626572206e6f77206973...Numbernowis0x0040068520203a2025640a00000000011b033b44:%d........;D0x004006950000000700000000feffff8800000020...............[0x004005a5]>
  反汇编
  如果你使用的是编译后的二进制文件,则无法查看源代码。编译器将源代码转译成 CPU 可以理解和执行的机器语言指令;其结果就是二进制或可执行文件。然而,你可以查看汇编指令(的助记词)来理解程序正在做什么。例如,如果你想查看main函数在做什么,你可以使用s main寻找main函数的地址,然后运行pdf命令来查看反汇编的指令。
  要理解汇编指令,你需要参考体系结构手册(这里是 x86),它的应用二进制接口(ABI,或调用惯例),并对堆栈的工作原理有基本的了解:[0x004004b0]>smain[0x004005a5]>[0x004005a5]>s0x4005a5[0x004005a5]>[0x004005a5]>pdf  ;DATAXREFfromentry0@0x4004d1┌55:intmain(intargc,char**argv,char**envp);│;varint64_tvar_8h@rbp-0x8│;varint64_tvar_4h@rbp-0x4│0x004005a555pushrbp│0x004005a64889e5movrbp,rsp│0x004005a94883ec10subrsp,0x10│0x004005adc745fc640000.movdword[var_4h],0x64;'d';100│0x004005b48b45fcmoveax,dword[var_4h]│0x004005b789c7movedi,eax│0x004005b9e8d8ffffffcallsym.adder│0x004005be8945f8movdword[var_8h],eax│0x004005c18b45f8moveax,dword[var_8h]│0x004005c489c6movesi,eax│0x004005c6bf78064000movedi,str.Number_now_is__:__d;0x400678;"Numbernowis:%d\n";constchar*format│0x004005cbb800000000moveax,0│0x004005d0e8cbfeffffcallsym.imp.printf;intprintf(constchar*format)│0x004005d5b800000000moveax,0│0x004005dac9leave└0x004005dbc3ret[0x004005a5]>
  这是adder函数的反汇编结果:[0x004005a5]>ssym.adder[0x00400596]>[0x00400596]>s0x400596[0x00400596]>[0x00400596]>pdf  ;CALLXREFfrommain@0x4005b9┌15:sym.adder(int64_targ1);│;varint64_tvar_4h@rbp-0x4│;argint64_targ1@rdi│0x0040059655pushrbp│0x004005974889e5movrbp,rsp│0x0040059a897dfcmovdword[var_4h],edi;arg1│0x0040059d8b45fcmoveax,dword[var_4h]│0x004005a083c001addeax,1│0x004005a35dpoprbp└0x004005a4c3ret[0x00400596]>
  字符串
  查看二进制中存在哪些字符串可以作为二进制分析的起点。字符串是硬编码到二进制中的,通常会提供重要的提示,可以让你将重点转移到分析某些区域。在二进制中运行iz命令来列出所有的字符串。这个测试二进制中只有一个硬编码的字符串:[0x004004b0]>iz  [Strings]  nthpaddrvaddrlensizesectiontypestring―――――――――――――――――――――――――――――――――――――――――――――――――――――――00x000006780x004006782021.rodataasciiNumbernowis:%d\n    [0x004004b0]>
  交叉引用字符串
  和函数一样,你可以交叉引用字符串,看看它们是从哪里被打印出来的,并理解它们周围的代码:[0x004004b0]>ps@0x400678Numbernowis:%d[0x004004b0]>[0x004004b0]>axt0x400678main0x4005c6[DATA]movedi,str.Number_now_is__:__d[0x004004b0]>
  可视模式
  当你的代码很复杂,有多个函数被调用时,很容易迷失方向。如果能以图形或可视化的方式查看哪些函数被调用,根据某些条件采取了哪些路径等,会很有帮助。在移动到感兴趣的函数后,可以通过VV命令来探索r2的可视化模式。例如,对于adder函数:[0x004004b0]>ssym.adder[0x00400596]>[0x00400596]>VV
  (Gaurav Kamathe, CC BY-SA 4.0)
  调试器
  到目前为止,你一直在做的是静态分析 —— 你只是在看二进制文件中的东西,而没有运行它,有时你需要执行二进制文件,并在运行时分析内存中的各种信息。r2的内部调试器允许你运行二进制文件、设置断点、分析变量的值、或者转储寄存器的内容。
  用-d标志启动调试器,并在加载二进制时添加-A标志进行分析。你可以通过使用db命令在不同的地方设置断点,比如函数或内存地址。要查看现有的断点,使用dbi命令。一旦你放置了断点,使用dc命令开始运行二进制文件。你可以使用dbt命令查看堆栈,它可以显示函数调用。最后,你可以使用drr命令转储寄存器的内容:$r2-d-A./adderProcesswithPID17453started...=attach1745317453bin.baddr0x00400000Using0x400000asm.bits64[x]Analyzeallflagsstartingwithsym.andentry0(aa)[x]Analyzefunctioncalls(aac)[x]Analyzelenbytesofinstructionsforreferences(aar)[x]Checkforvtables[x]Typematchinganalysisforallfunctions(aaft)[x]Propagatenoreturninformation[x]Use-AAoraaaatoperformadditionalexperimentalanalysis.  --gitcheckouthamster[0x7f77b0a28030]>[0x7f77b0a28030]>dbmain[0x7f77b0a28030]>[0x7f77b0a28030]>dbsym.adder[0x7f77b0a28030]>[0x7f77b0a28030]>dbi00x004005a5E:1T:010x00400596E:1T:0[0x7f77b0a28030]>[0x7f77b0a28030]>afl|grepmain0x004005a5155main[0x7f77b0a28030]>[0x7f77b0a28030]>afl|grepsym.adder0x00400596115sym.adder[0x7f77b0a28030]>[0x7f77b0a28030]>dchitbreakpointat:0x4005a5[0x004005a5]>[0x004005a5]>dbt00x4005a5sp:0x00[main]mainsym.adder+1510x7f77b0687873sp:0x7ffe35ff68580[??]section..gnu.build.attributes-134582059720x7f77b0a36e0asp:0x7ffe35ff68e8144[??]map.usr_lib64_ld_2.28.so.r_x+65034[0x004005a5]>dchitbreakpointat:0x400596[0x00400596]>dbt00x400596sp:0x00[sym.adder]ripentry.init0+610x4005besp:0x7ffe35ff68380[main]main+2520x7f77b0687873sp:0x7ffe35ff685832[??]section..gnu.build.attributes-134582059730x7f77b0a36e0asp:0x7ffe35ff68e8144[??]map.usr_lib64_ld_2.28.so.r_x+65034[0x00400596]>[0x00400596]>[0x00400596]>drrax=0x00000064rbx=0x00000000rcx=0x7f77b0a21738rdx=0x7ffe35ff6948r8=0x7f77b0a22da0r9=0x7f77b0a22da0r10=0x0000000fr11=0x00000002r12=0x004004b0r13=0x7ffe35ff6930r14=0x00000000r15=0x00000000rsi=0x7ffe35ff6938rdi=0x00000064rsp=0x7ffe35ff6838rbp=0x7ffe35ff6850rip=0x00400596rflags=0x00000202orax=0xffffffffffffffff[0x00400596]>
  反编译器
  能够理解汇编是二进制分析的前提。汇编语言总是与二进制建立和预期运行的架构相关。一行源代码和汇编代码之间从来没有 1:1 的映射。通常,一行 C 源代码会产生多行汇编代码。所以,逐行读取汇编代码并不是最佳的选择。
  这就是反编译器的作用。它们试图根据汇编指令重建可能的源代码。这与用于创建二进制的源代码绝不完全相同,它是基于汇编的源代码的近似表示。另外,要考虑到编译器进行的优化,它会生成不同的汇编代码以加快速度,减小二进制的大小等,会使反编译器的工作更加困难。另外,恶意软件作者经常故意混淆代码,让恶意软件的分析人员望而却步。
  Radare2 通过插件提供反编译器。你可以安装任何 Radare2 支持的反编译器。使用r2pm -l命令可以查看当前插件。使用r2pm install命令来安装一个示例的反编译器r2dec:$r2pm-l$$r2pminstallr2decCloninginto'r2dec'...remote:Enumeratingobjects:100,done.remote:Countingobjects:100%(100/100),done.remote:Compressingobjects:100%(97/97),done.remote:Total100(delta18),reused27(delta1),pack-reused0Receivingobjects:100%(100/100),1.01MiB|1.31MiB/s,done.Resolvingdeltas:100%(18/18),done.InstallDoneForr2decgmake:Enteringdirectory'/root/.local/share/radare2/r2pm/git/r2dec/p'[CC]duktape/duktape.o[CC]duktape/duk_console.o[CC]core_pdd.o[CC]core_pdd.sogmake:Leavingdirectory'/root/.local/share/radare2/r2pm/git/r2dec/p'$$r2pm-lr2dec$
  反编译器视图
  要反编译一个二进制文件,在r2中加载二进制文件并自动分析它。在本例中,使用s sym.adder命令移动到感兴趣的adder函数,然后使用pdda命令并排查看汇编和反编译后的源代码。阅读这个反编译后的源代码往往比逐行阅读汇编更容易:$r2-A./adder  [x]Analyzeallflagsstartingwithsym.andentry0(aa)  [x]Analyzefunctioncalls(aac)  [x]Analyzelenbytesofinstructionsforreferences(aar)  [x]Checkforvtables  [x]Typematchinganalysisforallfunctions(aaft)  [x]Propagatenoreturninformation  [x]Use-AAoraaaatoperformadditionalexperimentalanalysis.  --Whatdoyouwanttodebugtoday?  [0x004004b0]>  [0x004004b0]>ssym.adder  [0x00400596]>  [0x00400596]>s  0x400596  [0x00400596]>  [0x00400596]>pdda  ;assembly|/*r2decpseudocodeoutput*/  |/*./adder@0x400596*/  |#include<stdint.h>  |  ;(fcn)sym.adder|int32_tadder(int64_targ1){  |int64_tvar_4h;  |rdi=arg1;0x00400596pushrbp|  0x00400597movrbp,rsp|  0x0040059amovdword[rbp-4],edi|*((rbp-4))=edi;0x0040059dmoveax,dword[rbp-4]|eax=*((rbp-4));0x004005a0addeax,1|eax++;0x004005a3poprbp|  0x004005a4ret|returneax;  |}  [0x00400596]>
  配置设置
  随着你对 Radare2 的使用越来越熟悉,你会想改变它的配置,以适应你的工作方式。你可以使用e命令查看r2的默认配置。要设置一个特定的配置,在e命令后面添加config = value:[0x004005a5]>e|wc-l593[0x004005a5]>e|grepsyntax  asm.syntax=intel  [0x004005a5]>  [0x004005a5]>easm.syntax=att  [0x004005a5]>  [0x004005a5]>e|grepsyntax  asm.syntax=att  [0x004005a5]>
  要使配置更改永久化,请将它们放在r2启动时读取的名为.radare2rc的启动文件中。这个文件通常在你的主目录下,如果没有,你可以创建一个。一些示例配置选项包括:$cat~/.radare2rc  easm.syntax=att  escr.utf8=trueecosolarized  ecmd.stack=trueestack.size=256$
  探索更多
  你已经看到了足够多的 Radare2 功能,对这个工具有了一定的了解。因为 Radare2 遵循 Unix 哲学,即使你可以从它的主控台做各种事情,它也会在下面使用一套独立的二进制来完成它的任务。
  探索下面列出的独立二进制文件,看看它们是如何工作的。例如,用iI命令在控制台看到的二进制信息也可以用rabin2命令找到:$cdbin/$$lsprefixr2agentr2pmrabin2radiff2ragg2rarun2rasm2  r2r2-indentr2rradare2rafind2rahash2rasign2rax2$
  你觉得 Radare2 怎么样?请在评论中分享你的反馈。
  via: https://opensource.com/article/21/1/linux-radare2
  作者:Gaurav Kamathe选题:lujun9972译者:wxy校对:wxy
  本文由 LCTT原创编译,Linux中国荣誉推出

10寸照片尺寸(110寸照片尺寸表)10寸照片尺寸(110寸照片尺寸表)活中最常用的证件照就是一寸照和二寸照,他们的具体尺寸分别是一寸照2。5cm3。5cm(尺寸),295px413px(像素)二寸照3。5cm5。3一寸照片的尺寸是多少(一寸照片电子版怎么弄)一寸照片的尺寸是多少(一寸照片电子版怎么弄)证件照主要分三种尺寸,分别为1寸2。5cm3。5cm小2寸(护照)3。3cm4。8cm。2寸3。5cm5。3cm证件照常见背景色为白色红1寸照片的尺寸是多少(手机怎么把照片修一寸)1寸照片的尺寸是多少(手机怎么把照片修一寸)导语2021年卫生资格的考生注意啦!2021年考试国家合格分数线确定为60分啦一卫生专业技术资格考试初级中级各科目合格标准均为60分(各a4相片纸(相片纸怎么打印)a4相片纸(相片纸怎么打印)单202108161518文具小能手1500元办公用品报价单分享产品名称属性包装价格数量总价复印纸A4打印纸500张包24。805hr124hr相片纸A10寸照片尺寸(10寸与a4纸对比照)10寸照片尺寸(10寸与a4纸对比照)你是擅长摄影书法美术还是文学呢?现在有一个好消息要告诉你,中华民族一家亲,同心奋进新征程暨第三届民族团结摄影书法美术文学作品有奖征集活动正式启科普下无铁硫酸铝是什么有什么用关于到现在无铁硫酸铝是什么有什么用这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道无铁硫酸铝是什么有什么用,小编也是到网上镜头纸(镜头纸用什么牌子好)镜头纸(镜头纸用什么牌子好)怎样才能用手机拍出画质高的照片。我总结了以下7个技巧,希望对你有所帮助。一镜头选择首先是镜头的选择,现在的手机大多数都是多镜头手机,我们尽量选用主镜头拍一寸半照片尺寸(ps一寸照片怎么做)一寸半照片尺寸(ps一寸照片怎么做)(智慧小高图文)連環畫雜志手機阅览室照片尺寸的命名照片的寸指的是英寸,1英寸2。54厘米另外照片的尺寸国内外说法是不同的,例如3。5X54X65文字处理软件有哪些(打印编辑文字用什么软件)文字处理软件有哪些(打印编辑文字用什么软件)如果我爱自己,就会日出而作日入而息。大家好,我是不接地气,也许我们素未谋面,但说不定相见恨晚,感谢相遇。今天为大家分享9个超级好用的图片二寸照片的尺寸(怎么把照片改成2寸)二寸照片的尺寸(怎么把照片改成2寸)证件照,这个小方片从上学会用到工作,一直会用到不少,虽然如今手机支付,电子证照虽然普及,但需要证件照的时候总会时不时地出现。例如单位前段时候制作2寸照片尺寸是多少(2寸照片如何改成1寸照片)2寸照片尺寸是多少(2寸照片如何改成1寸照片)生活工作学习中我们常常会被要求提供各种尺寸的证件照一寸照二寸照小二寸大一寸那你知不知道他们到底有多大?小院这就来为你展示一下小一寸2。
怎么用手机号码查定位系统(手机定位查找对方位置)怎么用手机号码查定位系统(手机定位查找对方位置)现在的社会,手机现已成为了万众随身的一种设备,它可以上网和联络朋友,可以作为人们的掌上电脑。现在的手机大多数都是智能化的,可以和电脑手机定位私人能查吗(手机查找对方手机位置)手机定位私人能查吗(手机查找对方手机位置)现在的社会,手机现已成为了万众随身的一种设备,它能够上网和联络朋友,能够作为人们的掌上电脑。现在的手机大多数都是智能化的,能够和电脑比美,有没有什么软件可以查手机号码定位(查手机定位怎么查?)有没有什么软件可以查手机号码定位(查手机定位怎么查?)现在的社会,手机现已成为了万众随身的一种设备,它可以上网和联络朋友,可以作为人们的掌上电脑。现在的手机大多数都是智能化的,可以真正的手机定位有没有手机查定位(怎么找到对方的手机位置)真正的手机定位有没有手机查定位(怎么找到对方的手机位置)现在的社会,手机现已成为了万众随身的一种设备,它可以上网和联络朋友,可以作为人们的掌上电脑。现在的手机大多数都是智能化的,可怎么用微信查别人的手机定位(如何查手机定位在哪里?)怎么用微信查别人的手机定位(如何查手机定位在哪里?)现在的社会,手机现已成为了万众随身的一种设备,它能够上网和联络朋友,能够作为人们的掌上电脑。现在的手机大多数都是智能化的,能够和手机丢了关机怎么定位找回(华为手机丢了如何定位找回来)手机丢了关机怎么定位找回(华为手机丢了如何定位找回来)hello,大家好,这里是科技微讯。苹果今天凌晨发布了iOS15的第一个开发者预览版,描述性文件已经公开,如下图所示(截图来自服装书籍(服装面料书籍)服装书籍(服装面料书籍)关注关注精彩内容要先点击这里哦经常有人问我如何学习服装设计?学服装设计该看什么样的书籍?今天特意种草几本学习服装设计入门书籍,小伙伴们快来接!在开始自学服装稿费标准(稿费400元篇)稿费标准(稿费400元篇)hi,很高兴你找到了这里,这是一封给你的约稿函。从创办之初,读者人物就希望通过记录不同的人物来记录这个光怪陆离的人间。我们的世界,每天都像是在上演一幕巨大刘德华绯闻(刘德华有过几段恋情)刘德华绯闻(刘德华有过几段恋情)004年天下无贼,不仅造就了傻根王宝强,更加让刘德华挣得盆满锅满。可是刘德华不知道是此时的他已经成为了别人自传里的男主,更是被夸赞男人之中的男人,床百事可乐标志(百事可乐标志的含义)百事可乐标志(百事可乐标志的含义)炸鸡配啤酒汉堡搭可乐这已经成为很多人在日常饮食中所贯彻的搭配习惯了想一想,如果吃汉堡不能搭配可乐那真的就像不能嗦的螺蛳粉一样缺乏了这个食物该有的灵家常排骨汤(排骨汤的各种做法)家常排骨汤(排骨汤的各种做法)大家好,我是秀厨娘,一个喜欢待在厨房里研究美食的姑娘,每天与大家分享一道营养美味的家常菜做法,如果您也喜欢做美食,欢迎关注,我们可以互相分享自己在做美