首页
社区
课程
招聘
[求助]关于catch22上自杀代码在GCC下的编译问题.
发表于: 2006-2-1 13:36 6282

[求助]关于catch22上自杀代码在GCC下的编译问题.

2006-2-1 13:36
6282

6fcK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4S2N6r3y4Z5x3U0u0Q4x3X3g2F1k6i4c8Q4x3V1k6@1N6i4c8K6i4K6u0r3M7$3g2D9k6X3c8W2L8q4)9J5k6h3q4K6M7q4!0q4y4q4!0n7z5q4)9^5b7g2!0q4y4#2)9&6b7#2)9^5b7W2!0q4y4g2)9^5z5q4!0n7x3q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4q4!0n7b7W2!0m8x3#2!0q4y4#2!0m8x3q4)9^5x3g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4g2!0m8c8g2)9&6c8g2!0q4z5g2)9&6z5g2)9^5y4g2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0m8c8W2)9&6x3g2!0q4y4q4!0n7z5q4!0m8c8q4!0q4y4g2)9&6b7#2!0m8z5s2k6U0y4W2!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4q4!0n7c8q4!0n7c8W2!0q4y4#2)9&6y4q4!0m8z5s2u0W2L8r3g2S2M7$3g2Q4c8e0k6Q4b7e0S2Q4b7e0q4Q4c8e0g2Q4b7V1y4Q4z5p5k6Q4c8e0N6Q4b7V1y4Q4z5e0k6Q4c8e0S2Q4b7f1k6Q4z5e0q4Q4c8e0W2Q4z5o6m8Q4z5f1q4Q4c8e0S2Q4b7V1k6Q4z5o6N6Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0N6Q4b7V1y4Q4z5e0k6Q4c8e0S2Q4b7f1k6Q4z5e0q4Q4c8e0g2Q4z5o6N6Q4b7V1q4Q4c8e0k6Q4z5f1c8Q4b7e0g2Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0c8Q4b7V1u0Q4b7U0k6Q4c8e0c8Q4b7U0W2Q4z5f1k6Q4c8e0g2Q4z5p5k6Q4b7f1k6Q4c8e0S2Q4z5o6N6Q4b7f1q4Q4c8e0g2Q4z5o6S2Q4b7e0m8Q4c8e0W2Q4z5e0W2Q4b7e0c8Q4c8e0y4Q4z5o6m8Q4z5o6u0p5k6h3u0#2k6#2!0q4y4W2!0m8z5q4!0m8x3g2!0q4y4g2!0n7b7#2)9^5c8W2!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0m8c8W2)9&6x3g2!0q4z5g2)9^5x3q4)9&6b7g2!0q4z5q4!0n7c8W2)9^5y4#2!0q4x3#2)9^5x3q4)9^5x3W2!0q4z5q4!0n7c8W2)9&6x3q4!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4#2)9&6y4q4)9&6c8W2!0q4y4W2)9^5z5q4)9&6x3q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4q4!0n7b7W2!0n7y4W2!0q4y4g2)9^5y4#2!0n7b7g2!0q4z5g2)9&6y4q4)9&6z5g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4W2)9&6y4#2!0m8x3q4!0q4y4W2!0n7x3#2)9&6y4g2!0q4z5q4)9^5y4#2!0m8b7g2!0q4y4g2)9^5z5q4!0m8x3q4!0q4z5g2)9&6z5g2!0m8y4q4!0q4x3#2)9^5x3q4)9^5x3R3`.`.
在使用mingw32中GCC编译时候。编译通过。但是运行无法自删除。

想请教下如果想用gcc编译。要怎么做哦?

ps:代码中的
#pragma pack(push, 1)

#define CODESIZE 0x200
        。
        。
        。
#pragma pack(pop)

#ifdef _DEBUG
#define FUNC_ADDR(func) (PVOID)(*(DWORD *)((BYTE *)func + 1) + (DWORD)((BYTE *)func + 5))
#else
#define FUNC_ADDR(func) func
#endif
这几句不是很懂。希望大大们帮忙解释下。谢谢了先。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 275
活跃值: (466)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
#pragma pack(push, 1)

这里有详细的解释:92eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3&6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3u0J5j5i4u0&6i4K6u0r3k6r3g2X3j5i4g2D9N6q4)9J5k6h3q4K6M7q4)9K6c8Y4g2J5L8q4)9K6c8q4)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6W2L8W2)9J5k6s2g2K6i4K6u0r3N6X3y4D9j5h3&6Y4i4K6u0r3K9s2c8E0L8q4)9J5c8W2)9#2k6Y4m8J5k6h3c8A6M7W2)9#2k6Y4m8S2j5$3E0Q4x3X3g2S2M7%4l9`.

#define CODESIZE 0x200
定义复制到远程线程中代码长度

#define FUNC_ADDR(func) (PVOID)(*(DWORD *)((BYTE *)func + 1) + (DWORD)((BYTE *)func + 5))
这个宏表示得到近CALL或者近跳转地址,它们指令长度都是5字节,例如:
DEBUG版生成如下形式代码,
.text:004110D7 sub_4110D7      proc near               ; CODE XREF: sub_411280+90p
.text:004110D7                                         ; sub_411280+110p ...
.text:004110D7                 jmp     sub_411880
.text:004110D7 sub_4110D7      endp

FUNC_ADDR(sub_4110D7)宏后就得到sub_411880这个地址
2006-2-1 16:13
0
雪    币: 275
活跃值: (466)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
用MINGW不能自动删除是因为编译器对于函数地址解释与VC不同的原因:

出错代码如下:
local.fnWaitForSingleObject	= (FARPROC)WaitForSingleObject;
local.fnCloseHandle		= (FARPROC)CloseHandle;
local.fnDeleteFile		= (FARPROC)DeleteFile;
local.fnSleep		= (FARPROC)Sleep;
local.fnExitProcess		= (FARPROC)ExitProcess;
local.fnRemoveDirectory	= (FARPROC)RemoveDirectory;
local.fnGetLastError		= (FARPROC)GetLastError;


WaitForSingleObject得到的并不是函数地址,而是间接调用地址,对应的反汇编代码如下:
  401160:	c7 85 90 fb ff ff c0 	movl   $0x4013c0,0xfffffb90(%ebp)

004013c0 <_WaitForSingleObject@8>:
  4013c0:	ff 25 d8 40 40 00    	jmp    *0x4040d8
  4013c6:	90                   	nop    
  4013c7:	90                   	nop    

当在远程代码是调用local.fnWaitForSingleObject等函数的时候,也就是调用$0x4013C0这个地址,而这个地址在远程代码所在进程中不是WaitForSingleObject函数的调用。
当用VC编译的时候,编译器传入的是WaitForSingleObject直接地址,这个直接地址在整个NT操作系统所有的进程空间中的地址都是一样的,不用考虑DLL重定位后的地址不同这个问题。
所以正确的VC和GCC编译器通用代码应该是传递WaitForSingleObject等函数的直接地址,如下:
HINSTANCE hKernel;
hKernel = LoadLibrary("kernel32.dll");
local.fnWaitForSingleObject	= GetProcAddress( hKernel, "WaitForSingleObject");
// 其它的函数...
FreeLibrary(hKernel);


附修改后的代码及DEV-CPP工程文件:
上传的附件:
2006-2-5 13:10
0
游客
登录 | 注册 方可回帖
返回