5手动脱壳软件重建IAT的第二部分(图)
点评:在本教程的第一部分,我们学习了如何正确转储(dump)软件5。现在我们要去魔法跳,所以IAT会适当地倾倒下来,无需手动修复。要做到这一点,我们需要克服程序中的一些陷阱,甚至在shell检测什么都不做时也让它们执行。让我们开始。
第一步:例如
在本教程的第一部分,我们学习了如何正确转储(dump)软件5。现在我们要去魔法跳,所以IAT会适当地倾倒下来,无需手动修复。要做到这一点,我们需要克服程序中的一些陷阱,并使它们在检测时执行,当shell什么都没有的时候。
让我们开始。
第一步:如何找到切入点和研究终点
在开始之前,我们首先将教程第一部分中的转储文件的副本保存在安全的地方。我的名字是TUTE.exe,记住这个名字。
使用Ollydbg载入学院。exe,我们要寻找的IAT。
正如我们在上面的图中看到的,如果我们跟踪它一点,我们就很容易找到一个。
叫{ }或{ } xxxxxx JMP xxxxxx间接就会跳到IAT内存地址的地方。在这张照片中,我们可以看到,5e9d94叫{ }。意味着电话会到内存地址,实际上是入口的IAT表的价值。在右边我们可以看到Kernel32.获取版本(黄色)这意味着这是一个可以在进口recontructor右边的入口。
让我们看看转储窗口。在转储(dump)窗口,并选择去表达5e9d94 。
这是一个很好的测验..你可以看到,进入5e9d94点77e5d142,价值是API获取版本。在我的机器,输入是正确的,在入口点其他条目也指向价值类似于7xxxxxxx。
注意,在其他机器上7xxxxxx值可能不同。但这些值彼此相似。现在让我们稍微查找一下,查找表的起始点。
红线标志着这张桌子的起点。线路上没有其他api值。现在我们知道桌子在哪里开始。
表开始= 5e99ec
现在去右下角的存储区来找到IAT表的结束点。正如我们在图片中看到的,有两个可能的终止点。如果我们不确定,我们最好选择后者。但是我们有更好的方法。
选择任何不被识别的值,然后颠倒桌面。停在401000,我们必须去一个叫{ }或{ xxxxx JMP xxxxx }。右键单击鼠标并选择搜索二进制字符串。
我们要看看这类inconfirmed条目,让我们试着5ea25c。记住反写作的价值,如下图所示。
钱在这儿
有点颠倒
我们看到,有一个叫使用这个值,所以不确定值也IAT。
现在我们知道
表尾= 5ea2bc
最后的值用于计算表的长度。这是一个非常简单的步骤:
长度= end-start
长度= 5ea2bc-5e99ec
长度= 8d0
写下的起点和长度的OEP在纸上,你会使用这些值时使用进口的改进。
第二步:找出不指向任何API的错误值。
当GETRIGHT.exe在垃圾场,这个问题就变得很容易。然后选择view-memory,你将看到这项指向DLL和错误的地方。
无论如何,如果我们试图用revirgin或进口来说,会有很多的作品,不能解决。这就是为什么我们邀请哈利·波特带来魔法的原因。
如表所示,仍然有一些(黄色标记)未解决的条目。通常,应对这种情况的方法是跟踪从存储开始,然后跟踪每一个调用API,写下名字,最后用进口组成..
如果解决自由问题的办法不多,那就很简单了。但是,如果有很多,这项工作将无法忍受。那么让我们看看另一种方式。
第三步:如何找到魔法跳跃
这里有一点:我们已经知道,一个程序的父进程,子进程一样,但它需要加载两次不同的处理,所以他们成为两个不同的过程:一方面,父进程的OEP是5f90b9,和父进程开始运行在这里。
另一方面,我们知道,当孩子被倾倒在OEP是534e90,但是我想告诉你,孩子的过程是由同一母5f80b9入口点开始。子进程的运行,解决他们自己的IAT然后跳转到错误的OEP引起的子过程,我想让你记住这一点,在第一部分中,我所说的。
如果你相信,我告诉你,按照父母的过程,直到父母开始转变为两个过程,父母和孩子,找到的地方,这是非常有用的。我找到了这个地方,这是一个有条件的跳跃,至于如何找到,我告诉你。
顺便说一下,这是不是从那份IAT其子进程的父进程,是从自己的IAT的过程。这应该是一个大问题,因为我们不能进入子OllyDbg之前,他从父进程。
这是一个烦恼,因为我不知道如何进入子过程来了解它如何运作自己的IAT。
首先,我想找一个错误的条目。从自TUTE.exe
我选择了5e9c34,但是你可以选择任何其他错误的条目,你可以看到,它的价值df5070。
记得要设置的值到零IsDebuggerPresent进行了按老规矩,清除所有以前的BPX,BP WaitForDebugEvent点击运行。
我们将在断点或异常处停止。当时,在一个开放的管的选择过程,以上2个过程(因为他是一个孩子的过程中,我们需要)。右键点击进入parcheando窗口选择4字节,地址显示在充满错误的输入偏置5e9c34。然后点击搜索。您将看到什么变化,因为所有的值都为零。
然后点击运行OD,在清清白白的点击,并检查值在字节的窗口。
点评:在本教程的第一部分,我们学习了如何正确转储(dump)软件5。现在我们要去魔法跳,所以IAT会适当地倾倒下来,无需手动修复。要做到这一点,我们需要克服程序中的一些陷阱,甚至在shell检测什么都不做时也让它们执行。
让我们开始。
第一步:例如
第一个变化可能发生很长一段时间,但记得要连续运行在OllyDbg,在清清白白的点击,并检查值在字节窗口直到从零字节的窗口变化值。
如图所示,该值已更改。再重复几次,你就会看到:
子进程已完全解决,分配到IAT ..我们必须在第一次更改后进入子过程。那是个问题,但我开了个玩笑来解决它。
我们将重复这个过程。关闭的parcheando窗口管因为处理变化时重新启动。
重复这个过程,直到你看到在管窗口值的第一个变化。你应该看到这样的东西:
很难找到一个好方法,所以我决定在API上创建一个死循环。选择这个工具。现在,我们将进入父进程查找它。选择view-ejecutable模块找到Kernel32.dll,该DLL。对GetProcAddress。
在view-names右键找到API GetProcAddress
写下地址(红箭头)。现在选择在管子的过程,让它去搜索(搜索)的地址值。不同机器的价值会有所不同。我在77e5b332。字节的窗口你会看到第一个字节是55 8B,所以在纸上写下,并在管它会变成EB铁然后按parchear
现在有一个死循环,我们可以说它已经睡着了。现在我们必须把它从父亲的过程。
单击父窗口中任意位置的鼠标右键,选择新原点并写下下列代码
推(儿子shandle)
电话debugactiveprocessstop
NOP(这里BPX和EAX = 1检查)
在0042f00a中断,然后运行停在0042f00a。看的登记窗口EAX的值,如果这个值是01,这意味着孩子的过程是从父进程分离。如果= 00,那么子进程的句柄填充的方式错了。你可以重写下面的代码,再运行,直到EAX = 01,那么你可以接近OllyDbg(杀死父进程!)然后,您可以进入子进程。
运行OllyDbg(不加载程序)连接到子进程。
再次,恢复原代码55 8B管并按parchear再次回到77e5b332程序看代码。
程序将被中断,如下图所示。
让我们在错误的条目看,右击转储转储窗口选择去表达5e9c34。
BP GetProcAddress,然后按运行,你可以看到,在中间的入口被打破,但表是不完整的。重新打开表是不完整的。一个OllyDbg加载EXE的研究。如果有以下5e9c8c错误的条目,它会在那里。
在5e9c98为例以误差值,因为它会被写入df513c。
回到Getright.exe(第一OllyDbg)看看堆栈。API在df4cb2叫叫,将返回df4cb8。
选择去表达0df4cb8。在主窗口
点评:在本教程的第一部分,我们学习了如何正确转储(dump)软件5。现在我们要去魔法跳,所以IAT会适当地倾倒下来,无需手动修复。要做到这一点,我们需要克服程序中的一些陷阱,甚至在shell检测什么都不做时也让它们执行。
让我们开始。
第一步:例如
下面的图片是我的机器中调用API调用的地址。在API的返回,BPX(这叫线下)。
单击运行
现在,硬件上写上BPX错入5e9c98点击运行。当它被写在那里时会被打破。
您可以看到,错误的值存储在前面的行中。指出错误的价值来自ebp-394 } {。所以你会选择去表达ebp-394 ..看到在转储窗口值在接下来的brekpoint硬件访问..
如果我按下run键,我会看到好的和坏的都保存在这行中。看到附近有一个叫BPX。
你可以看到,这是关键的电话,因为当它结束时,如果以价值,将后来写的。我测试这个呼叫中的每一跳(通常只有5到6次)。
00df4b68 / 75 03短00df4b6d JNZ
00df4b79 / 75 07短00df4b82 JNZ
00df4b8d / 74 0C乙脑短00df4b9b
00df4b92 / 74磅短00df4baf乙脑
00df4b99 ^ 75 F4锦州短00df4b8f
获奖者是在df4b8d跳。正如我之前提到的,这是在所有的犰狳一样,所以当我们把其他犰狳,我们可以很容易地跟踪这些代码找到这个好跳。
00df4b8d / 74 0C乙脑短00df4b9b
它必须总是跳,所以我们做它作为一个地图:
明确禁止,点击运行。(记得清楚硬件BPX)。当程序转到我们修改到死循环的指令时,输入表已经修复,并且没有坏值了。最后停在子过程的OEP。魔法跃值写在纸上(EB 0C),记得。
我们将重复这些步骤。当我们去我们解开子过程的最后一步,我们将建立一个无限循环而不是设置API魔法跳。
有脱钩的子从父进程那里,然后它将在神奇的跳跃执行周期。
加入孩子的过程中,按运行,然后停止(F12)。它将在魔跳时停止。
现在没有变化,因为魔术跳还没有起作用。改回以前的值(EB 0C)。
如果我们运行程序,它会停在OEP,和输入表是完美的。现在我们可以利用这一过程来恢复程序的第一部分进口重构。
所有的值都很好。最后几点是针对DLL的。
这些价值点exxxxx,如果我们看view-memory可以看到它的DLL。
现在我们要使用进口的重构。
开放进口来说选择这个过程中的附加到一个主动的过程对话框。
加载这些DLL需要很长时间。当完成时,写下它的价值,开始地址值的表和表的长度,以及不按IAT自动搜索。
如图所示的进口来说,价值是这样计算的:你写在纸上的值是图像库,例如,OEP = 534e90,图像库= 400000 - 400000 = 134e90 534e90。RVA,太,(起始表的地址值)。
现在它由get导入的所有条目固定。
点评:在本教程的第一部分,我们学习了如何正确转储(dump)软件5。现在我们要去魔法跳,所以IAT会适当地倾倒下来,无需手动修复。要做到这一点,我们需要克服程序中的一些陷阱,甚至在shell检测什么都不做时也让它们执行。
让我们开始。
第一步:例如
现在用固定转储加载转储文件。我叫它TUTE.exe
它将保持的tute_原始文件。exe ..
在这种情况下,犰狳保护失败了。
第四步:如何打败老板
如果我们尝试运行tute_ .exe不会停止。我只是说我打败了犰狳,但炮击文件不能正常工作。
程序员(坏人)不想GetRight 5运行打开自由地在我们的机器,然后他们的手和脚。
tute_ EXE加载。在OLLYDBG
跑,你会发现它突然终止。
创建getenvironmentvariablea一旦突破,我们需要改变的条件跳转,当程序从API返回。
看下一张图片。
这是突破点的获取。现在回到程序执行到返回,然后按F7。
这个过程会重复多次,所以要精通它。
改变跳跃。
这个类比反过来。
改变锦州JMP,你可以找到所有API的调用和修改在跳。我列出那些跳跃。
改变锦州JMP,你可以找到所有API的调用和修改在跳。我列出那些跳跃。
我想这犰狳已经完成。翻译Ricardo Narvaja的转身。英语:ftbirthday完成