标 题: 【分享】菜鸟分析注册实例——【邀请码已发】
作 者: 北纬
时 间: 2012-01-11
测试软件:看雪测试软件
调试软件: OD
首先申明: 本人 英语一窍不通 只是个人爱好 还希望看雪各位高手多多指点
开始吧
首先这只是一个测试软件 用来调试的 本身没加壳
就用OD 直接载入
代码如下-------------------
00401000 >/$ E8 0B020000 call <jmp.&COMCTL32.#17> ; [(Initial CPU selection)
00401005 |. 6A 00 push 0x0 ; /pModule = NULL
00401007 |. E8 F2010000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
0040100C |. A3 50304000 mov dword ptr ds:[0x403050],eax
00401011 |. 6A 64 push 0x64 ; /lParam = 00000064
00401013 |. 68 2F104000 push 例子.0040102F ; |DlgProc = 例子.0040102F
00401018 |. 6A 00 push 0x0 ; |hOwner = NULL
0040101A |. 6A 64 push 0x64 ; |pTemplate = 64
0040101C |. FF35 50304000 push dword ptr ds:[0x403050] ; |hInst = NULL
00401022 |. E8 9B010000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401027 |. 6A 00 push 0x0 ; /ExitCode = 0
00401029 \. E8 C4010000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
0040102E . C3 retn
0040102F . 55 push ebp
00401030 . 8BEC mov ebp,esp
00401032 . 53 push ebx
00401033 . 57 push edi
00401034 . 56 push esi
----------------------------------------
我是按最简单的 破解方式 先搜索下 字符串 如下
-----------------------------------------
超级字串参考
地址 反汇编 文本字串
00401000 call <jmp.&COMCTL32.#17> (Initial CPU selection)
004010B6 push 例子.0040303E %1X
0040110B push 例子.00403018 输入的序列号不正确!
00401132 push 例子.0040303E %1X
00401160 push 例子.00403000 注册成功
00401165 push 例子.00403009 谢谢你的注册!
00401174 push 例子.00403018 输入的序列号不正确!
0040110B push 例子.00403018 输入的序列号不正确! 此处点击下 来到下面代码
---------------------------------------
004010FD . E8 CC000000 call <jmp.&USER32.GetDlgItemTextA> ; \首先在此处下断点 运行软件 在这暂停
00401102 . 803D 6C304000>cmp byte ptr ds:[0x40306C],0x0
00401109 . 74 69 je short 例子.00401174
0040110B . 68 18304000 push 例子.00403018 ; /输入的序列号不正确!
00401110 . 68 6C304000 push 例子.0040306C ; |提取假注册码
00401115 . E8 F0000000 call <jmp.&KERNEL32.lstrcmpA> ; \lstrcmpA
0040111A . 85C0 test eax,eax
0040111C . 74 56 je short 例子.00401174
0040111E . B8 01000000 mov eax,0x1
00401123 . 0FA2 cpuid
00401125 . 8B0D 58304000 mov ecx,dword ptr ds:[0x403058]
0040112B . 33D2 xor edx,edx
0040112D . F7E1 mul ecx
0040112F . 03C2 add eax,edx
00401131 . 50 push eax ; /真码 注册码
00401132 . 68 3E304000 push 例子.0040303E ; |%1X
00401137 > . 68 5C304000 push 例子.0040305C ; |提取 序列号
0040113C . E8 7B000000 call <jmp.&USER32.wsprintfA> ; \wsprintfA
00401141 . 83C4 0C add esp,0xC
00401144 . 68 6C304000 push 例子.0040306C ; /假码
00401149 . 68 5C304000 push 例子.0040305C ; |真码
0040114E . E8 B7000000 call <jmp.&KERNEL32.lstrcmpA> ; \关键的 CALL 跟进去就是 真 假码对比
00401153 85C0 test eax,eax ; 如果此处把 eax,edx 不管你输入什么都正确
00401155 75 1D jnz short 例子.00401174 ; 如果把此处jnz 改成 jz 是不跳的 那就会提示注册成功
00401157 . 6A 10 push 0x10 ; /BeepType = MB_ICONHAND
00401159 . E8 7C000000 call <jmp.&USER32.MessageBeep> ; \MessageBeep
0040115E . 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
00401160 . 68 00304000 push 例子.00403000 ; |注册成功
00401165 . 68 09304000 push 例子.00403009 ; |谢谢你的注册!
0040116A . FF75 08 push dword ptr ss:[ebp+0x8] ; |hOwner
0040116D . E8 6E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401172 . EB 0F jmp short 例子.00401183
00401174 68 18304000 push 例子.00403018 ; 输入的序列号不正确!
00401179 . 6A 68 push 0x68 ; |ControlID = 68 (104.)
0040117B . FF75 08 push dword ptr ss:[ebp+0x8] ; |hWnd
0040117E . E8 69000000 call <jmp.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
00401183 > B8 00000000 mov eax,0x0
00401188 . 5E pop esi
00401189 . 5F pop edi
0040118A . 5B pop ebx
0040118B . C9 leave
0040118C . C2 1000 retn 0x10
--------------------------------------------------------------------------------------------
以上为最简单的爆破
以下是本人发现一个也是简单思路 不写注册机 也可以让 真码 出现在注册框
--------------------------------------------------------------------------
0040116D . E8 6E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401172 . EB 0F jmp short 例子.00401183
00401174
68 18304000 push 例子.00403018 ; 输入的序列号不正确!这是原注册错误提示 现在我把他改成
.
68 5C304000 push 例子.0040305C ; |注册错误时 直接提示真码 则再点击注册 成功
---------------------------------------------------------------------------------------------
以上是本人 最浅的 分析 请高手指点
以下是原测试软件 已上传
[课程]Linux pwn 探索篇!