能力值:
( LV9,RANK:160 )
|
-
-
26 楼
谢谢s大,先爆一个吧!(已经花了不少时间了,没精力看算法了)
不会的看此贴: http://bbs.pediy.com/showthread.php?t=85840 s大回复了如何调试 另开始想添加这句爆破,但是没成功:mov byte ptr [3826CB], 78
Num1、开始想在入口点添加,结果发现入口的时候还没有放入关键的代码,
Num2、然后考虑在调用WriteProcessMemory之前添加,结果提示内存不可以写。(考虑到可能是更改了内存属性,只查到VirtualProtectEx可能对内存的属性有所更改。所以更改了他的入参,可是依然没搞定。)
Num3、没办法了,他可以改,我不可以,那只好找到他在哪里改的了。在3826CB上下内存写入断点,断在下面这句,此时esi中的值为:004013D0,G去一看,关键代码在此,改了保存,OK。
|
能力值:
( LV13,RANK:760 )
|
-
-
27 楼
没这么复杂吧?呵呵,只是一个9位数,要满足9个数字不相同且不含0,然后从前1位到前9位依次能被1-9的9个数字整除即可。 用穷取法求解即可。
|
能力值:
( LV9,RANK:160 )
|
-
-
28 楼
没读过几段代码呢,开始没意识到算法简单啊!想先爆了再说吧,结果就绕咋里面了。汗,估计用那么长时间,看算法也出来了。。
写那段只是想问下,问什么“内存不可以写”是哪个的问题,该如何改呢?
|
能力值:
( LV13,RANK:760 )
|
-
-
29 楼
注意到你修改的代码不是在本地运行的,用硬编码的形式由于系统每次运行分配的内存地址有可能并不相同,会造成你所说的问题 整个计算其实都是在远程进程中进行的,而本地只是根据远程返回的消息进行“应答”
自已爆破下:前面的三位数字限制懒得去了,如此修改后可以输入3-49位之间任意数字即可成功。
0040140C |. 8B55 EC mov edx, dword ptr [ebp-14]
0040140F |. 8B02 mov eax, dword ptr [edx]
00401411 E9 25010000 jmp 0040153B ; 不计算了,直接成功……
00401416 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00401419 |. FF51 0C call dword ptr [ecx+C]
|
能力值:
( LV9,RANK:160 )
|
-
-
30 楼
多谢啦!改成相对取址就OK了
mov byte ptr [edi + xx], xx
代码最后刚好有足够的空间放修改的代码,哈哈!
(虽然没按LZ的意思Keygen一下。。还是学的了不少,抽空读读代码。。) 补上代码的注释吧:
004013D0 /. 55 push ebp
004013D1 |. 8BEC mov ebp, esp
004013D3 |. 83EC 18 sub esp, 18
004013D6 |. 53 push ebx
004013D7 |. 56 push esi
004013D8 |. 57 push edi
004013D9 |. C745 FC 00000>mov dword ptr [ebp-4], 0
004013E0 |. C745 F8 00000>mov dword ptr [ebp-8], 0
004013E7 |. C745 F4 00000>mov dword ptr [ebp-C], 0
004013EE |. C745 F0 00000>mov dword ptr [ebp-10], 0
004013F5 |. C745 E8 00000>mov dword ptr [ebp-18], 0
004013FC |. 8B45 08 mov eax, dword ptr [ebp+8]
004013FF |. 8945 EC mov dword ptr [ebp-14], eax
00401402 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00401405 |. C741 04 00000>mov dword ptr [ecx+4], 0
0040140C |. 8B55 EC mov edx, dword ptr [ebp-14]
0040140F |. 8B02 mov eax, dword ptr [edx]
00401411 |. 50 push eax
00401412 |. 6A 00 push 0
00401414 |. 6A 04 push 4
00401416 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00401419 |. FF51 0C call dword ptr [ecx+C]
0040141C |. 8945 FC mov dword ptr [ebp-4], eax
0040141F |. 6A 32 push 32
00401421 |. 6A 00 push 0
00401423 |. 6A 00 push 0
00401425 |. 6A 04 push 4
00401427 |. 8B55 FC mov edx, dword ptr [ebp-4]
0040142A |. 52 push edx ; 记不清是哪位大牛说的了
0040142B |. 8B45 EC mov eax, dword ptr [ebp-14] ; 看代码要先弄清楚并记住关键的变量
0040142E |. FF50 10 call dword ptr [eax+10] ; ebp-10 字符串长度strlen
00401431 |. 8945 E8 mov dword ptr [ebp-18], eax ; ebp-18 字符串首地址str
00401434 |. 8B4D E8 mov ecx, dword ptr [ebp-18] ; ebp-8 循环变量i
00401437 |. 51 push ecx ; ebp-C 循环变量j
00401438 |. 8B55 EC mov edx, dword ptr [ebp-14]
0040143B |. FF52 20 call dword ptr [edx+20]
0040143E |. 8945 F0 mov dword ptr [ebp-10], eax
00401441 |. 837D F0 09 cmp dword ptr [ebp-10], 9
00401445 |. 74 1D je short 00401464 ; 注册码长度是9才继续
00401447 |. 6A 00 push 0 ; ——
00401449 |. 6A 00 push 0 ; |
0040144B |. 68 82040000 push 482 ; |
00401450 |. 8B45 EC mov eax, dword ptr [ebp-14] ; |
00401453 |. 8B48 08 mov ecx, dword ptr [eax+8] ; |——这段是退出函数之前的一些处理了
00401456 |. 51 push ecx ; | (应该是从Explorer给CM发个消息)
00401457 |. 8B55 EC mov edx, dword ptr [ebp-14] ; |
0040145A |. FF52 18 call dword ptr [edx+18] ; |
0040145D |. 33C0 xor eax, eax ; |
0040145F |. E9 0A010000 jmp 0040156E ; ——
for(i = 0; i < strlen-1; i++)
for(j = i +1; j < strlen; j++)
{
if(str[i] == str[i])
{ //失败,准备退出}
}
00401464 |> C745 F8 00000>mov dword ptr [ebp-8], 0 ; i = 0 (下面开始是个双重循环)
0040146B |. EB 09 jmp short 00401476
0040146D |> 8B45 F8 /mov eax, dword ptr [ebp-8] ; ——
00401470 |. 83C0 01 |add eax, 1 ; |—— i++
00401473 |. 8945 F8 |mov dword ptr [ebp-8], eax ; ——
00401476 |> 8B4D F0 mov ecx, dword ptr [ebp-10] ; ——\
00401479 |. 83E9 01 |sub ecx, 1 ; ——|—— strlen-1
0040147C |. 394D F8 |cmp dword ptr [ebp-8], ecx
0040147F |. 0F83 85000000 |jnb 0040150A ; 上面这一小段 (i=0;i<strlen-1;i++),这句跳了就退出循环
00401485 |. 8B55 E8 |mov edx, dword ptr [ebp-18]
00401488 |. 0355 F8 |add edx, dword ptr [ebp-8] ; 取第i个字符 (str+i)
0040148B |. 33C0 |xor eax, eax
0040148D |. 8A02 |mov al, byte ptr [edx]
0040148F |. 83E8 30 |sub eax, 30 ; 字符ASSIC码转数字
00401492 |. 85C0 |test eax, eax
00401494 |. 75 1D |jnz short 004014B3 ; 不为零则继续
00401496 |. 6A 00 |push 0 ; ——
00401498 |. 6A 00 |push 0 ; |
0040149A |. 68 82040000 |push 482
0040149F |. 8B4D EC |mov ecx, dword ptr [ebp-14]
004014A2 |. 8B51 08 |mov edx, dword ptr [ecx+8] ; 注册码有误,准备退出了
004014A5 |. 52 |push edx
004014A6 |. 8B45 EC |mov eax, dword ptr [ebp-14]
004014A9 |. FF50 18 |call dword ptr [eax+18]
004014AC |. 33C0 |xor eax, eax ; |
004014AE |. E9 BB000000 |jmp 0040156E ; ——
004014B3 |> 8B4D F8 |mov ecx, dword ptr [ebp-8] ; ——\
004014B6 |. 83C1 01 |add ecx, 1 ; |
004014B9 |. 894D F4 |mov dword ptr [ebp-C], ecx ; ——|—— j = i + 1
004014BC |. EB 09 |jmp short 004014C7
004014BE |> 8B55 F4 |/mov edx, dword ptr [ebp-C] ; ——
004014C1 |. 83C2 01 ||add edx, 1 ; | —— j++
004014C4 |. 8955 F4 ||mov dword ptr [ebp-C], edx ; ——
004014C7 |> 8B45 F4 | mov eax, dword ptr [ebp-C]
004014CA |. 3B45 F0 ||cmp eax, dword ptr [ebp-10]
004014CD |. 73 36 ||jnb short 00401505 ; j < strlen 则继续循环 (jnb不低于则跳转,j>=strlen则跳)
004014CF |. 8B4D E8 ||mov ecx, dword ptr [ebp-18]
004014D2 |. 034D F8 ||add ecx, dword ptr [ebp-8] ; ecx = str + i
004014D5 |. 33D2 ||xor edx, edx
004014D7 |. 8A11 ||mov dl, byte ptr [ecx] ; edx = str[i]
004014D9 |. 8B45 E8 ||mov eax, dword ptr [ebp-18]
004014DC |. 0345 F4 ||add eax, dword ptr [ebp-C] ; eax = str + j
004014DF |. 33C9 ||xor ecx, ecx
004014E1 |. 8A08 ||mov cl, byte ptr [eax] ; ecx = str[j]
004014E3 |. 33D1 ||xor edx, ecx
004014E5 |. 85D2 ||test edx, edx
004014E7 |. 75 1A ||jnz short 00401503 ; str[i] != str[j] 则继续循环
004014E9 |. 6A 00 ||push 0 ; ——
004014EB |. 6A 00 ||push 0 ; |
004014ED |. 68 82040000 ||push 482
004014F2 |. 8B55 EC ||mov edx, dword ptr [ebp-14]
004014F5 |. 8B42 08 ||mov eax, dword ptr [edx+8] ; 准备退出
004014F8 |. 50 ||push eax
004014F9 |. 8B4D EC ||mov ecx, dword ptr [ebp-14]
004014FC |. FF51 18 ||call dword ptr [ecx+18]
004014FF |. 33C0 ||xor eax, eax ; |
00401501 |. EB 6B ||jmp short 0040156E ; ——
00401503 |>^ EB B9 |\jmp short 004014BE ; 内层循环
00401505 |>^ E9 63FFFFFF \jmp 0040146D
0040150A |> 60 pushad ; 下面开始另一个合法性判断
0040150B |. 33FF xor edi, edi
0040150D |. 33F6 xor esi, esi
0040150F |. 8B4D F0 mov ecx, dword ptr [ebp-10]
00401512 |. 8B6D E8 mov ebp, dword ptr [ebp-18]
00401515 |> 0FB65D 00 movzx ebx, byte ptr [ebp]
00401519 |. 8D5B D0 lea ebx, dword ptr [ebx-30] ; Assic码转数字
0040151C |. 03FB add edi, ebx ; 把当前取得字符以及之前字符组成的字符串转换为数字,作为被除数
0040151E |. 85F6 test esi, esi
00401520 |. 75 0A jnz short 0040152C ; 第一位不跳,直接*10
00401522 |> 6BFF 0A imul edi, edi, 0A ; 满足条件则 *10, 准备加个位的数
00401525 |. 46 inc esi
00401526 |. 45 inc ebp
00401527 |.^ E2 EC loopd short 00401515
00401529 |. 61 popad
0040152A |. EB 0F jmp short 0040153B
0040152C |> 33D2 xor edx, edx
0040152E |. 8BC7 mov eax, edi
00401530 |. 8D5E 01 lea ebx, dword ptr [esi+1] ; 被除数是当前取得的字符的位置(下标+1)
00401533 |. F7FB idiv ebx
00401535 |. 85D2 test edx, edx ; 检查余数,不为零则跳到失败
00401537 |. 75 1C jnz short 00401555
00401539 |.^ EB E7 jmp short 00401522
0040153B |> 6A 00 push 0
0040153D |. 6A 00 push 0
0040153F |. 68 78040000 push 478
00401544 |. 8B55 EC mov edx, dword ptr [ebp-14]
00401547 |. 8B42 08 mov eax, dword ptr [edx+8]
0040154A |. 50 push eax
0040154B |. 8B4D EC mov ecx, dword ptr [ebp-14]
0040154E |. FF51 18 call dword ptr [ecx+18]
00401551 |. 33C0 xor eax, eax
00401553 |. EB 19 jmp short 0040156E
00401555 |> 61 popad
00401556 |. 6A 00 push 0
00401558 |. 6A 00 push 0
0040155A 68 82040000 push 482
0040155F |. 8B55 EC mov edx, dword ptr [ebp-14]
00401562 |. 8B42 08 mov eax, dword ptr [edx+8]
00401565 |. 50 push eax
00401566 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00401569 |. FF51 18 call dword ptr [ecx+18]
0040156C |. 33C0 xor eax, eax
0040156E |> 5F pop edi
0040156F |. 5E pop esi
00401570 |. 5B pop ebx
00401571 |. 8BE5 mov esp, ebp
00401573 |. 5D pop ebp
00401574 \. C2 0400 retn 4
|