能力值:
( LV2,RANK:10 )
|
-
-
2 楼
弄了一晚上,累死我了...
|
能力值:
( LV6,RANK:80 )
|
-
-
3 楼
把关程序的部分nop掉....虽然会导致程序没法关了
随便改改 睡醒再搞
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
无视你的反调试,你那反调试检测PEB的吧?
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
下图为爆破注册
爆破位置 /*45510D*/ cmp al, byte ptr [edx+ebx-0x1] //比较用户名十六进制ASCII码,AL 注册码的两位|edx+ebx-0x1 异或结果 /*455111*/ jnz short 00455178 //结果相等正确不跳,循环验证第二位依次比较 将cmp al, byte ptr [edx+ebx-0x1] 改为 cmp al, al 即可,就是将正确的和正确的比较 ,结果自然正确呵呵!
文件CRC效验 /*4552B7*/ push eax /*4552B8*/ call <jmp.&proc.GetFileCRC> /*4552BD*/ mov ebx, eax /*4552BF*/ call <jmp.&proc.ReturnCRC> /*4552C4*/ cmp ebx, eax //EAX 原始CRC值 EBX 当前CRC值 /*4552C6*/ je short 004552D4 将cmp ebx, eax 改为 cmp eax, eax 即可, 也就是让它将原始CRC和原始CRC比较而不是比较当前的!这样就OK!!
---------------------------------
下图为算法注册
Name: xuefeng Code: CA7CCF33F603E3
 下面是算法分析
---------------------------------
按位取输入用户名字符的十六进制 ASCII码
KEY = B2 09 AA 55 93 6D 84 47
按位用KEY进行异或 KEY虽然只有8字节 因为用户名长度每个字符对应一个字节的KEY
如果超过8字节则循环用KEY异或
---------------------------------
B2 09 AA 55 93 6D 84 47 //异或用的KEY {xor} 78 75 65 66 65 6E 67 //用户名十六进制ASCII码 {=} CA 7C CF 33 F6 03 E3 //计算出正确的注册码
---------------------------------
注册码计算过程演示:
B2 xor 78 = CA 09 xor 75 = 7C AA xor 65 = CF 55 xor 66 = 33 93 xor 65 = F6 6D xor 6E = 03 84 xor 67 = E3
注册码 = CA7CCF33F603E3
程序注册验证过程其实就是反向异或而已,从而计算出用户名!
B2 xor CA = 78 = x 09 xor 7C = 75 = u AA xor CF = 65 = e 55 xor 33 = 66 = f 93 xor F6 = 65 = e 6D xor 03 = 6E = n 84 xor E3 = 67 = g
用户名 = xuefeng
以上便是我的分析,如有失误之处还请指教!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢您的指点,学习了
因为CRC自校验不太懂,所以做出这么个畸形 
想请大师指点一下CRC如何效检自身,我不明白程序在编译前并不知道自身在编译后的CRC值,那它如何检查自身CYC是否改动?
这里我无奈只有将CRC放入DLL中,在主程序中调用DLL函数ReturnCRC返回原始CRC再自与自身CRC比较.
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
[QUOTE=爱鸟;746894]把关程序的部分nop掉....虽然会导致程序没法关了
随便改改 睡醒再搞
 [/QUOTE]
 
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
是检测PEB的,是不是太脆弱了,能否指点一下,谢谢您
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
呵呵 我也不是十分清楚,没有实践就没有发言权!所以就不说了,免得在误导了你!
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
您的意思是程序运行的时候自已将计算到的CRC值写入本身?
谢谢您,我将再接再历
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
哪能这么说,您太谦虚了,能得您指点我很开兴了
|
能力值:
( LV3,RANK:30 )
|
-
-
12 楼
不是谦虚,事实如此,没实践就没发言权!
留个QQ吧 ,没什么事时 一起交流!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我的QQ:39800752
|
能力值:
( LV3,RANK:30 )
|
-
-
14 楼
/*4552C4*/ cmp ebx, eax //EAX 原始CRC值 EBX 当前CRC值
/*4552C6*/ je short 004552D4
楼主 应该在这个地方下点功夫了,如果把CRC原始值保存在EAX里面,这样做的话,让爆破者等于是不功自破了,为何不用动态的方式呢?
从程序运行逻辑上来看的话,检测点,已经到位了,强度还算不错,就是那个反调试的DLL,有待加强,我用了3种方法 过你的检测OD的方法
1:让EXE脱离你的DLL直接运行........OK
2:隐藏PEB,让你无法检测...........OK
3:给你程序下陷阱,自然而然就单跑EXE了............OK
追码过程,没详细的跟踪。
程序用的异常结构如此甚多,可能是delphi的特性吧!
|
能力值:
( LV3,RANK:30 )
|
-
-
15 楼
004552B4 |. 8B45 FC mov eax, dword ptr [ebp-4]
004552B7 |. 50 push eax
004552B8 |. E8 B7FCFFFF call <jmp.&proc.GetFileCRC>
004552BD |. 8BD8 mov ebx, eax
004552BF |. E8 B8FCFFFF call <jmp.&proc.ReturnCRC>
004552C4 3BD8 cmp ebx, eax
004552C6 |. 74 0C je short 004552D4
004552C4 3BD8 cmp ebx, eax
004552C6 74 0C je short 004552D4
je short 004552D4
|
jmp
楼主可以尝试下用VMP的方法,保护关键代码段
有强度的逻辑,在配上好壳,起码能难倒一般的Creaker
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
太谢谢您指点,继续努力加油!
|
能力值:
( LV9,RANK:170 )
|
-
-
17 楼
 我也来凑凑热闹
pediy
c26cce3cea
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
这个CRC位置是怎么找的?难道是慢慢地对比?不是吧。。我下ExitProcess断电总是慢了一步。。。
有没有什么好的办法找的这个CRC位置的?请教
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
delphi写得东西直接用dede反编译就能看到各个窗体事件的地址,这个CRC是在formCreate中比较的
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
我的努力啦!
|
能力值:
( LV3,RANK:30 )
|
-
-
21 楼
在exitpocess 上断的话,直接返回,肯定找的慢,搜索字符串上,会发现些突破的
|
|
|