吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1745|回复: 16
上一主题 下一主题
收起左侧

[UnPackMe] 自己写了个壳 请各位大佬来试试dump并修复IAT

[复制链接]
跳转到指定楼层
楼主
Command 发表于 2026-4-7 17:03 回帖奖励
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

自己写了个壳玩, 有反调试和一点点不算花指令的花指令;
CM本身逻辑十分简单, 重点是IAT, 这上面我加了点小心思,
当然如果可以的话可以给一些关于壳强度的建议

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wmr11 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
hszt 发表于 2026-4-8 11:47
本帖最后由 hszt 于 2026-4-8 11:56 编辑

脱壳文件
先执行到OEP(基址+0x14E0),再运行脚本,好像x64dbg不能重复执行脚本,再次运行脚本最好重新打开x64dbg,脱壳后把基址改成固定的
脱壳脚本
[Asm] 纯文本查看 复制代码
var base
var iatStart
var iatEnd
var currentAddr
var encryptedPtr
var stubBase
var stubSig
var dwordVal
var decryptedFunc
var decryptFn
var savedCip

mov base, UnpackME:base

mov iatStart, base
add iatStart, 1F3DC

mov decryptFn, base
add decryptFn, 25D9F

mov iatEnd, iatStart
add iatEnd, 398

mov currentAddr, iatStart

log "Base       : {x:base}"
log "IAT Start  : {x:iatStart}"
log "IAT End    : {x:iatEnd}"
log "Decrypt Fn : {x:decryptFn}"

LOOP:
cmp currentAddr, iatEnd
jae DONE

mov encryptedPtr, qword(currentAddr)
cmp encryptedPtr, 0
je SKIP

mov stubSig, dword(encryptedPtr)
cmp stubSig, 6A51006A
jne SKIP

mov stubBase, encryptedPtr
add stubBase, A
mov dwordVal, dword(stubBase)
cmp dwordVal, 0
je SKIP

log "Slot {x:currentAddr}  Stub {x:encryptedPtr}  Key {x:dwordVal}"

mov ccx, dwordVal
mov cax, dwordVal
mov savedCip, cip
mov cip, decryptFn
rtr
mov decryptedFunc, cax
mov cip, savedCip

cmp decryptedFunc, 0
je SKIP

log "  => {x:decryptedFunc}"
mov [currentAddr], decryptedFunc

SKIP:
add currentAddr, 8
goto LOOP

DONE:
log "IAT repair finished."
msg "修复完成,请用 Scylla 转储并固定基址。"
ret

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
Command + 3 + 1 用心讨论,共获提升!

查看全部评分

推荐
dglbh 发表于 2026-4-7 21:10
推荐
shenohe 发表于 2026-4-8 09:01
厉害,前来学习

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
勇者为王 -15 + 1 警告:CM区等技术版块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

5#
991547436 发表于 2026-4-7 19:06
AI说的 俺也不知道对不对


【目标文件】
  路径   : C:\Users\x\Desktop\UnpackME.exe
  基址   : 0x00007FF70BDB0000
  大小   : 0x28000 (163840 bytes)
  节区数 : 12 个(正常PE仅需5~6个,这是壳的特征之一)

【壳识别】
  壳名称 : YPacker (自定义壳,节区名 .ypacker 明文暴露)
  壳节区 : .ypacker @ 0x00007FF70BDD5000  大小=0x2800
  Import : 导入表 SIZE=0 ← 关键特征,所有API靠PEB手工解析
  CRC校验: 已检测(壳内有FNV-1a哈希校验反篡改)
  代码加密: .text 节区已加密(XOR+16字节密钥循环),起始字节=0x9A(非正常x64开头)

【节区映射】
  .text   @ 0x00007FF70BDB1000  98200 bytes  ← 加密状态
  .data   @ 0x00007FF70BDC9000  384 bytes
  .rdata  @ 0x00007FF70BDCA000  6112 bytes
  .idata  @ 0x00007FF70BDCF000  4192 bytes   ← IAT区,壳运行时填充
  .ypacker@ 0x00007FF70BDD5000  10240 bytes  ← 壳代码区

【当前RIP/EIP】
  当前EIP : 0x51DBF50E (ntdll 内部,程序在系统断点暂停)
  壳EP    : 0x00007FF70BDD6753  [ypacker_EP_STUB]

【壳执行流程分析 (完整调用链)】

  1. [0x00007FF70BDD6753] ypacker_EP_STUB
     push 0x00 / pushfq / push rax~r15 ← 保存所有寄存器现场(PUSHAD等效)
     mov rax, gs:[0x60]               ← 读取PEB
     mov rdx, [rax+0x10]              ← PEB.ImageBaseAddress

  2. [0x00007FF70BDD6784] call ypacker_XOR_decrypt_0x24_stub
     ↳ 对 .ypacker 数据区 [0x00007FF70BDD6A60] 进行 XOR 0x24 解密
       (0xBF=191 字节的字符串表,内含 API 函数名/DLL名)

  3. [0x00007FF70BDD6789] call ypacker_GetKernel32Base_via_PEB_LDR
     ↳ gs:[0x60]→PEB→PEB_LDR_DATA.InMemoryOrderModuleList
       遍历模块链表,用 FNV-1a 哈希(0x29CDD463) 匹配 kernel32.dll
       返回 kernel32.dll 基址 → RSI

  4. [0x00007FF70BDD679A] call 0x00007FF70BDD63BC
     ↳ GetProcAddress 的手工实现(解析 kernel32 导出表)
       通过函数名哈希获取 LoadLibraryA / GetProcAddress 等地址

  5. [0x00007FF70BDD67AC] call 0x00007FF70BDD548D (GetProcAddress_impl)
     ↳ 解析 VirtualProtect 地址 → RSI

  6. [0x00007FF70BDD67C5] call rax  ← GetProcAddress("LoadLibraryA")
     [0x00007FF70BDD67D9] call rdi  ← LoadLibraryA("...") 加载依赖DLL

  ⚠ [0x00007FF70BDD67DE] ypacker_ANTIDEBUG_int3_crash_trap
     int3 / int3
     xor rax,rax / xor rdx,rdx / idiv rax ← 除零异常!
     这段代码是 SEH/VEH 反调试:
     - 正常运行: 异常被 VEH 捕获并跳过
     - 调试器未处理异常: 程序崩溃 / 行为异常

  7. [0x00007FF70BDD6813] call 0x00007FF70BDD56DA
     ↳ 解析并填充 .idata 导入表(手工重建IAT)

  8. [0x00007FF70BDD6848] ypacker_VirtualProtect_RWX_0x40
     call rsi (VirtualProtect, addr=.text节区, size, 0x40, oldprot)
     ↳ 将 .text 节区改为 PAGE_EXECUTE_READWRITE

  9. [0x00007FF70BDD6891] ypacker_XOR_key16_decrypt_loop
     ↳ 用16字节密钥(来自 0x00007FF70BDD6B68)对 .text 节区做 XOR 解密
       key[i & 0x0F] XOR byte[.text+i] ← 循环异或还原真实代码

10. [0x00007FF70BDD68FE] call rsi (VirtualProtect, 恢复原始保护属性)
     ↳ 恢复 .text 为 PAGE_EXECUTE_READ

11. [0x00007FF70BDD69CA] call 0x00007FF70BDD5116 (GetProcAddress_for_OEP_RVA)
     ↳ 从 .ypacker 数据中读取 OEP RVA
     [0x00007FF70BDD69CF] mov rax, [0x00007FF70BDD6B34]
     [0x00007FF70BDD69D6] add rax, rbx  ← OEP = ImageBase + OEP_RVA

12. [0x00007FF70BDD69D9] ★ ypacker_WRITE_OEP_to_stack_ret ★  ← 断点已设!
     mov [rsp+0x80], rax  ← 将真实OEP写入栈返回地址

13. [0x00007FF70BDD69E1~69F8] pop r15~rax / popfq ← 恢复全部寄存器
     [0x00007FF70BDD69F9] ret  ← 跳转到真实OEP(通过栈上写入的地址)

【反调试手段汇总】
  ① int3 + int3 + idiv 0 (SEH/VEH陷阱) @ 0x00007FF70BDD67DE
  ② FNV-1a 代码哈希校验(CRC检测,防止patch/断点修改字节)
  ③ PEB.NtGlobalFlag / IsDebuggerPresent 检测(通过PEB遍历,隐式检测)
  ④ Import表为空(静态分析/IDA无法识别API调用,阻止静态逆向)
  ⑤ ud2 指令 @ 0x00007FF70BDD69FB(非法指令陷阱,阻止单步越界)

【脱壳方法 — 推荐步骤】

  方法A: 断点法(推荐,已设好断点)
  ─────────────────────────────────────
  ① 在 x64dbg → 选项 → 事件 → 取消勾选"系统断点"
     或: 选项 → 首选项 → 反调试插件(ScyllaHide) 开启
  ② 处理反调试:
     - 在 x64dbg 安装 ScyllaHide 插件并启用全部选项
     - 或手动在 0x00007FF70BDD67DE 处 NOP 掉 int3*2
  ③ 断点已在 0x00007FF70BDD69D9 (ypacker_WRITE_OEP_to_stack_ret)
  ④ 运行(F9) → 断点命中后:
     RAX = 真实OEP地址(ImageBase + OEP_RVA)
  ⑤ 记录OEP,F8步过 → ret到OEP → 此时.text已解密
  ⑥ 使用 Scylla 插件 Dump进程 → Fix IAT → 保存脱壳文件

  方法B: 内存断点法
  ─────────────────────────────────────
  ① 在 .text 节区首字节 0x00007FF70BDB1000 设内存执行断点(HWBP)
  ② 运行,当解密完成后壳会跳转到.text执行,断点命中即为OEP

  方法C: VirtualProtect Hook法
  ─────────────────────────────────────
  ① 对 VirtualProtect 的第二次调用(恢复属性后)设断点
  ② 此时.text解密已完成,记录RIP/查看栈上返回地址即为OEP

【注意事项】
  ⚠ 必须使用 ScyllaHide 或手动处理 int3/idiv0 反调试
  ⚠ 不要在 .ypacker 节区内设软件断点(会破坏CRC校验导致壳检测到调试)
  ⚠ 已标注断点位置: 0x00007FF70BDD69D9 (ypacker_WRITE_OEP_to_stack_ret)

【标签已设置(x64dbg GUI可见)】
  ypacker_EP_STUB                  @ 0x00007FF70BDD6753
  ypacker_XOR_decrypt_0x24_stub    @ 0x00007FF70BDD66F4
  ypacker_GetKernel32Base_via_PEB  @ 0x00007FF70BDD559B
  ypacker_FNV1a_hash               @ 0x00007FF70BDD5000
  ypacker_LCG_PRNG                 @ 0x00007FF70BDD5055
  ypacker_ANTIDEBUG_int3_crash     @ 0x00007FF70BDD67DE
  ypacker_VirtualProtect_RWX_0x40  @ 0x00007FF70BDD6848
  ypacker_XOR_key16_decrypt_loop   @ 0x00007FF70BDD6891
  ypacker_WRITE_OEP_to_stack_ret   @ 0x00007FF70BDD69D9  ★断点★
  ypacker_FINAL_ret_to_OEP         @ 0x00007FF70BDD69F9

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
6#
 楼主| Command 发表于 2026-4-7 19:51 |楼主
991547436 发表于 2026-4-7 19:06
AI说的 俺也不知道对不对

差不多, 但是他可能没看IAT那一块, IAT那一块用单纯的工具是不行的
7#
ZKQ5688 发表于 2026-4-7 20:25
学习了  厉害

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
bian96 -15 + 1 警告:CM区等技术板块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

8#
welcomeNas 发表于 2026-4-8 01:48
谢谢技术佬的分享

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
bian96 -15 + 1 警告:CM区等技术板块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

9#
Zsl155188 发表于 2026-4-8 08:59
学习了看看

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
勇者为王 -15 + 1 警告:CM区等技术版块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

10#
wmr11 发表于 2026-4-8 12:06
谢谢,学习

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
bian96 -15 + 1 警告:CM区等技术板块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-21 18:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表