首页
社区
课程
招聘
[求助]shellcode开发 如何将多个c文件中的函数合并一起dump为二进制文件
发表于: 2017-3-21 19:43 3668

[求助]shellcode开发 如何将多个c文件中的函数合并一起dump为二进制文件

2017-3-21 19:43
3668

一直使用tombkeeper的shellcode模板框架

https://github.com/tombkeeper/Shellcode_Template_in_C


结构如下 

自己改动过


void ShellCode(){....}


fun1

fun2

fun3

.

.

.


void __declspec(naked) EndSign (){;}

void main(void)

{

DWORD ShellCodeSize;

ShellCodeSize = (DWORD)EndSign - (DWORD)ShellCode;

ShellCodeToHex ( (BYTE *)ShellCode, ShellCodeSize, stdout );

DumpShellcode2File("c:\\temp\\a.sc",(BYTE*)ShellCode,ShellCodeSize);

ShellCode();

}


这样可以直接将shellcode dump到二进制文件


问题来了,随着功能的不断堆积,函数也越来越多,代码文件已经超过了30KB,现在管理起来越来越麻烦。


目前正在想改进这个框架如何可以将多个文件(分门别类的将函数放在不同的c文件管理)中的函数紧凑的排列在内存中,dump为二进制文件。



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
2

现在我有2种想法: 1. 利用debug模式下生成map文件中函数名,组成一个funs.txt,再利用linker的 /ORDER:@"fun_order.txt"  命令将函数紧凑的排列在一起。然后dump出来,这个由个弊端就是 map文件中的名字都是 ?GetMemSize@@YAKXZ   ?ServiceHandler@@YGXK@Z       ?GetUserNameAndDomain@@YAXPAD0@Z 并且每次改动函数签名,就会变化 。实际操作起来很麻烦 2.假想的不太靠谱: 有没有办法能将所有函数就像 #include 和宏 一样将,多个c 文件的内容放在到一起。如下 void shellcode() { } #include "xx.c" #include "yy.c" void endSign(){}

2017-3-21 20:02
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
3
希望前辈拍砖
2017-3-22 09:21
0
雪    币: 45
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

解决方法1:

生成时使用自己编写的外部程序辅助,编译后使用vs的生成事件调用该程序,通过读取.map文件生成。


解决方法2:

将所有代码写到.h文件里,只有3个.c文件。

比如项目名字为server,shellcode.h shellcode.c为公共代码,main.c为生成器部分代码(main.obj,不会包含在生成的shellcode中)

则需要有server.h server.c两个文件,将库的.h文件在server.h包含一次,再在server.c包含一次....

这种方法的缺点就是vs无法折叠实现部分的代码

//
// 此文件可以将.c与.h的代码混写在同一个文件中,但是又不需要使用inline或static关键字
// 不需要#pragma once
// 被调用时,此文件先被.h文件包含一次,再被对应的.c文件包含一次即可
//
#if defined(__cplusplus)
extern "C" {
#endif
//////////////////////////////////////////////////////////////////////////
//                           声明部分                                 //
//////////////////////////////////////////////////////////////////////////
#pragma region Foo_Declaration
#if !defined(FOO_DECLARATION)
#define FOO_DECLARATION // 防止被重复包含

// 函数声明
void foo();
#pragma endregion Foo_Declaration
//////////////////////////////////////////////////////////////////////////
//                           定义部分                                 //
//////////////////////////////////////////////////////////////////////////
#pragma region Foo_Definition
#elif !defined(FOO_DEFINITION)
#define FOO_DEFINITION // 防止被重复包含

// 函数实现
void foo()
{
 return;
}
#endif
#pragma endregion Foo_Definition
#if defined(__cplusplus)
}
#endif

2017-3-26 21:59
0
雪    币: 45
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

 比如我这个项目:

生成后的map文件,可以看到函数有序排列,shellcode_start和shellcode_end仅包含了shellcode 的代码:

 runas

 Timestamp is 58d7cb1d (Sun Mar 26 22:07:25 2017)

 Preferred load address is 00400000

 Start         Length     Name                   Class
 0001:00000000 00004870H .text                   CODE
 0002:00000000 00000261H .rdata                  DATA
 0002:00000261 00000000H .edata                  DATA
 0003:00000000 00000004H .data                   DATA
 0003:00000020 000001bcH .bss                    DATA

  Address         Publics by Value              Rva+Base       Lib:Object

 0000:00000000       ___safe_se_handler_table   00000000     <absolute>
 0000:00000000       ___safe_se_handler_count   00000000     <absolute>
 0001:00000000       _GetFuncSize               00401000 f   main.obj
 0001:0000024b       _GetClearFuncSize          0040124b f   main.obj
 0001:000003e2       _CreateScFolder            004013e2 f   main.obj
 0001:000004c3       _PrintEncryptShellcode     004014c3 f   main.obj
 0001:00000585       _PrintShellcode            00401585 f   main.obj
 0001:0000099b       _main                      0040199b f   main.obj
 0001:000009be       _ShellCode_Start           004019be f   shellcode.obj
 0001:000009d0       _SetupJunk                 004019d0 f   shellcode.obj
 0001:00000ce1       _Hash_GetProcAddress       00401ce1 f   shellcode.obj
 0001:00000dad       _GetShellCodeAddr          00401dad f   shellcode.obj
 0001:00000dc1       _ReleaseRebaseShellCode    00401dc1 f   shellcode.obj
 0001:00000dd8       _ShellCodeEntry            00401dd8 f   shellcode.obj
 0001:00000e71       _GetRing3ApiAddr           00401e71 f   shellcode.obj
 0001:0000187f       _ROL                       0040287f f   runas.obj
...........................................................
 0001:000021a7       _FormatError               004031a7 f   runas.obj
 0001:00002598       _RunCMD                    00403598 f   runas.obj
 0001:00003846       _RunAsMain                 00404846 f   runas.obj
 0001:00003f1a      ??_C@_02LFEKMCM@?5f?$AA@   00406000     main.obj
 0002:00000004      ??_C@_0M@LNAMDANG@Shell32?4dll?$AA@ 0040600c     main.obj
 0002:00000018      ??_C@_0N@HAOHNMDE@Kernel32?4dll?$AA@ 00406024     main.obj
...........................................................

 0003:00000000       _lpData                    00407000     main.obj
 0003:00000020       _shellData                 00407020     main.obj

 entry point at        0001:0000099b

 Static symbols

看雪的新版bug太多,写的回帖居然跟我点回帖按钮时不一致,修改需要改两次...就这样吧

2017-3-26 22:03
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
6
zyla &nbsp;比如我这个项目:生成后的map文件,可以看到函数有序排列,shellcode_start和shellcode_end仅包含了shellcode 的代码:&nbsp;runa ...
谢谢你的帮助,问题已经解决,最近将成果整理下,做篇帖子分享下。
2017-3-27 09:31
0
游客
登录 | 注册 方可回帖
返回
//