首页
社区
课程
招聘
[旧帖] [原创]用C++做的壳 新人发 帖求一邀请码 0.00雪花
发表于: 2010-3-16 17:25 2408

[旧帖] [原创]用C++做的壳 新人发 帖求一邀请码 0.00雪花

2010-3-16 17:25
2408
发现论坛里面很多用汇编做壳的.现发一个用C++做壳的程序.
壳中只实现了跳转到目标程序,其他什么都没做,大家看看思路就好啦.

使用方法:
Cpacker <in> <out>.
E.g. Cpacker.exe C:\calc.exe C:\calc_.exe

以下用windows的计算器程序做示范.
处理之后:

拷贝壳代码到新段,修改OEP指向壳的代码.

新段的结构:

我定义了一个结构体用来保存目标程序的OEP.
typedef struct _Exchange_Data_
{
  DWORD  dwBeginFlag;
  DWORD  dwSize;
  DWORD  dwVersion;
  DWORD  dwOEP;
  DWORD  dwImageBase;
  DWORD  dwEndFlag;
}ExchangeData, *PExchangeData;

//只关心在Release下的运行结果
//暂不考虑Debug版本,因为编译器的翻译成汇编码时,在Debug下会增加很多额外的代码.

壳代码:
#pragma optimize("", off)     //关掉编译器的优化

int __stdcall Loader()
{
  DWORD  dwOriginalEntryPoint = 0;
  DWORD  dwCurrentAddr = 0;
  DWORD  dwEndFlag = 0;

  //get current address
  __asm{
    call lbl_ref1
lbl_ref1:
    pop dwCurrentAddr
  }

  //locate to the ExchangeData
  while (dwEndFlag != 0x24681357)
  {
    dwEndFlag = (DWORD)(*(DWORD *)(--dwCurrentAddr));
  }
  PExchangeData  ped = (PExchangeData)((DWORD)dwCurrentAddr);

  //haha. you can do something before the original program run.

  //jump to original program
  dwOriginalEntryPoint = ped->dwOEP ;
  __asm{
    call dwOriginalEntryPoint
  }

}

int __stdcall Loader_End()
{
  return 0;
}

下面是增加段和修改OEP的代码:
//add a new section and change OEP
PIMAGE_SECTION_HEADER  CPELibrary::AddCodeSection(char *szName, char *pSecBuff, DWORD dwSecSize, DWORD dwEntryPointOffset)
{
  DWORD roffset, rsize, voffset, vsize;
  int i  = pNtHeader->FileHeader.NumberOfSections;
  rsize = PEAlign(dwSecSize, pNtHeader->OptionalHeader.FileAlignment);
  vsize = PEAlign(dwSecSize, pNtHeader->OptionalHeader.SectionAlignment);
  roffset = PEAlign(pSecHeader[i-1]->PointerToRawData + pSecHeader[i-1]->SizeOfRawData, pNtHeader->OptionalHeader.FileAlignment);
  voffset = PEAlign(pSecHeader[i-1]->VirtualAddress + pSecHeader[i-1]->Misc.VirtualSize, pNtHeader->OptionalHeader.SectionAlignment);
  memset(pSecHeader[i], 0, sizeof(IMAGE_SECTION_HEADER));
  pSecHeader[i]->PointerToRawData = roffset;
  pSecHeader[i]->VirtualAddress = voffset;
  pSecHeader[i]->SizeOfRawData = rsize;
  pSecHeader[i]->Misc.VirtualSize = vsize;
  pSecHeader[i]->Characteristics = 0xC0000040;
  memcpy(pSecHeader[i]->Name, szName, strlen(szName));
  pSecs[i] = new char[rsize];
  memset(pSecs[i], 0, rsize);
  memcpy(pSecs[i], pSecBuff, dwSecSize);
  pNtHeader->FileHeader.NumberOfSections++;
  pNtHeader->OptionalHeader.AddressOfEntryPoint = pSecHeader[i]->VirtualAddress + dwEntryPointOffset;
  return (PIMAGE_SECTION_HEADER)pSecHeader[i];
}

附件是完整的工程(VS2005).
请指教.

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
写的很详细,顶起来~~~
2010-3-16 17:43
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还不太懂.学习中.楼主辛啦.........
2010-3-16 18:51
0
雪    币: 364
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不错 不错 谢谢LZ
2010-3-16 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark , 学习ing
2010-3-16 19:10
0
雪    币: 28
活跃值: (794)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我怎么什么也看不懂啊,谁教教我开始学要看什么书好啊。
2010-3-17 08:33
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看雪老大的书,加密解密第三版~~写的很详细,看雪里面也有很多资料看,先了解了解PE文件吧,这个是基础
2010-3-17 17:17
0
雪    币: 1045
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
来 像楼主 学习学习
2010-3-17 17:28
0
雪    币: 431
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
支持原创~~~
2010-3-17 17:30
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持原创,支持分享。
2010-3-17 18:22
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
bu  dong  hai shi  ding yixia
2010-3-17 19:25
0
雪    币: 248
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习下!!!!!!
2010-3-17 19:36
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
兼容性太差  我测试了3个程序 都是没有壳的程序
结果都如下图
上传的附件:
2010-3-17 20:10
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
设计真不错!
2010-3-17 20:22
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有代码就好,慢慢研究
2010-3-17 20:44
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16


请在Loader.cpp中把
//#pragma optimize("", off)
改成
#pragma optimize("", off)

这段代码没有做太多测试,请谅解。
2010-3-17 23:21
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
在我这也挂了,我热情的帮您调试了一下,貌似是
Loader_End

Loader
这两个函数的顺序在我这编译后和您预期的相反了,于是就悲剧了= =
2010-3-18 00:00
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
恩我已经搞定了,方法是在你的Loader最后加上
        __asm {
              push    eax
              push    ebx
              push    ecx
              pop     ebx
              pop     ecx
              pop     eax
              xchg    ebx, ecx
        }
这样一串花指令,然后从Loader开始找对应的机器码就可以找到结束位置了:)
2010-3-18 00:22
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
进来学习一下,正在读加密与解密第三版,还看不太懂楼主的程序
2010-3-18 00:30
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢 resty

就是计算壳代码大小时会发生错误。
原因是:
VS编译器会对代码做优化,导致在翻译成汇编码时,Loader()和Loader_End()的顺序发生了变化,在计算大小时出现溢出。
关掉优化后,编译器会按照C++码的顺序翻译成汇编码。就没有上述的问题了。


我对汇编不太熟悉,所以都是用C++的方式解决。在发布程序的时候疏忽了
附件0317是最新的,其实就改了一句话。
2010-3-18 00:39
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
新手 看不懂呢
2010-3-18 09:20
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习,顶!!
2010-3-24 15:44
0
雪    币: 317
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
我用vs2008编译的,出现了上面的情况,是不是哪里设置有问题?
上传的附件:
2010-3-25 17:21
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
to mzydcg:
V2008: Project->Properties->Configuration Properties->C/C++->Optimization->Optimization
改成Maximize Speed或者Minimize Size, 再试试.

谢谢!
2010-3-25 17:39
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
还有
Linker->General->Enable Incremental Linking -> No(/INCREMENTAL:NO).
C/C++->Code Generation->BufferSecurity Check->No(/GS).
2010-3-25 21:41
0
游客
登录 | 注册 方可回帖
返回
//