首先,PEID查壳
是一个Delphi程序
伪码检验:
弹出错误对话框,于是去OD中,查找文本字符串:
可以看到,在OD中字符串有点乱码,果然OD不太适用于处理Delphi的程序。
推荐一个极其强大的Delphi反汇编工具DeDe。
下面我们的思路就是用它来打开程序,找到程序的关键点,然后再OD中动态调试,破解程序。
OK,用DeDe 打开程序: 点击过程:
关于DeDe的使用
找到关键位置:
Button1Click对应的正是用户点击OK按钮,双击后我们可以在DeDe看到代码:
仅仅这样看代码我们很难分析出序列号算法,所以我们还是放到OD中去,找到函数的入口地址:
004416EC 55 push ebp
OD中Crtl+G过去:
在函数头部F2下断,然后F9运行起来,输入伪码
开始F8对代码进行分析,注意将每一个Call指令都当做是黑箱进行,分析出了程序的大致流程如下:
00441706 |. 8D55 FC lea edx,[local.1] 00441709 |. 8B83 C8020000 mov eax,dword ptr ds:[ebx+0x2C8] 0044170F |. E8 901AFEFF call fireworx.004231A4 ; ;计算serial的长度 00441714 |. 8B45 FC mov eax,[local.1] 00441717 |. 50 push eax 00441718 |. 8D55 F4 lea edx,[local.3] 0044171B |. 8B83 C4020000 mov eax,dword ptr ds:[ebx+0x2C4] 00441721 |. E8 7E1AFEFF call fireworx.004231A4 ; ;计算name字符串的长度 00441726 |. FF75 F4 push [local.3] 00441729 |. 8D55 F0 lea edx,[local.4] 0044172C |. 8B83 C4020000 mov eax,dword ptr ds:[ebx+0x2C4] 00441732 |. E8 6D1AFEFF call fireworx.004231A4 00441737 |. FF75 F0 push [local.4] 0044173A |. 68 BC174400 push fireworx.004417BC ; ASCII 36,"25" 0044173F |. 68 C8174400 push fireworx.004417C8 ; UNICODE "g" 00441744 |. 68 D4174400 push fireworx.004417D4 ; UNICODE "祝" 00441749 |. 8D45 F8 lea eax,[local.2] 0044174C |. BA 05000000 mov edx,0x5 00441751 |. E8 9E23FCFF call fireworx.00403AF4 ; ;序列号生成算法 00441756 |. 8B55 F8 mov edx,[local.2] ; ;serila算法后的正确字符串 00441759 |. 58 pop eax ; ;用户输入的字符串 0044175A |. E8 E523FCFF call fireworx.00403B44 ; 字符串比较 0044175F 75 17 jnz short fireworx.00441778 ; ;返回值等于0说明匹配成功,不等于0说明失败
这部分的堆栈,OD的识别有些乱,我们通过数据窗口跟随,得到值。
0044173A |. 68 BC174400 push fireworx.004417BC ; ASCII 36,"25" 625 0044173F |. 68 C8174400 push fireworx.004417C8 ; UNICODE "g" g 00441744 |. 68 D4174400 push fireworx.004417D4 ; UNICODE "祝" 72
之后我们进入序列号生成算法:
00403AF7 . 50 push eax 00403AF8 . 89D3 mov ebx,edx 00403AFA . 31C0 xor eax,eax ; ;循环变量edx=5进入循环 00403AFC > 8B4C94 10 mov ecx,dword ptr ss:[esp+edx*4+0x10] 00403B00 . 85C9 test ecx,ecx ; fireworx.0041E530 00403B02 . 74 03 je short fireworx.00403B07 00403B04 . 0341 FC add eax,dword ptr ds:[ecx-0x4] 00403B07 > 4A dec edx ; ;edx-- 00403B08 .^ 75 F2 jnz short fireworx.00403AFC 00403B0A . E8 69FDFFFF call fireworx.00403878 00403B0F . 50 push eax 00403B10 . 89C6 mov esi,eax 00403B12 > 8B449C 14 mov eax,dword ptr ss:[esp+ebx*4+0x14] 00403B16 . 89F2 mov edx,esi ; ;循环变量ebx=5进入循环 00403B18 . 85C0 test eax,eax 00403B1A . 74 0A je short fireworx.00403B26 00403B1C . 8B48 FC mov ecx,dword ptr ds:[eax-0x4] 00403B1F . 01CE add esi,ecx ; fireworx.0041E530 00403B21 . E8 86ECFFFF call fireworx.004027AC ; ;字符串拼接函数 00403B26 > 4B dec ebx ; ;ebx-- 00403B27 .^ 75 E9 jnz short fireworx.00403B12 00403B29 . 5A pop edx ; ;序列号已经生成 00403B2A . 58 pop eax ; 0018F4A4 00403B2B . 85D2 test edx,edx 00403B2D . 74 03 je short fireworx.00403B32 ; ;整理栈中数据
实话说,看到这个我是有点懵B的,之后多进行了几组伪码测试,我找到了规律之后再去分析代码就相对简单了,可见汇编基础的重要性。
算法就是name*2+625g72,就是一个字符串的拼接操作,只不过没有封装成函数,吓唬人罢了。
写注册机:
python:
name=raw_input("Please input your name") serial=name+name+‘625g72‘ print serial
验证:
时间: 2024-10-21 09:18:00