C/C++知识点之手动脱加密壳(导入表hash 花指令)
小标 2019-06-10 来源 : 阅读 1213 评论 0

摘要:本文主要向大家介绍了C/C++知识点之手动脱加密壳(导入表hash 花指令),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之手动脱加密壳(导入表hash 花指令),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之手动脱加密壳(导入表hash 花指令)

1.载入 OD

C/C++知识点之手动脱加密壳(导入表hash 花指令)

发现esp定律就可以搞定
找OEP

C/C++知识点之手动脱加密壳(导入表hash 花指令)

看到了一个函数但od没有注释 可能加密

C/C++知识点之手动脱加密壳(导入表hash 花指令)

先去函数地址下断

C/C++知识点之手动脱加密壳(导入表hash 花指令)

C/C++知识点之手动脱加密壳(导入表hash 花指令)

函数出来了 说明oep没找错

C/C++知识点之手动脱加密壳(导入表hash 花指令)

到这里那就去IAT下硬件写入断点

C/C++知识点之手动脱加密壳(导入表hash 花指令)

重新运行程序下断成功

C/C++知识点之手动脱加密壳(导入表hash 花指令)

这里就是IAT 填充函数了
这里先讲下加密壳原理
1。先遍历要加密的程序的IAT然后把一个个函数的名称计算下hash 把算出来的hash保存起来
2。加密IAT
3.运行程序时没有壳的情况下一般是加载器帮我们填充IAT 有壳程序 就是壳来做了
4.因此一定会做的一件事情是遍历 那些用到的模块 然后一个个算函数名的hash如果相等 说明是这个 程序要用到的api
5.找了api 先把api地址保存到一个地方
6.然后把加密后的地址填充IAT
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

到了这里就只能f7一直跟 按着f7不放会发现一些 函数名称
![](//i2.51cto.com/images/blog/201805/26/2735ac7b81403f526933fe81f55bb562.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

同时它会一个个的字符取出来 (很定是一个字符串拷贝 那就有什么用呢)可能在算hash
断到跳转那也就是说明字符串取完了

C/C++知识点之手动脱加密壳(导入表hash 花指令)

看看它要干嘛  

C/C++知识点之手动脱加密壳(导入表hash 花指令)

继续f7 发现要比对hash  

C/C++知识点之手动脱加密壳(导入表hash 花指令)

C/C++知识点之手动脱加密壳(导入表hash 花指令)

到这里思路也就清析了 同时推断正确
那就在他相等的地方下断  其它断点可以去掉

C/C++知识点之手动脱加密壳(导入表hash 花指令)

f9 下断成功

C/C++知识点之手动脱加密壳(导入表hash 花指令)

到了这里也就是说找到了一个要填充的api 离最后不远了
盯着寄存器 慢慢看

C/C++知识点之手动脱加密壳(导入表hash 花指令)

加模块基址了  说明很快要填充了

C/C++知识点之手动脱加密壳(导入表hash 花指令)

单步 果然是一个api

C/C++知识点之手动脱加密壳(导入表hash 花指令)

续断盯着寄存器
又给了edx

C/C++知识点之手动脱加密壳(导入表hash 花指令)

又入栈了

C/C++知识点之手动脱加密壳(导入表hash 花指令)

C/C++知识点之手动脱加密壳(导入表hash 花指令)

到拷贝了 这里就步过了

C/C++知识点之手动脱加密壳(导入表hash 花指令)

出栈了

C/C++知识点之手动脱加密壳(导入表hash 花指令)

断续f7终于回到了起点

C/C++知识点之手动脱加密壳(导入表hash 花指令)

到了这里 就要推出它真的api地址放哪  
esc回退 写下来
去掉花指令

002E0502    8B4D A8         MOV ECX,DWORD PTR SS:[EBP-0x58]edx 保存真正api地址
002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; 04.00475048002E0D77    8B57 04         MOV EDX,DWORD PTR DS:[EDI+0x4]002E0949    0355 E4         ADD EDX,DWORD PTR SS:[EBP-0x1C]                    ; 04.00400000002E0EE2    8B45 A8         MOV EAX,DWORD PTR SS:[EBP-0x58]eax保存 加密的地址 放在iat中
002E0895    8902            MOV DWORD PTR DS:[EDX],EAX

这里就用了一个巧合  用到ecx

MOV DWORD PTR DS:[ECX+EAX-0x4],EDX     修改成 MOV ECX,EDX    
MOV EAX,DWORD PTR SS:[EBP-0x58]  修改成 MOV EAX, ECX
重新运行程序
这里有点坑  可能修改有先后(因为我用的是查找opcode )
在我这里先修改这个

C/C++知识点之手动脱加密壳(导入表hash 花指令)

再修改这个

C/C++知识点之手动脱加密壳(导入表hash 花指令)

修复IAT

C/C++知识点之手动脱加密壳(导入表hash 花指令)

正常运行
笔记

 OEP  0047148B    55              PUSH EBP0047148C    8BEC            MOV EBP,ESP0047148E    6A FF           PUSH -0x100471490    68 28514700     PUSH 04.0047512800471495    68 58214700     PUSH 04.004721580047149A    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]004714A0    50              PUSH EAX                                           ; 04.0047148B004714A1    64:8925 0000000>MOV DWORD PTR FS:[0],ESP004714A8    83EC 58         SUB ESP,0x58004714AB    53              PUSH EBX004714AC    56              PUSH ESI004714AD    57              PUSH EDI004714AE    8965 E8         MOV DWORD PTR SS:[EBP-0x18],ESP004714B1    FF15 80504700   CALL DWORD PTR DS:[0x475080]004714B7    33D2            XOR EDX,EDX                                        ; 04.<ModuleEntryPoint>

写入iat002E14D8    8D6424 04       LEA ESP,DWORD PTR SS:[ESP+0x4]002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; kernel32.HeapCreate002E14E0  ^ E9 15F2FFFF     JMP 002E06FA002E14E5    FF75 F4         PUSH DWORD PTR SS:[EBP-0xC]002E14E8  ^ E9 54F7FFFF     JMP 002E0C41002E14ED    031E            ADD EBX,DWORD PTR DS:[ESI]002E14EF    E8 61FAFFFF     CALL 002E0F55002E14F4    5A              POP EDX                                            ; kernel32.HeapCreate002E14F5  ^ E9 C0F8FFFF     JMP 002E0DBA002E14FA    837D AC 01      CMP DWORD PTR SS:[EBP-0x54],0x1002E14FE  ^ E9 0AFAFFFF     JMP 002E0F0D002E1503    8D6424 04       LEA ESP,DWORD PTR SS:[ESP+0x4]002E1507    59              POP ECX002E0502    8B4D A8         MOV ECX,DWORD PTR SS:[EBP-0x58]002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; 04.00475048002E0D77    8B57 04         MOV EDX,DWORD PTR DS:[EDI+0x4]002E0949    0355 E4         ADD EDX,DWORD PTR SS:[EBP-0x1C]                    ; 04.00400000002E0EE2    8B45 A8         MOV EAX,DWORD PTR SS:[EBP-0x58]002E0895    8902            MOV DWORD PTR DS:[EDX],EAX                         ; 填充IAT

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程