S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

OllyDBG 之旅 (六)

Posted on 2009-09-23 09:46 S.l.e!ep.¢% 阅读(242) 评论(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]



 

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理