反破解技巧,请叫我搬运工

1:ZwSetInformationThread,
该函数可以移除调试线程,遗憾的是StrongOD.dll 在r0下已经HOOK 了此函数,所以该函数无论如何调用,总是返回成功。但实际并没有移除。
好了,我们可以根据这个函数来判定 StrongOD.dll 是否存在,如何判定,这里不说了,说了以后,该插件估计就要升级啦!

2:GetTickCount 和 GetLocalTime
获取运行时间
比如,我一个定时器,1秒一次,不断的获取时间,

static int Old_Time = GetTickCount();
if(GetTickCount() - Old_Time <=3000)
Old_Time = GetTickCount();
else
{        
    MessageBox(Null,"程序被调试了","",0);        
    Old_Time = GetTickCount();
}
定时器1秒一次,高于3秒钟,说明我们当前线程被暂停运行过。只有调试的时候才会暂停线程,程序肯定被调试了。
因为是程序正常调用,所以呵呵,目前任何OD都无法绕过该检测.....

有人说,我在你GetTickCount 处下断点,不就能找到你检测代码了吗?
别急,咱们自己构建这个函数,不用系统的。
DWORD __stdcall MyGetTickCount()
{
        DWORD nValue = 0;
        __asm
        {
                MOV EDX,0x7FFE0000
                MOV EAX,DWORD PTR DS:[EDX]
                MUL DWORD PTR DS:[EDX+4]
                SHRD EAX,EDX,0x18
                MOV nValue,EAX
        }

        return nValue;
}
这下破解者会很苦逼的。

3:既然GetTickCount 检测如此牛逼,我们可以在检测代码处进行下进行多重校验。
大多数验证代码都是这样的
call  xxxxxx
cmp eax,1
je 验证通过
//执行验证失败代码

很多人通过修改汇编代码,je 改写成 jmp来实现他们邪恶的目的。
7C809377   /0F85 7A080300   JNZ kernel32.7C839BF7
7C80937D   |3977 34         CMP DWORD PTR DS:[EDI+34],ESI
7C809380   |0F85 3D040000   JNZ kernel32.7C8097C3

7C809377   /0F85 7A080300   JNZ kernel32.7C839BF7
7C80937D   |3977 34         CMP DWORD PTR DS:[EDI+34],ESI
7C809380   |E9 3E040000     JMP kernel32.7C8097C3
7C809385   |90              NOP

我们可以看到7C809380处jnz 修改成 jmp 后,它对应的HEX 数据也从 0F85 改写成E9,如何检测,让他只要修改任意一条指令就能被我们发现。
其实方法很简单,只要在地址7C809377开始,读取指定字节,然后把数据累加下。它是一个固定的值。
方法:开几个线程互相对对方监控,
线程1监控线程2,线程2监控线程1,线程3监控线程1,只要一处代码被修改,都能检测到。也可以对一些敏感的API进行监控,
比如recv,send 因为WPE之类的抓包工具都会对函数进行HOOK.

4:检测到这些可恶的家伙在弄我们的程序,要ExitProcess退出吗?
当然不,他会在 TerminateProcess 和 ExitProcess 下断点等着你呢。我们可以直接破坏自己的程序,让程序异常退出。
比如,在程序里弄个死循环,无限申请内存,导致内存泄露,
比如,把数组里的数据给清空,导致访问异常。总之,搞死自己就可以了,别用API退出。

5:关键数据放服务器上,进行时间加密,确保每次封包都不一样,比如,很多外挂,把基址放服务器上,你爆破后,有界面没功能。


6:采用lua类似的模型。开辟一个独立的线程,所有的功能都集中在一个函数中完成
void Run(int nIndex)
{
//我们可以对nIndex 的不同类型,完成不同的敏感操作,
比如
为1:我们显示窗口
为2:弹出窗口
为3:设置字符串
}
由于Run和我们的验证代码不在一个线程里,所以,他很难通过栈回溯来找到关键call,增加破解难度。

7:字符串加密,在计算机语言里,有个叫异或运算的简单加密方式
字符a 和一个密匙进行异或后 变成另一个数
在异或运算一次,就又变回 a

int a =  a ^  Password;   //让a 和一个密匙加密
a =  a ^  Password;   //所得结果和同一个密匙运算一次,还原
因此,把字符串以int 数组的方式保存,然后用密匙还原。确保OD搜索插件搜不到。

以上就是我知道的反破解方法了,希望能帮助到大家。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值