好友
阅读权限30
听众
最后登录1970-1-1
|
h_one
发表于 2013-12-14 02:30
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
本帖最后由 zxcfvasd 于 2013-12-14 02:30 编辑
0x1
【作者】:zxcfvasd
【操作平台】:xp sp3
【使用工具】:OD
0x2
随便输入后程序就会退出,然后就可以找到退出原因,eax = 调用的服务编号,使用0x7FFE0300 ntdll.KiFastSystemCall快速切入内核调用退出函数。 这也就是为什么作者说逆向分析在sp3上的原因吧
顺藤摸瓜:找点关键点让其断下(4012E0)
这里检查关键点是否下有断点,我直接将原来的je,该为jmp,即使检查到有断点也不会退出,
00401388 . FF15 00304000 call dword ptr ds:[<&KERNEL32.GetProcAdd>; \GetProcAddress
0040138E . 6A 14 push 0x14
00401390 . 50 push eax
00401391 . E8 DA040000 call CrackMe1.00401870 ;软件断点检查函数
00401396 . 83C4 08 add esp,0x8
00401399 . 85C0 test eax,eax
0040139B . EB 05 jmp XCrackMe1.004013A2
0040139D . E8 BE040000 call CrackMe1.00401860 ;进程退出函数
004013A2 > 68 9E000000 push 0x9E
004013A7 . 68 A0184000 push CrackMe1.004018A0
004013AC . E8 BF040000 call CrackMe1.00401870
004013B1 . 83C4 08 add esp,0x8
004013B4 . 85C0 test eax,eax
004013B6 . EB 05 jmp XCrackMe1.004013BD
004013B8 . E8 A3040000 call CrackMe1.00401860
接下来调用两个SetTimer,分别在TimeProc函数上下断
F9然程序跑气;
会断到时间会调函:
在4018A0: 调用QueryPerformanceFrequency函数,计算程序运行时间(dagai),然后比较值进行反调试
004018D3 > \68 F0404000 push CrackMe1.004040F0 ; /pPerformanceFreq = CrackMe1.004040F0
004018D8 . FF15 08304000 call dword ptr ds:[<&KERNEL32.QueryPerfo>; \QueryPerformanceFrequency
004018DE . 68 F8404000 push CrackMe1.004040F8
004018E3 . FFD6 call esi
00401931 . 3D D0070000 cmp eax,0x7D0 比较计算的时间值
00401936 . 5E pop esi
00401937 . EB 05 jmp XCrackMe1.0040193E 我使用同样的方法jmp
00401939 . E8 22FFFFFF call CrackMe1.00401860
0040193E > C2 1000 retn 0x10
在401950中:
同样是对关键点是否下有断点检查
下面这段代码是判断是否有硬件断点存在,我只直接将结束call xxoo了
00401A86 . FF15 14304000 call dword ptr ds:[<&KERNEL32.GetCurrent>; |[GetCurrentThread
00401A8C . 50 push eax ; |hThread
00401A8D . FF15 10304000 call dword ptr ds:[<&KERNEL32.GetThreadC>; \GetThreadContext
00401A93 . 395C24 4C cmp dword ptr ss:[esp+0x4C],ebx
00401A97 . 75 12 jnz XCrackMe1.00401AAB
00401A99 . 395C24 50 cmp dword ptr ss:[esp+0x50],ebx
00401A9D . 75 0C jnz XCrackMe1.00401AAB
00401A9F . 395C24 54 cmp dword ptr ss:[esp+0x54],ebx
00401AA3 . 75 06 jnz XCrackMe1.00401AAB
00401AA5 . 395C24 58 cmp dword ptr ss:[esp+0x58],ebx
00401AA9 . 74 05 je XCrackMe1.00401AB0
00401AAB > 90 nop
00401AAC . 90 nop
00401AAD . 90 nop
00401AAE . 90 nop
00401AAF . 90 nop
作者这样不断的检查一些地址,同样也给逆向人员带来了方便,因为这样很快就能发现程序关键点了。
这就是程序的关键call了,
算法很简单的:
00401550 |> /33C0 /xor eax,eax
00401552 |. |8A03 |mov al,byte ptr ds:[ebx]
00401554 |. |8D0440 |lea eax,dword ptr ds:[eax+eax*2]
00401557 |. |99 |cdq
00401558 |. |2BC2 |sub eax,edx
0040155A |. |D1F8 |sar eax,1
0040155C |. |25 FF000000 |and eax,0xFF
00401561 |. |50 |push eax
00401562 |. |8D4424 14 |lea eax,dword ptr ss:[esp+0x14]
00401566 |. |50 |push eax
00401567 |. |56 |push esi
00401568 |. |FFD5 |call ebp ; msvcrt.sprintf
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|