能力值:
( LV2,RANK:10 )
|
-
-
201 楼
请问成功的各位,为什么我按照楼主的操作,总是会弹出失败的窗口,因为楼主说在77E16569 C2 1000 RETN 10处返回,但这时已经经过77E16563 E8 04000000 CALL USER32.MessageBoxExA了,请问成功实现的各位大侠是怎么跳过的?
本人WINDOWS XP2系统,OD 1.10
77E16544 > 55 PUSH EBP <---停在这里
77E16545 8BEC MOV EBP,ESP
77E16547 51 PUSH ECX
77E16548 833D 1893E477 00 CMP DWORD PTR DS:[77E49318],0
77E1654F 0F85 EA220100 JNZ USER32.77E2883F
77E16555 6A 00 PUSH 0
77E16557 FF75 14 PUSH DWORD PTR SS:[EBP+14]
77E1655A FF75 10 PUSH DWORD PTR SS:[EBP+10]
77E1655D FF75 0C PUSH DWORD PTR SS:[EBP+C]
77E16560 FF75 08 PUSH DWORD PTR SS:[EBP+8]
77E16563 E8 04000000 CALL USER32.MessageBoxExA
77E16568 C9 LEAVE
77E16569 C2 1000 RETN 10
77E1656C > 55 PUSH EBP
|
能力值:
( LV2,RANK:10 )
|
-
-
202 楼
00401280 |. 99 CDQ // 把 EAX 扩展,成为 EDX:EAX 的 QWORD(64 位长)
00401281 |. F7F9 IDIV ECX // 把 EDX:EAX 除以 ECX,余数放在 EDX
00401283 |. 8BCA MOV ECX,EDX
00401285 |. 83C8 FF OR EAX,FFFFFFFF // EAX = 0xffffffff
00401288 |. 0FBE5424 0A MOVSX EDX,BYTE PTR SS:[ESP+A] // 把名字的第一个位,放入 EDX ********---->>(((这里应该是名字第三位)))
|
能力值:
( LV2,RANK:10 )
|
-
-
203 楼
受教了,不错的文章 讲的很明白,谢谢楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
204 楼
写得不错,挺详细的!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
205 楼
谢谢楼主分享经验
|
能力值:
( LV2,RANK:10 )
|
-
-
206 楼
已经判断过了,所以会弹出失败窗口, 把失败窗口点掉, 继续往下,就返回了.
|
能力值:
( LV2,RANK:10 )
|
-
-
207 楼
00401050 . 817C24 08 1101>CMP DWORD PTR SS:[ESP+8],111
00401058 . 75 74 JNZ SHORT ncrackme.004010CE
0040105A . 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
0040105E . 66:3D EA03 CMP AX,3EA
00401062 . 75 42 JNZ SHORT ncrackme.004010A6
00401064 . E8 C7010000 CALL ncrackme.00401230
00401069 . 85C0 TEST EAX,EAX
0040106B . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040106D . 68 80504000 PUSH ncrackme.00405080 ; |Title = "ncrackme"
00401072 . 75 1B JNZ SHORT ncrackme.0040108F ; |
00401074 . A1 B8564000 MOV EAX,DWORD PTR DS:[4056B8] ; |
00401079 . 68 64504000 PUSH ncrackme.00405064 ; |Text = "Registration successful."
0040107E . 50 PUSH EAX ; |hOwner => 001C0218 ('Newbie smallsize crackme -
v1',class='myWindowClass')
0040107F . FF15 C0404000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00401085 . E8 A6020000 CALL ncrackme.00401330
0040108A . 33C0 XOR EAX,EAX
0040108C . C2 1000 RETN 10
0040108F > 8B0D B8564000 MOV ECX,DWORD PTR DS:[4056B8] ; |
00401095 . 68 50504000 PUSH ncrackme.00405050 ; |Text = "Registration fail."
0040109A . 51 PUSH ECX ; |hOwner => 001C0218 ('Newbie smallsize crackme -
v1',class='myWindowClass')
0040109B . FF15 C0404000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004010A1 . 33C0 XOR EAX,EAX <--------------- 我们停在这里
004010A3 . C2 1000 RETN 10
004010A6 > 66:3D EB03 CMP AX,3EB
004010AA . 75 22 JNZ SHORT ncrackme.004010CE
004010AC . A1 C0564000 MOV EAX,DWORD PTR DS:[4056C0]
004010B1 . 85C0 TEST EAX,EAX
004010B3 . 74 19 JE SHORT ncrackme.004010CE
请问最上面几行是什么意思?
00401050 . 817C24 08 1101>CMP DWORD PTR SS:[ESP+8],111
00401058 . 75 74 JNZ SHORT ncrackme.004010CE
0040105A . 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
0040105E . 66:3D EA03 CMP AX,3EA
00401062 . 75 42 JNZ SHORT ncrackme.004010A6
我试过加断点,可是加了之后连输入界面都出不来,好像一直在循环,这是为什么
|
能力值:
( LV2,RANK:10 )
|
-
-
208 楼
004012B5 |. 83FE 0F |cmp esi, 0F ; 0F==15
最郁闷的就是这句,写了注册机怎么测试都不对 搞了半天把0F当16了。。 附上注册机:
ps:(代码很乱) 有翻译汇编的嫌疑,懒得改啦
#include <stdio.h>
#include <string.h> long count(long * stranger)
{
long k_stranger;
(*stranger)=(*stranger)*0x343FD+0x269EC3;
k_stranger=(*stranger);
k_stranger = (k_stranger>>16)&0x7FFF;
return k_stranger;
} int keyGen(char * username)
{
int a = 0;
unsigned int b=0;
char Registercode[20]={0};
if(strlen(username)<3)
printf("用户名需要大于3位");
long stranger = 0xFFFFFFFF/((username[0]%username[1])*username[2]+1);
while(a <15)
{
count(&stranger);
a++;
}
while(b != strlen(username))
{
long x ,y;
x = username >> 5;
y=x+x*4;
x=y*8+x;
x=x+x*2;
if(x>0)
{
int c=x;
while(c)
{
x=count(&stranger);
c--;
}
x=count(&stranger);
x=x%0x1A +0x41;
Registercode = char(x) ;
b++;
}
}
printf("\n%s",Registercode);
return 0;
}
int main(void)
{
char username[20] ={0};
printf("please Input UserName:\n");
scanf("%s",username);
keyGen(username);
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
209 楼
学习。一直没学算法,老是爆破,水平差,木有办法
|
能力值:
( LV5,RANK:60 )
|
-
-
210 楼
谢谢楼主,这是我写出的第一个注册机,很有意义,纪念一下:
逆向后源码:
DWORD Fun_()
{
g_Data *= 0x343fd;
g_Data += 0x269ec3;
DWORD Temp = g_Data / 65536;
Temp &= 0x7FFF;
return Temp;
}
void CRegisterKeyDlg::OnBtnRegiser()
{
// TODO: Add your control notification handler code here
char Name[10],Psw[16],InputPsw[16] = "123456789";
GetDlgItemText(IDC_EDIT_NAME, Name, 10);
DWORD TempData = (*Name) % *(Name + 1);
TempData = TempData * *(Name + 2) +1;
g_Data = 0XFFFFFFFF / TempData;
int index = 0;
do
{
Psw[index] = Fun_() % 0x1a + 0x41;
index++;
}while(index < 0x0f);
DWORD Sum=0;
if(strlen(Name) != 0)
{
index = 0;
do
{
DWORD Count = 0x7b * (*(Name + index) / 0x20);
for(;Count > 0; Count--)
{
Fun_();
}
DWORD Temp = Fun_() % 0x1a + 0x41;
Psw[index] = Temp;
Temp -= *(InputPsw + index);
Sum += Temp;
index++;
}while( index < strlen(Name));
}
Psw[15] = NULL;
SetDlgItemText(IDC_EDIT_PSW, Psw);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
211 楼
LZ幸苦了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
212 楼
难道临时的用户也可以到这里发帖了?看来一下午看会了,不过换种就不一定了,继续努力。
|
能力值:
( LV2,RANK:10 )
|
-
-
213 楼
感谢,又有一篇新手教程啦
|
能力值:
( LV2,RANK:10 )
|
-
-
214 楼
谢谢啦,这篇文章很适合像偶这样刚学破解的菜鸟。
|
能力值:
( LV2,RANK:10 )
|
-
-
215 楼
谢谢搂主,很详细,正在努力学习中
|
能力值:
( LV2,RANK:10 )
|
-
-
216 楼
支持LZ这种解说,很详细,我们这些菜鸟要好好学习!
|
能力值:
( LV2,RANK:10 )
|
-
-
217 楼
很好! 正适合现在的我
|
能力值:
( LV7,RANK:100 )
|
-
-
218 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
219 楼
学习了 ,谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
220 楼
我正在学习。。。希望能过菜鸟这一关,呵呵,慢慢来吧!
|
能力值:
( LV2,RANK:10 )
|
-
-
221 楼
很详细的教程,学习了。多谢分享。
|
能力值:
( LV2,RANK:10 )
|
-
-
222 楼
老帖了,依然是好贴~~
|
能力值:
( LV2,RANK:10 )
|
-
-
223 楼
留个位置~哪天回来继续学习~
|
能力值:
( LV4,RANK:50 )
|
-
-
224 楼
我发现我还是不会看算法,转来转去 看的我头都晕了 还是爆破好啊
|
能力值:
( LV2,RANK:10 )
|
-
-
225 楼
不错,,支持。。。
|
|
|