脱壳基础知识入门之Dump内存映像

合集下载

javadump分析

javadump分析

Java 的线程线程是指能独立于程序的其它部分运行的执行单元。

JAVA语言能够很好的实现多线程的程序。

我们在调试程序,或者在开发后期需要做性能调优的时候,往往也需要了解当前程序正在运行的线程的状态,正在执行的操作,从而分析系统可能存在的问题。

在阅读本文之间,应对Java线程的编程原理,同步机制有一定了解.产生JAVA线程dumpJAVA 的线程DUMP,就象当前JAVA进程的一个快照,打印出所有线程的状态和调用堆栈,以及Monitor的状态。

在不同的操作系统下,产生线程DUMP的方式是不同的。

在启动程序的控制台里敲:Ctrl - Break,线程的dump会产生在标准输出中(缺省标准输出就是控制台,如果对输出进行了重定向,则要查看输出文件)。

在unix,linux 和MacOS 环境中,在控制台中敲:Ctrl-\,或者,用“kill -3 <pid>” ,或者“kill –QUIT <pid>”。

Pid是用所关注的JAVA进程号,您可以用“ps -ef | grep j ava” 找到,或者使用JDK 5.0中的“jps -v” 命令获得。

在各个操作系统平台,都可以用JDK 5.0工具包中的jstack <pid>这里要注意的是:1. 不同的JAVA虚机的线程DUMP的创建方法和文件格式是不一样的,不同的JVM版本,dump信息也有差别。

本文中,只以SUN的hotspot JVM 5.0_06 为例。

2. 在实际运行中,往往一次dump的信息,还不足以确认问题。

建议产生三次dump信息,如果每次dump都指向同一个问题,我们才确定问题的典型性。

线程分析:1. JVM 线程在线程中,有一些JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:"Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000]"CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798]"Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000]"Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8]at ng.Object.wait(Native Method)- waiting on <0xef600848> (a ng.ref.ReferenceQueue$Lock)at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:116)- locked <0xef600848> (a ng.ref.ReferenceQueue$Lock)at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:132)at ng.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)"Reference Handler" daemon prio=10 tid=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38]at ng.Object.wait(Native Method)- waiting on <0xef600758> (a ng.ref.Reference$Lock)at ng.Object.wait(Object.java:474)at ng.ref.Reference$ReferenceHandler.run(Reference.java:116)- locked <0xef600758> (a ng.ref.Reference$Lock)"VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable"VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition 我们更多的是要观察用户级别的线程,如下所示:"Thread-1" prio=10 tid=0x08223860 nid=0xa waiting on condition [0xef47a000..0xef47ac38]at ng.Thread.sleep(Native Method)at testthread.MySleepingThread.method2(MySleepingThread.java:53)- locked <0xef63d600> (a testthread.MySleepingThread)at testthread.MySleepingThread.run(MySleepingThread.java:35)at ng.Thread.run(Thread.java:595)我们能看到:线程的状态:waiting on condition线程的调用栈线程的当前锁住的资源:<0xef63d600> 这些信息对我们随后的分析都有用处。

《Armadillo1.xx-2.xx-SiliconRealmsToolworks脱壳分析》

《Armadillo1.xx-2.xx-SiliconRealmsToolworks脱壳分析》

脱壳过程:OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、C000001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)入口代码:0105A000 N> 60 pushad0105A001 E8 00000000 call NOTEPAD.0105A0060105A006 5D pop ebp0105A007 50 push eax0105A008 51 push ecx0105A009 0FCA bswap edx0105A00B F7D2 not edx0105A00D 9C pushfd下bp OpenMutexA断点shift+F9运行,77E62391 k> 55 push ebp---------中断在这里77E62392 8BEC mov ebp,esp77E62394 51 push ecx77E62395 51 push ecx77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],077E6239A 56 push esi77E6239B 0F84 C2E30100 je kernel32.77E8076377E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]看堆栈0006F710 0103229B /CALL 到OpenMutexA 来自NOTEPAD.010322950006F714 001F0001 |Access = 1F00010006F718 00000000 |Inheritable = FALSE0006F71C 0006FDA0 \MutexName = "52C:A9EEE0AC4"------注意0006fda0,等下会用到0006F720 000000040006F724 000000000006F728 010476B3 NOTEPAD.010476B3Ctrl+G 01001000 键入以下代码:为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本例Ctrl+G 401000是无法写入调式程序中的,而且401000处有代码(大家可以试一试),那么如何知道是用Ctrl+G 01001000的呢?个人认为是根据载入口的代码来确定的,形式是入口代码地址的前3位+01000,如本例中的入口代码是:0105A000 N> 60 pushad,取其地址中的前3位010,再加上01000,合起来就是01001000。

几种用OD脱壳方法

几种用OD脱壳方法

方法四:一步到达OEP
1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPX,ASPACK壳),然后按下F2,F9运行到此处
2.来到大跳转处,点下F8,到达OEP!
方法五:最后一次异常法
1:用OD打开软件
2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序
6:按F2下断点!然后按SHIFT+F9来到断点处! 7:去掉断点,按F8慢慢向下源自! 8:到达程序的OEP!
方法六:模拟跟踪法
1:先试运行,跟踪一下程序,看有没有SEH暗桩之类
2:ALT+M打开内存镜像,找到(包含=SFX,imports,relocations)
内存镜像,项目 30
Btw:这种方法不要滥用得好,锻炼能力为妙。
以上方法总结网上的一些前辈的经验,对普通壳足够了。
至于对Themida ,Acprotect,Asprotect等各版本强壳,有防调试(推荐用硬件断点),就算找到OEP,也要处理stolen code,自校验,重整输入表等等工作,,难度蛮大的,要不断深入自学
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。
方法三:内存镜像法
1:用OD打开软件!
2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!

Dump文件分析(转发)

Dump文件分析(转发)

Dump⽂件分析(转发)原⽂:本⽂主要介绍Dump⽂件结构,理解Dump⽂件对于分析线程⾼占⽤、死锁、内存溢出等⾼级问题有⾮常重要的指导意义。

什么是Dump⽂件Dump⽂件是进程的内存镜像。

可以把程序的执⾏状态通过调试器保存到dump⽂件中。

Dump⽂件是⽤来给程序编写⼈员调试程序⽤的,这种⽂件必须⽤专⽤⼯具软件打开。

如何⽣成Dump⽂件使⽤命令:jstack pid可以查看到当前运⾏的java进程的dump信息。

Dump⽂件结构⾸先浏览⼀下dump⽂件的⽂本内容:Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.77-b03 mixed mode):"Attach Listener" #37 daemon prio=9 os_prio=0 tid=0x00007f87b42b7000 nid=0x680f waiting on condition [0x0000000000000000]ng.Thread.State: RUNNABLE"Druid-ConnectionPool-Destory-331358539" #36 daemon prio=5 os_prio=0 tid=0x00007f87a4278800 nid=0x67e4 waiting on condition [0x00007f87b8dce000] ng.Thread.State: TIMED_WAITING (sleeping)at ng.Thread.sleep(Native Method)at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:1724)"Druid-ConnectionPool-Create-331358539" #35 daemon prio=5 os_prio=0 tid=0x00007f87a4022000 nid=0x67e3 waiting on condition [0x00007f87ce86a000] ng.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000000b3804848> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:1629)"Abandoned connection cleanup thread" #31 daemon prio=5 os_prio=0 tid=0x00007f87e0d91800 nid=0x672b in Object.wait() [0x00007f87cd2c2000]ng.Thread.State: TIMED_WAITING (on object monitor)at ng.Object.wait(Native Method)at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:143)- locked <0x00000000b422d1e8> (a ng.ref.ReferenceQueue$Lock)at com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)"DestroyJavaVM" #30 prio=5 os_prio=0 tid=0x00007f87e0008800 nid=0x670b waiting on condition [0x0000000000000000]ng.Thread.State: RUNNABLE"http-nio-8081-AsyncTimeout" #28 daemon prio=5 os_prio=0 tid=0x00007f87e016e800 nid=0x6727 waiting on condition [0x00007f87b94cf000]ng.Thread.State: TIMED_WAITING (sleeping)at ng.Thread.sleep(Native Method)at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1211)at ng.Thread.run(Thread.java:745)"http-nio-8081-Acceptor-0" #27 daemon prio=5 os_prio=0 tid=0x00007f87e0166000 nid=0x6726 runnable [0x00007f87b95d0000]ng.Thread.State: RUNNABLEat sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)- locked <0x00000000b410d480> (a ng.Object)at .NioEndpoint$Acceptor.run(NioEndpoint.java:455)at ng.Thread.run(Thread.java:745)"http-nio-8081-ClientPoller-0" #26 daemon prio=5 os_prio=0 tid=0x00007f87e0292800 nid=0x6725 runnable [0x00007f87b96d1000]ng.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)- locked <0x00000000b410d6c0> (a sun.nio.ch.Util$2)- locked <0x00000000b410d6b0> (a java.util.Collections$UnmodifiableSet)- locked <0x00000000b410d668> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)at .NioEndpoint$Poller.run(NioEndpoint.java:793)at ng.Thread.run(Thread.java:745)"http-nio-8081-exec-10" #25 daemon prio=5 os_prio=0 tid=0x00007f87e028c000 nid=0x6724 waiting on condition [0x00007f87b97d2000]ng.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000000b410d898> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at ng.Thread.run(Thread.java:745)其中每个空⾏⽤于分隔⼀个线程,每个线程的信息是以堆栈信息的⽅式展开,显⽰了⽬前正在调⽤的⽅法以及所在的代码⾏。

Armadillo脱壳知识和方法大全

Armadillo脱壳知识和方法大全

般情况下,这个跳转比较大的话,就改为jmp,而跳转比较小的话,就改nop)。[注:下此断点的目的是找到Magic Jump,修改Magic Jump目的
是避开的IAT的加密。]
2、找OEP
下断点bp GetCurrentThreadId/bp CreateThread,shift+f9运行,中断后,取消断点,Alt+F9返回,单步执行,看到一个call edi之类的。F7
进入,即到oep。OD不要关!打开import--选择进程--OEP输入va--自动搜索IAT--获取输入表--显示无效函数--CUT!
(二) 双线程的标准壳
总体步骤:1、要双变单;2、处理IAT,修改Magic Jump;3、寻找OEP;4、修复
1、双变单,方法有三。
方法一:PATCH代码法
004010109D popfd
0040101161 popad
00401012- E9 8F9FA777jmp KERNEL32.OpenMutexA
点右键选择重建eip,f9运行,断下后,取消断点, ctrl+g到00401000,恢复修改。
方法二:下断点BP OpenMutexA,SHIFT+F9运行,断下后,ALT+F9返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9
,断下后,ALT+F9返回,再次将返回代码下面的第一个跳转改为相反跳转。然后再一次SHIFT+F9,取消断点,至此,同样,双进程转单进程完毕!
此法相对简单,另外适用于00401000空数据不能修改的程序。
(2)修改Magic Jump 。
下断BP GetModuleHandleA+5,运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree后,再运行一次,就是返回时机,中

浅谈壳的加载步骤及手动脱壳

浅谈壳的加载步骤及手动脱壳

浅谈壳的加载步骤及手动脱壳。

现在玩脱壳的人越来越多了,不知道是好事还是坏事。

现在玩手动脱壳一般三样工具足矣:loader,ImpREC,TRW2000。

也许是这三剑客的功能太强大,因此手动脱壳也变得象流水化作业。

大致以下几个步骤就搞定了。

1)loader找OEP.(OEP就是程序原来的入口点,即Original Entry Point)2)TRW2000来Dump。

也就是把内存映象保存为文件。

3)ImpREC修补Import Table.(也就是修补程序原来的API地址)不过如果这样,那么我想手动脱壳也没有必要了,因为更先进的工具如各种脱壳机会更快捷有效。

既然是手动脱壳,当然想对壳有所了解,那么让我们看看壳是如何工作的吧。

壳和病毒从某些方面比较类似,都需要比原程序代码更早的获得控制权,这是通过在原程序的代码执行前加入自己的一段代码来实现的。

注意我说的这是执行时的情况。

对于文件中的情况,就是壳修改了原程序的执行文件的组织结构,从而达到壳的代码能够比原程序的代码提前获得控制权,并且不会影响原程序的正常运行,所以从这点上说,壳和病毒很类似。

现在的执行文件一般都是PE格式,如果你对PE格式一无所知,最好还是去看一看相关的资料。

我没有那么地道的专业知识,也怕误人子弟。

相关名词1)Entry Point (入口点)PE格式的可执行文件的执行时的入口点,即是PE格式中的Entry Point。

用PEditor或者LordPE之类的PE查看工具看看NotePad.exe,你就会看到Entry Point的值。

也就是说NotePad.exe在执行时的第一行代码的地址应该就是这个值。

(当然应该加上基地址)2)Section (节区)PE格式文件是按节区进行规划组织的,不同的节区一般保存的数据的作用也不相同。

通常使用缺省方式编译的程序文件,有CODE/DATA/TLS/.text/.data/.tls/.rsrc/.rdata/.edata/.reloc等不同的名称,有的用于保存程序代码,如CODE和.text节区,有的用于保存程序中的变量的,如DATA/.data节区,有的保存重定位信息,如.reloc,有的用于保存资源数据,如.rsrc。

脱壳经验谈菜鸟入门必备知识

脱壳经验谈菜鸟入门必备知识

至于GetModuleHandle.函数在壳运行过程的重要性也是很容易理解的。壳在解码代码和数据过程中,光靠它自身输入表中的函数是绝对不够的,壳需要动态加载一些dll文件并获得相应的函数地址。当填写IAT时,有些dll其实已经加载过了,这个时候就需要GetModuleHandle.获取这些dll的句柄,再通过GetProcAddress获得函数地址。
VirtualAlloc,VirtualFree和VirtualProtect这三个函数在壳运行过程中有两个用途:
一是申请虚拟内存放代码或IAT。有些壳会把解密代码的一部分放在自己申请的内存地址中,这样即使脱壳了,由于缺少代码也不能运行,像穿山甲的Code Splicing功能以及ASPR中让人抓狂的补区段都是要通过这些函数来完成的。VirtualProtect是用来修改内存属性的,作用是修改区段属性,然后向内存中写入解码后的数据;某些壳HookAPI的时候也会使用这个函数来修改系统dll的属性,以便修改系统dll,达到Hook的目的。
BOOL VirtualProtect(
PVOID pvAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD pflOldProtect
);
是不是有点儿晕呢?没关系,先放一下,了解一下别的东西后再回过头来看这些,因为下面的内容需要这些函数的知识,等介绍后面的知识之后再进一步讨论。
一个加壳程序,会对程序的代码,数据,资源,输入表等进行处理,然后再把程序入口点指向壳的代码,并重新为壳自身建立一个输入表---这一点是很重要的。随便打开加过壳的程序,我们可以看到程序输入表中调用的函数少的可怜,但是,对比过几个程序后,我们会发现一些规律,即这些壳一般都会引用某些特定的API,这些就是这里要讲的-----几个同壳密切相关的API函数。

lordpe 使用

lordpe 使用

lordpe 使用
LordPE是一款能够抓取内存映像的用来脱壳的软件,它能够把一个进程的内存数据给Dump下来,然后保存为文件。

使用LordPE的一般步骤如下:
1. 打开LordPE软件。

注意要用管理员权限打开,不然可能看不到正在被OD调试的进程。

2. 用LordPE查看了将要用到的一些PE信息,这些信息包括PE文件的入口RVA、映像地址和代码节的相关数据。

3. 用C32ASM对代码节进行加密。

具体操作是用C32ASM以十六进制的方式打开可执行文件,然后从代码节的文件偏移开始选择,一直选到相应位置。

之后单击右键,在弹出的快捷菜单上选择“修改数据”命令,在“修改数据”对话框中选择“异或”算法来对代码节进行加密。

4. 保存以后使用在前面章节编写的添加节表的软件对可执行文件添加一个新的节。

在新节中写入了还原代码节的解密指令。

5. 用LordPE修改该可执行文件的入口地址、代码节属性和新添加节的属性。

6. 最后运行修改过的可执行文件,检查是否能正常运行。

如需获取更多关于LordPE使用的信息,建议查阅计算机书籍或咨询专业技术人员。

脱壳理论教程[看雪篇]

脱壳理论教程[看雪篇]

脱壳理论教程[看雪篇]第⼀课 PE格式要想学脱壳,第⼀步就得掌握PE格式,PE是Portable Executable File Format(可移植的执⾏体)简写,它是⽬前Windows 平台上的主流可执⾏⽂件格式。

Microsoft Visual C++提供的WINNT.H⾥有PE数据结构的完整定义。

推荐⽂档:ah007翻译的“PE⽂件格式”1.9版qduwg翻译的PE⽂件格式Iczelion's 的PE⽂件格式PE结构各字段偏移参考微软官⽅提供的PE⽂档(Revision 8.0 - May 16, 2006)学习PE格式的⽅法是⾃⼰先准备⼀个⼗六进制⼯具,如HexWorkshop,WinHex,⽤这些⼯具打开⼀个EXE⽂件对照着学。

强烈推荐你⽤Stud_PE v.2.2.0.5这款⼯具辅助学习PE格式。

PE格式学习的重点是在输⼊表(Import Table)这块。

Stud_PE⼯具界⾯:PE结构图:第⼆课 SEH技术结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。

SEH是Windows操作系统的⼀种系统机制,与特定的程序设计语⾔⽆关。

外壳程序⾥⼤量地使⽤了SEH,如果不了解SEH,将会使你跟踪⼗分困难。

SEH in ASM 研究(⼀)by humeSEH in ASM 研究(⼆)by humeStructured Exception Handling加密与解密⼆版菜鸟学习笔记(2) - SEH 结构化异常处理 by ytcswb由于 Ollydbg对SEH处理异常灵活,因此脱壳⽤Ollydbg会⼤⼤提⾼效率。

附CONTEXT结构环境:代码:1. 什么是壳?在⼀些计算机软件⾥也有⼀段专门负责保护软件不被⾮法修改或反编译的程序。

它们⼀般都是先于程序运⾏,拿到控制权,然后完成它们保护软件的任务。

由于这段程序和⾃然界的壳在功能上有很多相同的地⽅,基于命名的规则,就把这样的程序称为“壳”了。

dump命令详解

dump命令详解

linux dump 命令详解功能说明:备份文件系统。

语法:dump [-cnu][-0123456789][-b <区块大小>][-B <区块数目>][-d <密度>][-f <设备名称>][-h <层级>][-s <磁带长度>][-T <日期>][目录或文件系统] 或dump [-wW]补充说明:dump为备份工具程序,可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。

参数:-0123456789 备份的层级。

-b<区块大小> 指定区块的大小,单位为KB。

-B<区块数目> 指定备份卷册的区块数目。

-c 修改备份磁带预设的密度与容量。

-d<密度> 设置磁带的密度。

单位为BPI。

-f<设备名称> 指定备份设备。

-h<层级> 当备份层级等于或大雨指定的层级时,将不备份用户标示为"nodump"的文件。

-n 当备份工作需要管理员介入时,向所有"operator"群组中的使用者发出通知。

-s<磁带长度> 备份磁带的长度,单位为英尺。

-T<日期> 指定开始备份的时间与日期。

-u 备份完毕后,在/etc/dumpdates中记录备份的文件系统,层级,日期与时间等。

-w 与-W类似,但仅显示需要备份的文件。

-W 显示需要备份的文件及其最后一次备份的层级,时间与日期。

Linux学习笔记之备份命令dump/还原命令restoredump 可以执行类似tar 的功能。

然而,dump 倾向于考虑文件系统而不是个别的文件。

下面是引自dump 手册文件中的内容:“dump 检查ext2 文件系统上的文件,并确定哪些文件需要备份。

这些文件将出于安全保护而被复制到给定的磁盘、磁带或其他存储媒体上……大于输出媒体容量的转储将被划分到多个卷。

脱壳教程

脱壳教程

破解预备知识一、机械码,又称机器码.ultraedit打开,编辑exe文件时你会看到许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码就是机器码.修改程序时必须通过修改机器码来修改exe文件.二、需要熟练掌握的全部汇编知识(只有这么多)不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)call 调用子程序je 或jz 若相等则跳(机器码74 或0F84)jne或jnz 若不相等则跳(机器码75或0F85)jmp 无条件跳(机器码EB)jb 若小于则跳ja 若大于则跳jg 若大于则跳jge 若大于等于则跳jl 若小于则跳jle 若小于等于则跳pop 出栈push 压栈三、常见修改(机器码)74=>75 74=>90 74=>EB75=>74 75=>90 75=>EBjnz->nop75->90(相应的机器码修改)jnz -> jmp75 -> EB(相应的机器码修改)jnz -> jz75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)四、两种不同情况的不同修改方法1.修改为jmpje(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not A vaible in Demo" 或"Command Not A vaible" 或"Can't save in Shareware/Demo"等(我们希望把它跳过,不让它出现)xxxxxxxxxxxx 正确路线所在2.修改为nopje(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转)nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)五、爆破无敌口诀背会此口诀,天下无敌,以后慢慢琢磨,仔细体会,收益多多。

脱壳理论教程[看雪篇]

脱壳理论教程[看雪篇]

第一课PE格式要想学脱壳,第一步就得掌握PE格式,PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows 平台上的主流可执行文件格式。

Microsoft Visual C++提供的WINNT.H里有PE数据结构的完整定义。

推荐文档:ah007翻译的“PE文件格式”1.9版qduwg翻译的PE文件格式Iczelion's 的PE文件格式PE结构各字段偏移参考微软官方提供的PE文档(Revision 8.0 - May 16, 2006)学习PE格式的方法是自己先准备一个十六进制工具,如HexWorkshop,WinHex,用这些工具打开一个EXE文件对照着学。

强烈推荐你用Stud_PE v.2.2.0.5这款工具辅助学习PE格式。

PE格式学习的重点是在输入表(Import Table)这块。

Stud_PE工具界面:PE结构图:第二课SEH技术结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。

SEH是Windows 操作系统的一种系统机制,与特定的程序设计语言无关。

外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。

SEH in ASM 研究(一)by humeSEH in ASM 研究(二)by humeStructured Exception Handling加密与解密二版菜鸟学习笔记(2) - SEH 结构化异常处理by ytcswb由于Ollydbg对SEH处理异常灵活,因此脱壳用Ollydbg会大大提高效率。

附CONTEXT结构环境:代码:typedef struct _CONTEXT {/*000*/ DWORD ContextFlags;/*004*/ DWORD Dr0;/*008*/ DWORD Dr1;1. 什么是壳?在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。

javadump分析#(精选.)

javadump分析#(精选.)

Java 的线程线程是指能独立于程序的其它部分运行的执行单元。

JAVA语言能够很好的实现多线程的程序。

我们在调试程序,或者在开发后期需要做性能调优的时候,往往也需要了解当前程序正在运行的线程的状态,正在执行的操作,从而分析系统可能存在的问题。

在阅读本文之间,应对Java线程的编程原理,同步机制有一定了解.产生JAVA线程dumpJAVA 的线程DUMP,就象当前JAVA进程的一个快照,打印出所有线程的状态和调用堆栈,以及Monitor的状态。

在不同的操作系统下,产生线程DUMP的方式是不同的。

在启动程序的控制台里敲:Ctrl - Break,线程的dump会产生在标准输出中(缺省标准输出就是控制台,如果对输出进行了重定向,则要查看输出文件)。

在unix,linux 和MacOS 环境中,在控制台中敲:Ctrl-\,或者,用“kill -3 <pid>” ,或者“kill –QUIT <pid>”。

Pid是用所关注的JAVA进程号,您可以用“ps -ef | grep j ava” 找到,或者使用JDK 5.0中的“jps -v” 命令获得。

在各个操作系统平台,都可以用JDK 5.0工具包中的jstack <pid>这里要注意的是:1. 不同的JAVA虚机的线程DUMP的创建方法和文件格式是不一样的,不同的JVM版本,dump信息也有差别。

本文中,只以SUN的hotspot JVM 5.0_06 为例。

2. 在实际运行中,往往一次dump的信息,还不足以确认问题。

建议产生三次dump信息,如果每次dump都指向同一个问题,我们才确定问题的典型性。

线程分析:1. JVM 线程在线程中,有一些JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:"Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000]"CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798]"Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000]"Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8]at ng.Object.wait(Native Method)- waiting on <0xef600848> (a ng.ref.ReferenceQueue$Lock)at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:116)- locked <0xef600848> (a ng.ref.ReferenceQueue$Lock)at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:132)at ng.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)"Reference Handler" daemon prio=10 tid=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38]at ng.Object.wait(Native Method)- waiting on <0xef600758> (a ng.ref.Reference$Lock)at ng.Object.wait(Object.java:474)at ng.ref.Reference$ReferenceHandler.run(Reference.java:116)- locked <0xef600758> (a ng.ref.Reference$Lock)"VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable"VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition 我们更多的是要观察用户级别的线程,如下所示:"Thread-1" prio=10 tid=0x08223860 nid=0xa waiting on condition [0xef47a000..0xef47ac38]at ng.Thread.sleep(Native Method)at testthread.MySleepingThread.method2(MySleepingThread.java:53)- locked <0xef63d600> (a testthread.MySleepingThread)at testthread.MySleepingThread.run(MySleepingThread.java:35)at ng.Thread.run(Thread.java:595)我们能看到:线程的状态:waiting on condition线程的调用栈线程的当前锁住的资源:<0xef63d600> 这些信息对我们随后的分析都有用处。

脱壳入门

脱壳入门

脱壳教程第1-4篇(转载)脱壳教程1:认识脱壳一切从“壳”开始首先大家应该先明白“壳”的概念。

在自然界中,大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。

同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。

它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。

就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。

由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。

就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。

最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件RCOPY 3 的作者熊焰先生。

在几年前的DOS 时代,“壳”一般都是指磁盘加密软件的段加密程序,可能是那时侯的加密软件还刚起步不久吧,所以大多数的加密软件(加壳软件)所生成的“成品”在“壳”和需要加密的程序之间总有一条比较明显的“分界线”。

有经验的人可以在跟踪软件的运行以后找出这条分界线来,至于这样有什么用这个问题,就不用我多说了。

但毕竟在当时,甚至现在这样的人也不是很多,所以当RCOPY3 这个可以很容易就找出“分界线”,并可以方便的去掉“壳”的软件推出以后,立即就受到了很多人的注意。

老实说,这个我当年在《电脑》杂志看到广告,在广州电脑城看到标着999元的软件,在当时来说,的确是有很多全新的构思,单内存生成EXE 可执行文件这项,就应该是世界首创了。

但它的思路在程序的表现上我认为还有很多可以改进的地方(虽然后来出现了可以加强其功力的RO97),这个想法也在后来和作者的面谈中得到了证实。

在这以后,同类型的软件想雨后春笋一般冒出来,记得住名字的就有:UNKEY、MSCOPY、UNALL .... 等等,但很多的软件都把磁盘解密当成了主攻方向,忽略了其它方面,当然这也为以后的“密界克星”“解密机器”等软件打下了基础,这另外的分支就不多祥谈了,相信机龄大一点的朋友都应该看过当时的广告了。

Core dump 基本知识

Core dump 基本知识

Core dump 基本知识本节主要探讨core dump 产生的背景知识。

对这部分不感兴趣的读者可以直接阅读第二章,了解基本的core dump 定位手段。

起源软件是人思维的产物。

智者千虑,必有一失,人的思维总有缺陷,反映到软件层面上就是程序bug。

程序bug 的终极体现就是core dump,core dump 是软件错误无法恢复的产物。

生成过程进程core dump 与系统dump 的产生,从程序原理上来说是基本一致的。

dump 的生成一般是在系统进行中断处理时进行的,下面简单介绍一下中断机制。

操作系统的中断机制操作系统是由中断驱动的。

广义的中断一般分为两类,中断(Interrupts) 和异常(Exceptions)。

中断可在任何时候发生,与CPU 正在执行什么指令无关,中断主要由I/O 设备、处理器时钟(分时系统依赖时钟中断划分时间片)或定时器等硬件引发,可以被允许或取消。

而异常是由于CPU 执行了某些指令引起的,可以包括存储器存取违规、除0 或者特定调试指令等,内核也将系统服务视为异常。

系统对这两类中断的处理基本上是相同的。

每个中断都会唯一对应到一个中断处理程序,在该中断触发时,相应的处理程序就会被执行。

例如应用进程进行系统调用时,就会触发一个软件异常,进入中断处理函数,完成从用户态到系统态的迁移并进入相应系统调用的入口点。

应用进程coredump 也是一个类似的过程。

应用进程core dump 生成过程在进程运行出现异常行为时,例如无效地址访问、浮点异常、指令异常等,将导致系统转入内核态进行异常处理(即中断处理),向相应的进程发出特定信号例如SIGSEGV、SIGFPE、SIGILL 等。

如果应用进程注册了相应信号的处理函数(例如可通过sigaction 注册信号处理函数),则调用相应处理函数进行处理(应用程序可以选择记录信息后生成core dump 并退出);否则将采取默认动作,例如SIGSEGV 的默认动作是生成core dump 并退出程序。

Frida进阶:Objection内存漫游、hookanywhere、抓包

Frida进阶:Objection内存漫游、hookanywhere、抓包

Frida进阶:Objection内存漫游、hookanywhere、抓包本章中我们进⼀步介绍,⼤家在学习和⼯作中使⽤Frida的实际场景,⽐如动态查看安卓应⽤程序在当前内存中的状态,⽐如指哪⼉就能hook哪⼉,⽐如脱壳,还有使⽤Frida来⾃动化获取参数、返回值等数据,主动调⽤API获取签名结果sign等⼯作实际⾼频场景,最后介绍⼀些经常遇到的⾼频问题解决思路,希望可以切实地帮助到读者。

1 内存漫游Frida只是提供了各种API供我们调⽤,在此基础之上可以实现具体的功能,⽐如禁⽤证书绑定之类的脚本,就是使⽤Frida的各种API来组合编写⽽成。

于是有⼤佬将各种常见、常⽤的功能整合进⼀个⼯具,供我们直接在命令⾏中使⽤,这个⼯具便是objection。

objection功能强⼤,命令众多,⽽且不⽤写⼀⾏代码,便可实现诸如内存搜索、类和模块搜索、⽅法hook打印参数返回值调⽤栈等常⽤功能,是⼀个⾮常⽅便的,逆向必备、内存漫游神器。

objection的界⾯及命令如下图图2-1所⽰。

1.1 获取基本信息⾸先介绍⼏个基本操作:键⼊命令之后,回车执⾏;help:不知道当前命令的效果是什么,在当前命令前加help⽐如,help env,回车之后会出现当前命令的解释信息;按空格:不知道输⼊什么就按空格,会有提⽰出来,上下选择之后再按空格选中,⼜会有新的提⽰出来;jobs:作业系统很好⽤,建议⼀定要掌握,可以同时运⾏多项(hook)作业;我们以安卓内置应⽤“设置”为例,来⽰范⼀下基本的⽤法。

在⼿机上启动frida-server,并且点击启动“设置”图标,⼿机进⼊设置的界⾯,⾸先查看⼀下“设置”应⽤的包名。

# frida-ps -U|grep -i setting7107 com.android.settings13370 com.google.android.settings.intelligence再使⽤objection注⼊“设置”应⽤。

脱壳知识——精选推荐

脱壳知识——精选推荐

脱壳知识什么是壳因为许多软件为了保护⾃⼰的软件不被和修改,通常会加壳,代码加密,增加破解的难度,从⽽达到保护软件的⽬的。

⾸先⼤家应该先明⽩“壳”的概念。

在⾃然界中,我想⼤家对壳这东西应该都不会陌⽣了,植物⽤它来保护种⼦,动物⽤它来保护⾝体等等。

同样,在⼀些计算机软件⾥也有⼀段专门负责保护软件不被⾮法修改或反编译的程序。

它们⼀般都是先于程序运⾏,拿到控制权,然后完成它们保护软件的任务。

举个例⼦,核桃⼤家都知道吧,想要吃到⾥⾯的⾁,就必须得先打开核桃外⾯那⼀层坚硬的壳,同样,外⾯想要看到⼀个程序的内部逻辑代码,就要脱掉外⾯的⼀层壳。

程序作者在编好软件后,编译成exe可执⾏⽂件。

有⼀些版权信息需要保护起来,不想让别⼈随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采⽤加壳来进⾏保护。

需要把程序搞的⼩⼀点,缩⼩程序的体积,减少内存容量,从⽽⽅便使⽤。

于是,需要⽤到⼀些软件,它们能将exe可执⾏⽂件压缩,在⿊客界给⽊马等软件加壳以躲避杀毒软件。

实现上述功能,这些称为加壳。

⾃然有加壳就会有脱壳。

为什么要脱壳脱壳是为了能够学习⼀个软件的程序设计逻辑,达到我们想要的⽬的。

如果不脱壳,我们就不能够了解软件的逻辑,也就⽆法得到源代码,也就⽆法破解⼀个软件,也就不会有这篇⽂章了。

我们拿到⼀个软件想要了解它的编程逻辑,那么我们就需要对它进⾏反汇编,当然有壳,也必须先脱壳(有些软件也可以不脱壳破解)。

如果我们需要对⼀个病毒或者⽊马进⾏分析,也是需要脱壳的,如果病毒⽊马不加壳,早被杀毒软件杀掉了。

⼀些常见的壳1、aspack壳2.caspr2、upx壳3、PEcompact壳等等...我们要脱壳,就需要⽤到⼀些汇编的指令,这是必须的,如果不懂汇编指令的话,那么就⽆法进⾏软件的脱壳了。

下⾯我就来介绍破解需要的⼀些主要的汇编指令⼀、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.1. 通⽤数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压⼊堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压⼊堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压⼊堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器⾥字节的顺序XCHG 交换字或字节.( ⾄少有⼀个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG ⽐较并交换操作数.( 第⼆个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第⼀个操作数⾥ )XLAT 字节查表转换.── BX 指向⼀张 256 字节的表的起点, AL 为表的索引值 (0-255,即0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输⼊输出端⼝传送指令.IN I/O端⼝输⼊. ( 语法: IN 累加器, {端⼝号│DX} )OUT I/O端⼝输出. ( 语法: OUT {端⼝号│DX},累加器 )输⼊输出端⼝由⽴即⽅式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. ⽬的地址传送指令.LEA 装⼊有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送⽬标指针,把指针内容装⼊DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送⽬标指针,把指针内容装⼊ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送⽬标指针,把指针内容装⼊FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送⽬标指针,把指针内容装⼊GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送⽬标指针,把指针内容装⼊SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装⼊AH.SAHF 标志寄存器传送,把AH内容装⼊标志寄存器.PUSHF 标志⼊栈.POPF 标志出栈.PUSHD 32位标志⼊栈.POPD 32位标志出栈.⼆、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的⼗进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04SHL AX,CL四、串指令─────────────────────────────────────── DS:SI 源串段寄存器 :源串变址.ES:DI ⽬标串段寄存器:⽬标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表⽰重复操作中SI和DI应⾃动增量; 1表⽰应⾃动减量. Z标志⽤来控制扫描或⽐较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串⽐较.( CMPSB ⽐较字符. CMPSW ⽐较字. )SCAS 串扫描.把AL或AX的内容与⽬标串作⽐较,⽐较结果反映在标志位.LODS 装⼊串.把源串中的元素(字或字节)逐⼀装⼊AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或⽐较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或⽐较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令─────────────────────────────────────── 1>⽆条件转移指令 (长转移)JMP ⽆条件转移指令CALL 过程调⽤RET/RETF过程返回.2>条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不⼩于或不等于时转移.JAE/JNB ⼤于或等于转移.JB/JNAE ⼩于转移.JBE/JNA ⼩于或等于转移.以上四条,测试⽆符号整数运算的结果(标志C和Z).JG/JNLE ⼤于转移.JGE/JNL ⼤于或等于转移.JL/JNGE ⼩于转移.JLE/JNG ⼩于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC ⽆进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯⽚引线TEST为⾼电平时使CPU进⼊等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置⽅向标志位.CLD 清⽅向标志位.STI 置中断允许位.CLI 清中断允许位.其实上⾯我们⽤到的也就主要有⼀些赋值指令和⼀些跳转指令⽽已,⼤部分我们⽬前是⽤不到的。

使用OllyDbg从零开始Cracking 第二十四章-OllyDbg反调试之综合练习

使用OllyDbg从零开始Cracking 第二十四章-OllyDbg反调试之综合练习

第二十四章-OllyDbg反调试之综合练习在我们介绍异常处理之前,我们先把上一章留下的antisocial1这个反调试的综合练习讲解一下。

这是一个加过壳的程序,当然,我们还没有介绍壳的相关知识点,我们只需要知道该程序加载到内存中以后,壳会解密原区段的各个区段的数据,然后跳转到原入口点(OEP)处执行原程序的代码。

当外壳程序解密/解压还原并跳转到OEP处,此时的内存映像就是已解压/解密过的程序,这个时候将内存映像抓取并保存为文件即可(该过程称之为Dump)。

首先我们用之前重命名过的OD,并且带上之前介绍过的所有插件,运行起来,我们会发现程序会终止,我们来尝试修复它。

好了,现在我们用重命名过的OD加载antisocial,将反反调试插件的选项都勾选上。

该提示表明该程序可能被加壳了,我们选择”是”按钮,然后就停在了入口点处。

这里我们会看到一些奇怪的东西,POPAD指令,该指令是从堆栈中恢复各个寄存器的值。

正常情况下,应该是首先PUSHAD保存各个寄存器的值,而这里并没有执行PUSHAD指令,就比较可疑了。

我们运行起来看看会发生什么。

这里这里提示错误-PUSH指令尝试压栈,但是这里没有写权限,但是通常来说堆栈应该是具有写权限的。

我们来看一看堆栈。

当前栈顶指针指向的是130000,我们重新启动程序。

我们可以看到当前各个区段的情况,我的机器上堆栈是从12C000开始,到12FFFF结束。

而现在操作是以130000起始的内存,它并不是堆栈,并没有写权限,所以会报错。

我们再次来到发生错误的地方。

我们可以看到该程序执行了另一个POPAD指令,接着就是条件跳转指令JNZ跳转到产生异常的PUSH的指令处,我们给POPAD 指令这一行设置一个断点。

现在,我们重新运行该程序让其断在该断点处。

我们现在来看下堆栈。

当前栈顶指针还属于堆栈的范围,紧接着执行POPAD指令。

当前栈顶指针已经超出了堆栈的范围,这是由刚刚的POPAD指令导致的,正常情况下来说应该是一开始执行PUSHAD指令将各个寄存器的值保存到堆栈中,然后才是执行POPAD指令将堆栈的值恢复到各个寄存器中。

PROCDUMP使用2

PROCDUMP使用2

首先我们要先准备我们的工具:1.Procdump1.502.Ultraedit6.10 (这个你也可以用别的编辑器)3.Winsoftice4.04.Trw0.755.MakePE1.276.Wdasm8.93好了!工具都准备齐全了,我们就去下载一个实验品吧!今次我们选的是UPX ,在 Procdump1.50 的脱壳文件列表中,你可以清楚地看到有 UPX 的选项,所以我们今次就选它了,目前它的最新版本是0.82 ,好了下载完毕了,我们先用它来为软件加一个脱吧!操作:1. 在 windows 上打开一个 Dos 窗口 , 进入 UPX0.82 所在的目录;2. 输入 upx [ 要加壳的文件路径和文件名 ]3.OK! 加壳成功了!好了!现在可以试一试脱壳了!操作:1. 运行 Procdump1.50 ;2. 按 Unpack 按钮,这时就出现了 Choose Unpacker 窗口;3. 在窗口中选择 UPX ,这时就会跳出一个选择你要脱壳文件的选择窗口;4. 按下打开,哦天啊!好痛苦啊!程序没有脱壳竟然运行了,Procdump1.50 提示一个错误发生在 script 的第一行。

以上的所有操作,是对自动脱壳来说的,基本上的自动脱壳的操作都是这样的。

好了,难道就这样没有戏唱了吗?作者写文章那会就写这几十行废话呢?请接着看下面的吧!好了,看一看它没有没防住winsoftice 呢?重新启动机器,换一个有安装 winsoftice 的windows 平台吧!再次运行被加脱了的程序,还好!没有当掉winsoftice ,这样心中暗喜,你有难了啊!看来外国人写的东西还是比较有善,不象 Ding Boy 的幻影系列,比小燕子还凶( ^o^ ,又说 Ding Boy 的坏话了,其实有时我觉得他比较象 Crack 界的小燕子,令人又爱又恨)。

好了关闭程序,用 winsoftice 载入去,唉刚刚还说好呢!原来它还是对 winsoftice 作了一点小动作,winsoftice 不能中断于程序的入口的第一句处。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

外壳程序解压还原后就会跳到OEP处执行,此时内存映像文件是己解压的程序。

这时就可抓取内存映像文件了(该过程称为Dump)。

当然不一定非要在程序原入口点抓取,只要能保证内存映像文件是己还原的就行了。

继续上一个实例notepad.upx.exe,到OEP后就可以Dump取内存映像文件:
004010CC55push ebp
004010CD8BEC mov ebp,esp
004010CF83EC44sub esp,44
运行LordPE.EXE,点击Options,默认选项如下:
默认选上“Fulldump:pasteheaderfromdisk”,PE头的信息直接从磁盘文件获得。

设置好后,在LordPE的进程窗口选择notepad.upx.exe,点击右键,执行“dumpfull”菜单命令。

如图:
将内存抓取的文件另存为dumped.exe,此时程序还不能运行,接下来就是重建输入表。

相关文档
最新文档