Posted on 2009-09-23 09:46
S.l.e!ep.¢% 阅读(247)
评论(0) 编辑 收藏 引用 所属分类:
Crack
从看雪下载的一个程序
http://www.cppblog.com/Files/sleepwom/cycle.zip
打开后需要输入正常的'用户名'和'序列号'后,才会弹出 MessageBox
OD加载,右键'查找'-'当前模块中的名称', 看到有
名称=USER32.GetDlgItemTextA
很显然,程序是通过 GetDlgItemText 这个API 去获取 '用户名' 和 '序列号'的
所以执行 '在每个参考点上设置断点'
执行完,下面提示 '已设置3个断点'
F9 ('运行')
随便输入一个用户名,序列号, 然后 'Check'
用户名: abcdefghijklmnopq
序列号: 1234567890123456789
0040109C /$ C705 82214000>mov dword ptr [402182], FEDCBA98
004010A6 |. 6A 11 push 11 ; /Count = 11 (17.)
004010A8 |. 68 71214000 push 00402171 ; |Buffer = cycle.00402171
004010AD |. 68 E9030000 push 3E9 ; |ControlID = 3E9 (1001.)
004010B2 |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004010B5 |. E8 0F020000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA <---- 断点在此
004010BA |. 0BC0 or eax, eax
004010BC |. 74 61 je short 0040111F
004010BE |. 6A 11 push 11 ; /Count = 11 (17.)
004010C0 |. 68 60214000 push 00402160 ; |Buffer = cycle.00402160
004010C5 |. 68 E8030000 push 3E8 ; |ControlID = 3E8 (1000.)
004010CA |. FF75 08 push dword ptr [ebp+8] ; |hWnd
004010CD |. E8 F7010000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA <---- 这里也有断点
很显然,
用户名,序列号,调用完API后,会分别放在
cycle.00402171, cycle.00402160
然后在下面的数据区域右击 '转到' -> '表达式'
输入 00402171
执行完第一个 GetDlgItemTextA API 后 观察 00402171 地址的内容,和 EAX 寄存器的值为 0x10
00402171 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 1234567890123456
00402181 00 98 BA DC FE 43 79 63 6C 65 43 72 61 63 6B 6D .樅荥CycleCrackm
00402191 65 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 e....@..........
004021A1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
即 GetDlgItemTextA API 的返回值是 10, 那么 00402171 地址开始的 10 个字节都存放着刚刚输入的 序列号
按 F8 ('单步步过')
会执行这一句
004010BA |. 0BC0 or eax, eax
004010BC |. 74 61 je short 0040111F
je是jump if zero的意思,jz是jump if equal的意思,两者都是结果为0(相等),
je jz 是一样的 。只是JE更适合人类的思维习惯 相等就跳转
两个都是将操作数相减 等于零(zf=1)就跳转
or eax, eax 只就为了改为 zf 标志位
je 指令,当 zf 为1时,就跳转
这里是为了判断, API 的返回值是否为 0
同样的方法跟踪地址 00402160 在调用完 第二个 GetDlgItemTextA 后的内容
00402160 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 abcdefghijklmnop
00402170 00 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 .123456789012345
00402180 36 00 98 BA DC FE 43 79 63 6C 65 43 72 61 63 6B 6.樅荥CycleCrack
00402190 6D 65 00 00 00 00 40 00 00 00 00 00 00 00 00 00 me....@.........
00402160 和 00402170 分别放了 用户名 和序列号
接着往下看
004010D2 |. 0BC0 or eax, eax
004010D4 |. 74 49 je short 0040111F
这里也做了判断 eax 是否为 0的操作
接着继续往下看
004010D6 |. B9 10000000 mov ecx, 10
004010DB |. 2BC8 sub ecx, eax
004010DD |. BE 60214000 mov esi, 00402160 ; ASCII "abcdefghijklmnop"
004010E2 |. 8BFE mov edi, esi
004010E4 |. 03F8 add edi, eax
004010E6 |. FC cld
004010E7 |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
004010E9 |. 33C9 xor ecx, ecx
004010EB |. BE 71214000 mov esi, 00402171 ; ASCII "1234567890123456"
004010F0 |> 41 /inc ecx
004010F1 |. AC |lods byte ptr [esi]