
逆向
文章平均质量分 84
Mi1k7ea
Mi1k7ea
展开
-
IA-32(Intel Architecture 32位)寄存器小结
这里简单记录一下各个寄存器的基本内容。一、通用寄存器:用于传送和暂存数据,参与算数逻辑运算并保存运算结果。IA-32每个通用寄存器的大小都是32位,即4个字节,主要用来保存常量和地址等信息。以下4个通用寄存器主要用于算术运算如ADD、SUB、XOR、OR等,常用于保存常量与变量的值。EAX:(针对操作数和结果数据的)累加器,一般用在函数返回值中,所有Win32 API函数都会把返回值保存到EAX后...原创 2018-05-20 10:25:16 · 1343 阅读 · 0 评论 -
DLL注入
DLL注入DLL(Dynamic Linked Library动态链接库)被加载到进程后会自动运行DllMain()函数,用户可以把想执行的代码放到DllMain()函数,每当加载DLL时,添加的代码就会自然而然得到执行。DLL注入是指向运行中的其他进程强制插入特定的DLL文件。其工作原理是从外部促使目标进程调用LoadLibrary() API从而强制执行DLL的DllMain()函数,而且被注...原创 2018-06-22 20:22:57 · 5635 阅读 · 1 评论 -
DLL卸载
DLL卸载DLL卸载(DLL Ejection)是将强制插入进程的DLL弹出的一种技术,原理是驱使目标进程调用FreeLibrary() API,即将FreeLibrary() API的地址传递给CreateRemoteThread()的lpStartAddress参数并把要卸载的DLL的句柄传递给lpParameter参数。注意:使用FreeLibrary() API实现DLL卸载,仅适用于卸载...原创 2018-06-23 09:19:43 · 4238 阅读 · 0 评论 -
逆向分析abex'crackme #2
这里接着逆向分析abex' crackme #2。运行程序,要求填入Name和Serial:随意填写后点击Check: 可以看到,显示这个序列号错误。由此可知,该程序是通过获取用户输入的Name字符串,再通过加密的方式加密Name字符生成相应的Serial值。这里可以明确一下目标,即逆向分析该加密算法具体是如何实现的。 OllyDbg打开该exe文件: ...原创 2018-06-02 12:58:24 · 2759 阅读 · 2 评论 -
通过修改PE加载DLL
基本概念除了DLL动态注入技术外,还可以通过手工修改PE文件的方式来加载DLL,这种方式只要应用过一次之后,每当进程开始运行时便会自动加载指定的DLL。整体思路如下:1、查看IDT是否有充足的空间,若无则移动IDT至其他位置,若有则直接添加至列表末尾;2、若无,修改OPTIONAL头IMPORT TABLE的RVA值并增大Size值,删除绑定导入表BOUND IMPORT Table,复制原IAT...原创 2018-06-24 10:51:58 · 3871 阅读 · 0 评论 -
基址重定位表
基址重定位表(Base Relocation Table),记录PE重定位时需要修改的硬编码地址的位置。一般地,向进程的虚拟内存加载PE文件(EXE、DLL、SYS)时,文件会被加载到PE头的ImageBase所指的地址处。若加载的文件为DLL或SYS,且ImageBase位置加载了其他DLL或SYS文件时,则会进行PE重定位。PE重定位是指PE文件无法加载到ImageBase所指位置时,而加载到...原创 2018-06-09 22:10:32 · 1970 阅读 · 0 评论 -
从可执行文件中删除.reloc节区
基址重定位表对于DLL和SYS文件来说是必须得,但在EXE格式的PE文件中,基址重定位表并无作用,将其删除后程序仍然能够正常运行。VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件可正常运行,并且缩减了文件大小。.reloc节区一般位于所有节区的最后,可以使用PEView和Win Hex Editor来手动删除。这里对reloc.exe程序进行演示。1、删除.reloc节区头:...原创 2018-06-09 22:19:14 · 2331 阅读 · 0 评论 -
HITB_Binary_100_writeup
HITB Binary 100是之前的HITB CTF的一道简单的逆向题,这里简单做一遍。下载hitb-bin100.elf将elf文件先跑一下,发现像歌词播放一样、每个一秒钟左右输出一句话,歌词好像没啥用,而且运行很久也还没停下来:根据字符串检索法,扔到IDA的String窗口查看是否存在关键字符串,可以看到有“FLAG”相关的字符串:点击进去查看,发现这段代码是在mai...原创 2018-08-26 15:10:26 · 759 阅读 · 0 评论 -
代码注入(线程注入)
代码注入概念代码注入是一种向目标进程插入独立运行代码并使之运行的技术,其一般调用CreateRemoteThread() API以远程线程的形式运行插入的代码,亦称为线程注入。代码以线程过程(ThreadProcedure)形式插入,而代码中使用的数据则以线程参数的形式插入,即代码和数据是分别注入的。 代码注入与DLL注入的区别DLL注入适用于代码量大且复杂的情况,而代码注入适用于...原创 2018-10-05 23:16:37 · 7205 阅读 · 1 评论 -
运行时压缩(UPX)
任何文件都是由二进制组成的,因而只要使用合适的压缩算法,就可以是文件大小进行压缩。无损压缩:经过压缩的文件能完全恢复。如7-zip、面包房等压缩程序。有损压缩:经过压缩的文件不能完全恢复。压缩多媒体文件时大部分使用有损压缩。运行时压缩器:运行时压缩器(Run-Time Packer)是针对可执行文件而言的,可执行文件内部含有解压缩代码,文件在运行瞬间在内存中解压缩后执行。运行时压缩文件也是PE文件...原创 2018-06-07 19:57:03 · 4168 阅读 · 3 评论 -
Windows消息钩取
Windows消息钩取简单地说,消息钩取就是偷看、截取信息。常规Windows消息流:1、发生键盘输入事件时,WM_KEYDOWN消息被添加到[OS message queue];2、OS判断哪个应用程序中发生了事件,然后从[OS message queue]中取出消息,添加到相应应用程序的[application message queue]中;3、应用程序监视自身的[application m...原创 2018-06-13 20:13:01 · 2692 阅读 · 2 评论 -
逆向分析abex'crackme#1
abexcm1-voiees.exe程序是crackme的第一道最简单的逆向练习题。运行程序查看:弹框显示需要让程序觉得你的HD是一个CD-Rom。然后点击确定:显示错误,说不是CD-ROM。再按确定即退出程序。至此可以明确,需要逆向修改文件的逻辑以绕过检测CD-ROM的判断。使用OllyDbg打开该可执行文件:可以直观地看到EP代码十分简短,main()函数直接出现在EP中,因为其是由汇编语言直...原创 2018-05-20 11:42:01 · 1617 阅读 · 0 评论 -
函数调用约定
函数调用约定(Calling Convention)是对函数调用时如何传递参数的一种约定。函数调用完毕后,ESP寄存器的值需要恢复到函数调用之前的值,从而保证可引用的栈大小不会缩减。而函数调用约定就是解决函数调用后如何处理ESP的问题的。1、cdeclcdecl主要是C语言中使用的方式,调用者负责处理栈。编写简易的代码如下:#include "stdio.h"int add(int a, in...原创 2018-06-02 17:26:11 · 864 阅读 · 0 评论 -
逆向分析HelloWorld程序
这里将之前学习《逆向工程核心原理》的笔记重新实现整理一遍,代码重新编写实现,以方便以后查阅。编写运行HelloWorld程序环境主要是Win7 32位系统,使用VS2010进行编程:#include "windows.h"int main(){ MessageBox(NULL, L"Hello World!", L"blog.youkuaiyun.com/ski_12", MB_OK);...原创 2018-05-16 11:25:12 · 7420 阅读 · 0 评论 -
栈帧
栈帧(Stack Frame)是利用EBP寄存器访问栈内局部变量、参数、函数返回地址等的手段,在程序中用于声明局部变量、调用函数等。整个过程为:调用某函数时,先把用作基准点(函数起始地址)的ESP值保存到EBP并维持在函数内部。无论ESP的值如何变化,以EBP的值为基准能够准确安全访问到相关函数的局部变量、参数、返回地址等。网上找的一个函数调用栈的典型内存布局如下:基本的栈帧结构如...原创 2018-06-03 10:39:41 · 2958 阅读 · 0 评论 -
逆向分析Tut.ReverseMe1
这里调试一个https://tuts4you.com/上的crackme文件Tut.ReverseMe1.exe。运行程序查看:提示需要去除所有的Nags(唠叨)并找到正确的注册码。点击确定之后:提示使用SmartCheck进行注册。这里我们使用调试器进行调试破解。至此,明确一下目标,第一是去掉消息框,第二是查找注册码。使用Ollydbg打开该文件:开始即是VB引擎代码。直接跳过该部分,使用字符串...原创 2018-06-03 17:31:20 · 1840 阅读 · 1 评论 -
PE文件格式
PE即Portable Executable,是Windows OS下使用的可执行文件格式。PE文件是指32位的可执行文件,亦称为PE32。64位的可执行文件称为PE+或PE32+,是PE文件的一种扩展形式。PE文件种类如下表:PE文件基本结构:从DOS头至节区头是PE头部分,下面的节区合称PE体。文件的内容一般分为代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。VA&am...原创 2018-06-04 19:57:40 · 3369 阅读 · 0 评论 -
UPack的PE文件头分析与OEP查找
UPack(Ultimate PE压缩器),是一种PE文件的运行时压缩器,特点是使用独特的方法对PE头进行变形。UPack会使许多的PE分析程序无法正常运行,因此很多恶意代码都是通过UPack进行压缩。 UPack PE文件头分析使用UPack压缩notepad.exe:UPack会直接压缩源文件而不会进行备份。压缩后的notepad文件更名为notepad_upack。使...原创 2018-06-11 20:04:08 · 1648 阅读 · 1 评论 -
内嵌补丁练习
内嵌补丁内嵌补丁即内嵌代码补丁(Inline Code Patch),当难以直接修改指定代码时,插入并运行被称为“洞穴代码”(Code Cave)的补丁代码后,对程序实现打补丁。该技术经常用于对象程序经过运行时压缩(或加密处理)而难以直接修改的情况。如图,左边是经典的运行时压缩代码(或加密代码),EP代码先将加密的OEP代码解码,再跳转到OEP代码处执行。若要打补丁的代码存在于经过加密的OEP区域...原创 2018-06-12 19:48:44 · 1475 阅读 · 1 评论 -
使用汇编语言编写注入代码
这里主要借助OllyDbg的汇编功能,使用汇编语言编写注入代码即ThreadProc()函数。与上一篇文章的CodeInject.cpp代码类似,但区别在于THREAD_PARAM结构体不包含字符串成员,且使用指令字节数组替代了ThreadProc()函数(因为代码本身同时包含所需的字符串数据)。汇编语言常用的开发工具(Assembler)有MASM、TASM和FASM等。编写简单的待修改...原创 2018-10-06 23:22:49 · 2973 阅读 · 2 评论