【反调试】去除各种反调试

前不久破解一个软件的时候遇到了各种反调试,折腾的自己各种难受,最终爆破了之后感觉心情大快就顺手写下了这篇文章

使用工具

十六进制分析工具:winhex
查壳工具:PEID
脱壳工具:ollydump插件或者LordPE
脱壳修复工具:ImportREC
逆向工具:OllyDbg

分析过程

PE修复

打开源程序所在文件夹,发现有一个crackme,双机运行程序发现有这个提示:
这里写图片描述
应该是文件的PE结构被修改了,winhex载入分析发现:

这里写图片描述
果然是PE结构的问题,在DOS头后面的PE头的16进制应该为50 45,将上述52修改为45,保存文件之后发现仍然运行不了,证明PE结构仍然存在问题。
分析PE头后面的IMAGE_FILE_HEADER(映像文件头,NT头),对比结构:

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;                //运行平台
    WORD    NumberOfSections;       //文件的区块数目
    DWORD   TimeDateStamp;          //文件创建的日期和时间
    DWORD   PointerToSymbolTable;   //指向符号表
    DWORD   NumberOfSymbols;        //符号表中符号个数
    WORD    SizeOfOptionalHeader;       //IMAGE_OPTIONAL_HEADER32结构大小
    WORD    Characteristics;            //文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

上述地址分别相对于50450000之后偏移04h(4C01),06h(0300),08h,0Ch,10h,14h,16h对比之后发现在运行平台上为1F0h。
而我们熟知运行平台如下图:
这里写图片描述
故将其修改为14Ch,保存文件。修复PE结构之后可以正常运行了
双机运行之后如下图
这里写图片描述
输入用户名和注册码之后提示不正确,而且在过了一段时间之后程序自动退出,应该加了时间控制(此时主窗口已经退出,只有错误提示框)
这里写图片描述

脱壳

用PEID分析载入分析之后发现:
这里写图片描述
程序加了WinUpack的壳好在只是一个普通的压缩弱壳,用PEID自带的插件Krypto ANAlzer扫了一遍程序
这里写图片描述
了解到该程序并没有使用什么知名的加密算法。
因为这里加了壳,不便于静态分析,故笔者在这里并未使用IDA。用OD载入程序,OEP被壳修改,要先脱壳。因为WinUpack为弱壳,所以根据OEP定律,单步运行至OEP改变时右键数据窗口中跟随,然后下硬件访问断点,运行之后程序停在OEP,因为加了壳使OD并没有完全正常解析指令,:
这里写图片描述
开始脱壳,用ollydump记录下程序OEP,lordpe转存,脱壳之后因为IAT被破坏所以无法正常运行软件。
使用ImportREC修复脱壳后程序,将 OEP改为上述14EC,获取输入表,发现全部有效,然后修复上面脱壳的转存文件:
这里写图片描述
能正确运行。OD再次载入,停在正确的OEP,正式开始破解:(这里因为重建了输入表,所以程序的大小会比之前的源程序要大一些,属于正常情况)
这里写图片描述

初步分析

看到程序的入口点应该想到程序使用了较为高级的花指令,伪装了一些API调用,然后通过call eax致使无法查到这些API的调用。
根据最开始的提示Error(标题栏)和“注册码错误”,使用字符串查找如下:
这里写图片描述
Ctrl+G(转到上述地址),到这些地址处发现:
这里写图片描述

去除单步异常

退回到OEP一步步分析:运行到这一步时程序会自动终止:
这里写图片描述
因为前面有一个捕获异常函数SetUnhandledExceptionFilter,在程序被调试时,ptr ds[eax]此处地址为0是不可读写的,而这里向一块不可写的内存中写入0x1,自然触发异常,终止程序。
Nop掉这个函数和异常触发的mov。

去除父进程校验

重新载入程序至:
这里写图片描述
这个是窗口主函数了,这个API的第4个参数为00401340,就是窗口主程序所在地址了,转到在00401340下int 3断点,运行至后得:
先不着急单步,浏览一遍代码之后发现程序在此段中多次调用了0040101E处的函数,enter进去之后发现第二层反调试:

00401027  |.  68 28010000   push 0x128                               ; /Length = 128 (296.)
0040102C  |.  8D85 D8FEFFFF lea eax,[local.74]                       ; |
00401032  |.  50            push eax                                 ; |Destination
00401033  |.  E8 FA050000   call <jmp.&kernel32.RtlZeroMemory>       ; \RtlZeroMemory
00401038  |.  C785 D8FEFFFF>mov [local.74],0x128
00401042  |.  6A 00         push 0x0                                 ; /ProcessID = 0
00401044  |.  6A 02         push 0x2                                 ; |Flags = TH32CS_SNAPPROCESS
00401046  |.  E8 AB050000   call <
  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值