通过全局变量和自擦除代码来防Dump
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
讨论新闻组及文件
一般而言,你的程序一旦运行起来就没有办法防止Dump了,因为所有的数据都在内存中了,而且,为了更好的Dump完整程序,程序将要启动,还未启动时的Dump,任你程序中有多少防Dump的方法都没有用。这里只能结合两种方式来实现反Dump,其一,程序运行的时候其本身数据并不是完整的,以前我已经讲过方法了,《让EXE文件不能直接启动的方法以防止直接调试的方法》,只要多用几次这样的方法,比如启动代码无效,中间某段代码也无效,然后通过与启动程序的交互来完成中间代码的修改,只在启动程序通知后才继续运行,以防止错误。这样就没有办法通过在文中介绍的启动时Dump来Dump数据了。对于Dump的作用还不理解的,可以去使用一下LordPE的Dump功能,保证你能够见识到工具的作用性如此之大,并认识到自己程序多么的脆弱。
通过全局变量防Dump
但是这种方法有个缺陷是,程序一旦运行起来,所有代码段的数据都是正确的了,还是可以Dump出来,有种方式是用某个全局变量来指示是否是Dump出来的数据或者是正常运行的数据。
这里介绍一下:
1
2 #include "stdafx.h"
3 #include "windows.h"
4 #include "tchar.h"
5
6 bool gbDumped = false;
7
8 int main(int argc, char* argv[])
9 {
10 if(!gbDumped)
11 {
12 gbDumped = true;
13 MessageBox(NULL, _T("Right"), _T("Hello World"), MB_OK);
14 }
15 else
16 {
17 MessageBox(NULL, _T("Dumped me?!"), _T("Find you Dumped me!!"), MB_OK);
18 }
19 return 0;
20 }
21
这样只要实在你弹出了对话框后Dump出来的程序其实就是不对的程序,虽然逻辑上将,应该会弹出另外一个对话框,但是实际上对于这样正常流程根本不会走到的地方甚至有可能被编译器所优化,然后导致Dump出来的程序直接崩溃。但是这样的程序可以被跟踪调试,通过找到全局变量并修改实在不是什么很难的问题。
下面再将一个稍微复杂一点的办法,让代码一旦运行起来,程序代码段就被破坏,那么这样运行时的Dump也就更加无效了,并且此种方法还可以防止调试。因为完整的程序已经不存在了。
通过自擦除代码来防Dump
原理上也很简单,对于那些只会运行一次的代码,直接在运行后将自己在代码段的内容擦除,可以写入任意值来迷惑调试者,效果更佳。
源代码:
1 #include "windows.h"
2 #include "tchar.h"
3
4 voidRun()
5 {
6 // begin of the func
7 DWORD ldwBegin = 0;
8 __asm
9 {
10 call $+5
11 pop eax
12 mov ldwBegin, eax
13 }
14 DWORD ldwOldPro = 0;
15 // Must have this step
16 if(!VirtualProtect((void*)0x401000, 1000, PAGE_EXECUTE_READWRITE, &ldwOldPro))
17 {
18 printf( "VirtualProtectEx failed (%d)./n", GetLastError() );
19 return;
20 }
21
22 MessageBox(NULL, _T("Right"), _T("Hello World"), MB_OK);
23
24 // begin of the func
25 DWORD ldwEnd = 0;
26 __asm
27 {
28 call $+5
29 pop eax
30 mov ldwEnd, eax
31 }
32
33 DWORD ldwFuncLen = ldwEnd - ldwBegin;
34 BYTE *lpbyRand = newBYTE[ldwFuncLen];
35
36 DWORD ldwWritten = 0;
37 if(!WriteProcessMemory(GetCurrentProcess(), (void*)ldwBegin, lpbyRand, ldwFuncLen, &ldwWritten))
38 {
39 printf( "WriteProcessMemory failed (%d)./n", GetLastError() );
40 }
41 delete[] lpbyRand;
42 }
43
44 intmain(intargc, char* argv[])
45 {
46 Run();
47 MessageBox(NULL, _T("OK"), _T("OK"), MB_OK);
48
49 return0;
50 }
以上代码,在弹出OK后再Dump,下次再进入Run函数会直接报错,因为后来添进去的其实是堆上的随机数值。
这里需要说明的是
call $+5
pop eax
两句内嵌代码的含义是获取当前的EIP,这在壳中用的非常多,我在这里套用了一下。这样ldwBegin就是Run函数的开始EIP,ldwEnd虽然不是函数结束的EIP,但是主体部分已经包括在内了, 达到这样的效果就足够了。
通过上面的两种方式基本上可以预防住运行时的一次性Dump,而且可以将上述方式扩展,将多段擦除,结合以前讲的方式,将多段代码由启动程序来写入,这样无论是启动时的Dump,还是运行时的Dump都不能获取到正确的内容了。
但是破解方式还是有的,比如这种方式,只需要跟踪调试程序,绕过WriteProcessMemroy函数的调用就可以了,或者直接一点,直接将此API函数挂接上并使其无效,无论多少此的自擦除都会无效。
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
分享到:
相关推荐
当windows程序崩溃,通过此此代码可以产生完整的dump文件,并可控制产生文件数量
rtmpdump源代码以及说明书。如果从官网下载一个 rtmpdump源代码源代码。
关于dump的教程,示例代码
博文对应的文件。包含转储文件和调试符号及对应的程序。可以直接使用windbg分析对应的dump文件。注意设置好调试符号的路径。
自己写的查找Dump adroid crash堆栈函数的源代码 使用方法: cd C:\androidNDK\build\prebuilt\windows\arm-eabi-4.2.1\bin arm-eabi-objdump -d XXX.so >lib.txt 把crash 代码放入input.txt 运行sofind 生成...
执行改注册表后,程序崩溃后会自动生成dump
在window程序中,添加代码一边在程序崩溃时候产生coredump,能准确定位崩溃地点。
dump1.08 js_变量调试.rar
windows C++ 产生dump文件的demo,定位代码内存错误非常有效
DumpTool主要用来在用户机器上对目标进程生成dump文件,定位“卡死”、Crash等问题。 (1)MiniDump: 表示生成一个包含必要信息的dump文件,文件大小约200-500k,具体Flag =MiniDumpNormal|...
在日志明显不足的时候,把进程中相关数据DUMP下来分析就是一个比较实用方便的方法。很多应用都会提供这类功能,以便在程序出现问题时可以把相关的数据发给开发者,方便开发者分析问题。
包含两个版本一个是网上的原版,一个是修改版 dump_src.js是原版的(网上找的)回弹出...示例: dump(变量); dump.js 是我修改的,返回一个字符串(类似于php的dump) 示例: document.writeln("<pre>".dump(变量)."</pre>");
手把手教你的精彩 配套博文地址:https://blog.csdn.net/maoyeahcom/article/details/108583124
dump转换到txt文件
在本讲中,我们将会利用上一讲的一些代码,来建立一个更实用的程序。 本程序的主要目标是展示如何解析所捕获的数据包的协议首部。这个程序可以称为UDPdump,打印一些网络上传输的UDP数据的信息。 我们选择分析和...
(1)留意批处理 dump_all 和 hotcopy_all 中的三个路径,分别是安装目录、库目录、备份目录,这三个目录都支持路径中含有空格 (2)改写上面三个路径的时候,不要在路径前后添加引号 (3)将系统的时间格式,稍作...
转储有关变量的信息。 现在,godump是项目的一部分。 安装 go get github.com/liudng/godump 样例代码 package main import ( "github.com/liudng/godump" ) func main () { a := make ( map [ string ] int64 )...
SVN源代码泄露全版本Dump源码
对于想在逆向领域有所作为的,这个必须得看,有利于自身修为提高
在客户机器上如何得到应该程序的详细出错信息, 这里使用drwtsn32,在应用程序崩溃的时候自动将调用栈的信息以文件形式保存在磁盘。... 生成dump有drwtsn32, NTSD,CDB等多种工具,drwtsn32 于系统自带。