李沉舟 发表于 2018-1-25 23:07

手动改造UPX壳,增加IAT保护

{:5_127:}慌,市统考,给自己减压。(其实是班头说这次期末考试不淘汰人下普通班(某人已笑晕在厕所)期末考试考3天,还有2天学校加考,接连考5天,崩溃ing,求安慰,求拯救!{:5_188:})话说,过年亲戚问成绩怎么打太极?大佬们有经验没?{:5_119:}
还有,我发现高级编辑器里面TAB键用不了啊。{:5_191:}

====================================正文=====================================
随便拿Delphi7,新建一个VCL窗体程序,画一个按钮,写两行代码。这一步骤讲究的是什么呢?率性而为,反正没什么卵用。比如,俺写的是这玩意。
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(0, '鸿雁在天鱼在水,惆怅此情难寄!', '', MB_ICONINFORMATION);
end;
编译,打开,点按钮,确认一切无误。

给它套上一层UPX的外壳。

OllyDbg载入它,找到OEP不用我多说了吧?ESP定律干掉,或者往EP后面找popad,下面的jmp就是了。
中断在OEP后,随便找一个API调用语句,比如jmp dword ptr,或者call dword ptr啦,具体是编译器来说话的。

比如我找到了这里。

在CALL上面按回车,跟进这个CALL看看。

转到DUMP窗口看看,用ADDRESS模式,发现这里就是IAT了。




这里有一个比较坑爹的问题了,我们知道啊,这桌面时代,就是Microsoft(巨硬)和Borland(宝兰)两个公司在干仗,开发工具一般就是这两家公司的产品。
这编译器构造PE的时候,导入表的处理就有分歧了。
Microsoft的IAT是整整齐齐,用一个DWORD类型的0,隔开每个对应每个DLL的IAT,而Borland就坑爹了,它的IAT是散乱的,也就是说,每个DLL对应的IAT表可能在内存分布中是不连续的。所以,脱壳的时候,修复IAT,这Borland就是急死人了,最好就是找到外壳填充IAT的地方,来Patch它得到一份完整的IAT表。

往下面翻一翻,就能找到MessageBoxA了。可以拉到IAT表头部之前,自己预判,然后往后面找MessageBoxA在你系统上的地址。
如果你用的Delphi是XE版本,那么要注意,你需要找MessageBoxW!
在0x4521AC下一个硬件写入断点(DWORD)长度,重新运行程序,找到外壳在这里填充IAT。
注意,我中断了两次,第一次发现0x4521AC里面是0,第二次才来到正确地方。
0046531A   .57            PUSH EDI                                     ;压入API名
0046531B   .48            DEC EAX
0046531C   .F2:AE         REPNE SCAS BYTE PTR ES:
0046531E   .55            PUSH EBP                                     ;压入DLL基址
0046531F   .FF96 F05A0600 CALL DWORD PTR DS:            ;取地址
00465325   .09C0          OR EAX,EAX
00465327   .74 07         JE SHORT Project1.00465330
00465329   .8903          MOV DWORD PTR DS:,EAX                   ;填充

现在,我们来考虑一下怎么给它设计一个API重定向。我参考了一下tELOCK壳。
00A80043   /EB 01         jmp   short 00A80046
00A80045   |90            nop
00A80046   \E8 0B000000   call    00A80056
00A8004B    33C4            xor   eax, esp
00A8004D    40            inc   eax
00A8004E    E9 0B000000   jmp   00A8005E
00A80053    98            cwde
00A80054    13C7            adc   eax, edi
00A80056    B8 8EBC9725   mov   eax, 0x2597BC8E
00A8005B    C3            retn
00A8005C    0BC2            or      eax, edx
00A8005E    90            nop
00A8005F    B8 8B14A800   mov   eax, 0xA8148B
00A80064    40            inc   eax
00A80065    FF30            push    dword ptr ds:               ; kernel32.GetVersion
00A80067    C3            retn


**** Hidden Message *****
现在,给这个程序再添加一个区块,换个工具,因为LordPE不会自己往文件后面补数据。这次要添加在磁盘里面实际存在的区块。用来存放要执行的加密代码。


pushad
pushfd

mov esi,dword ptr   ;取出指针地址
add esi,6
mov edx,esi
mov byte ptr,0x68
inc esi
mov dword ptr,eax            ;从壳里面跳过来的时候,EAX是API地址
add esi,4
mov byte ptr,0xC3
mov dword ptr,edx;更新指针

popfd
popad
mov eax,dword ptr
0x477000记得更新为0x466FFA






Patch完成后,看0x467000


修改的地方:




修复时,都是无效IAT。


打包一下,修改前后:


小结:
思路很简单,找到壳填充IAT的地方,添加两个区块,一个放解密IAT的代码(stub),一个放我们加密IAT的代码。从壳跳到我们的区块去执行加密,然后,嘿嘿。

Shark恒 发表于 2018-1-26 17:52

真不错,希望在闲暇之余,可以再给大家带来精彩教程!

DNA 发表于 2018-1-26 18:45

共同学习,共同进步

youxigx 发表于 2018-1-27 01:58

学习下如何增加保护

jiqigouer 发表于 2018-1-27 05:52

谢谢分享啊,学习一下

ICEFENG199 发表于 2018-1-27 19:24

没事没事,稳住,这样的考试以后还很多!!

chenjinghappy 发表于 2018-1-27 19:54

谢谢楼主分享{:5_116:}

Rooking 发表于 2018-1-28 09:41

最喜欢看这种纯技术文章了

www789 发表于 2018-1-30 17:16

谢谢分享,厉害

xpj3170734739 发表于 2018-1-30 17:26

共同学习,共同进步
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 手动改造UPX壳,增加IAT保护