能力值:
( LV2,RANK:10 )
|
-
-
176 楼
在 OD 上方的 Plugins ,选 Commandline ,这里可以像 softice 一样输入命令行
设下一个断点 :
bp MessageBoxA
我的上面 怎么没有 Commandine 只有 CommandBer
|
能力值:
( LV2,RANK:10 )
|
-
-
177 楼
我才学这个,虽然看不太懂,不过还是很感谢.
|
能力值:
( LV2,RANK:10 )
|
-
-
178 楼
谢谢,看了学到很多
|
能力值:
( LV2,RANK:10 )
|
-
-
179 楼
经典!好!!
|
能力值:
( LV2,RANK:10 )
|
-
-
180 楼
哈哈,好好学习。
|
能力值:
( LV2,RANK:10 )
|
-
-
181 楼
适合初学者,收藏
|
能力值:
( LV4,RANK:50 )
|
-
-
182 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
183 楼
2004年的东东,真好,来这里太晚了!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
184 楼
我是刚开始只学了几天的超级菜鸟, 我有如下问题
2.retn(隐含)指令 具体的要执行那些操作?
3.eax,ebx,ecx,edx这个几个是通用寄存器可以存储任何数据吗?
4.edi,esi等不通用的寄存器各有什么作用
5.cmp test等比较操作的结果放在什么寄存器,或者什么地方?
6.jnb,jnz,jne等条件跳转指令是根据那个地方的值来判断是否应该跳转(test指令和jnb指令隔很远)
希望路过的大鸟举手之劳解决小小菜的菜的不行的问题
本人不胜感激!
|
能力值:
( LV2,RANK:10 )
|
-
-
185 楼
第二步 我用 F4 然后F7 没有跳到你的那个地方。
|
能力值:
( LV2,RANK:10 )
|
-
-
186 楼
发现个小缺陷!
如果名字输入""的话,不包括双引号。程序就出错了。出错原因除数不能为零!
"" = 03 02 FF
00401230 /$ 8B0D BC564000 MOV ECX,DWORD PTR DS:[4056BC]
00401236 |. 83EC 30 SUB ESP,30 // 在 stack 划出空间,作为变量
00401239 |. 8D4424 00 LEA EAX,DWORD PTR SS:[ESP]
0040123D |. 53 PUSH EBX
0040123E |. 56 PUSH ESI
0040123F |. 8B35 94404000 MOV ESI,DWORD PTR DS:[<&USER32.GetDlgIte>; USER32.GetDlgItemTextA
00401245 |. 6A 10 PUSH 10 ; /Count = 10 (16.)
00401247 |. 50 PUSH EAX ; |Buffer // <---- 注意这里,
00401248 |. 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.) // 可以看出存放字符串的地方
0040124D |. 51 PUSH ECX ; |hWnd => NULL
0040124E |. 33DB XOR EBX,EBX ; |
00401250 |. FFD6 CALL ESI ; \GetDlgItemTextA
00401252 |. 83F8 03 CMP EAX,3 // 找到注册名字,如果字名的长度不小于 3,便跳,否则便完结
00401255 |. 73 0B JNB SHORT ncrackme.00401262
00401257 |. 5E POP ESI
00401258 |. B8 01000000 MOV EAX,1
0040125D |. 5B POP EBX
0040125E |. 83C4 30 ADD ESP,30
00401261 |. C3 RETN // 如果来了这里,便完结了
00401262 |> A1 BC564000 MOV EAX,DWORD PTR DS:[4056BC] // 从 JNB 来了这里
00401267 |. 8D5424 28 LEA EDX,DWORD PTR SS:[ESP+28]
0040126B |. 6A 10 PUSH 10
0040126D |. 52 PUSH EDX // <----- 注意这里,可以看出存放序号字符串的地方
0040126E |. 68 E9030000 PUSH 3E9
00401273 |. 50 PUSH EAX
00401274 |. FFD6 CALL ESI // 再用 GetDlgItemTextA ,得到序号
00401276 |. 0FBE4424 08 MOVSX EAX,BYTE PTR SS:[ESP+8] // 把名字的第一个位,放入 EAX
0040127B |. 0FBE4C24 09 MOVSX ECX,BYTE PTR SS:[ESP+9] // 把名字的第二个位,放入 ECX
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
0040128D |. 0FAFCA IMUL ECX,EDX // 把刚才的余数乘以 EDX
00401290 |. 41 INC ECX // ECX 增加 1
00401291 |. 33D2 XOR EDX,EDX // EDX = 0
00401293 |. F7F1 DIV ECX // 以 0xffffffff 除以 ECX
|
能力值:
( LV2,RANK:10 )
|
-
-
187 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
188 楼
这个地方错了吧,应该是把用户的第三位放入寄存器
俺也是初学者,说错话不要见怪。
|
能力值:
( LV2,RANK:10 )
|
-
-
189 楼
谢谢楼主写出如此详细的说明,对象我这样的新手确实有很大帮助
我也跟楼主的思路走了一遍,前后用了4天时间,当然中间也有其它事间断,但有时间就花在这上面(可能是水平太低),我的感觉是楼主水平太高,把每段都分析得很透,但这对初学者不一定是好事,我主要的时间是花在理解他对加密算法的分析上,到现在都没搞清楚,我主要是想学会方法,而不是单针对这个程序,所以总爱问为什么会这么想,我的水平没这么高,遇到别的程序我肯定分析不出它的算法的,所以在找适合我水平的方法来破这个程序。
现在回想起来,楼主的第一段和最后段的分析是最有用最关键的,破解这个程序我只用上了这两段分析,中间对算法的分析适合水平高一点的人去学习。
所以,建议有这样的分析文章能突出重点地分析:比如这个破解,可先介绍最直接有效的方法,再提出进阶分析,这样,象我这样的初学者可少走弯路。
再次感谢楼主。
另想请教:
1、如何看某一地址里的数据,我的方法:在命令行输出 d [adress],这是自已摸索出来的,还有其它更好的方法吗?
2、想对某一地址里的数据的读,写动作设中断,应如何设
|
能力值:
( LV2,RANK:10 )
|
-
-
190 楼
收藏先¥ 慢慢学习
|
能力值:
( LV2,RANK:10 )
|
-
-
191 楼
向高手学习。
很有用的。不过有些地方还是没看懂。
|
能力值:
( LV2,RANK:10 )
|
-
-
192 楼
004012A5 |. 99 |CDQ // 把那个值扩展成 EDX:EAX
004012A6 |. B9 1A000000 |MOV ECX,1A // ECX = 1a
004012AB |. F7F9 |IDIV ECX // 把 EDX:EAX 除以 1a
004012AD |. 80C2 41 |ADD DL,41 // 把余数加 41,说起来,41 是 ASCII 的大写 A
004012B0 |. 885434 18 |MOV BYTE PTR SS:[ESP+ESI+18],DL // 把这个余数的下 8 位,放入 SS:[ESP+ESI+18] 的地方
004012B4 |. 46 |INC ESI // ESI 增加 1 了
004012B5 |. 83FE 0F |CMP ESI,0F // 检查 ESI 是否已经等于 0f
004012B8 |.^72 E6 \JB SHORT ncrackme.004012A0 // 跳回上面,这像是一个小型 loop
我们在 OD 下方的数值窗口,把数值打开来看
版主,问你一个问题,为什么我看到的都是乱码
而不是这些的?
0012FC34 50 49 5A 49 56 4A 45 44 PIZIVJED
0012FC3C 42 47 5A 41 50 53 49 00 BGZAPSI
我是菜鸟,是不是我用的方法错了?
我试过在commandbar里打dd 0012fc34也是看到乱码
|
能力值:
( LV2,RANK:10 )
|
-
-
193 楼
谢谢楼主分享
|
能力值:
( LV2,RANK:10 )
|
-
-
194 楼
终于成功破解了,好高兴了
哈哈,开始OD--->..load riijj crackme..
在 cmdbar 打 bp 401304.....F9... 然后打用户名和注册码
00401304 add dl,41 <----停在这里
00401307 movsx eax,dl
然后按F8, 我们可以在消息窗口看到我们第一个的注册码
一直重复F4在00401304,再F8,最后就可以得到所有注册码
比如:
konica
BQWVFA
这个crackme不难,就是我们的用户名有六个字,注册码就六个,但是有个bug就是比如:konica 注册码 BQWVFA后面打多几个字都显示成功。。。
我是个菜鸟,希望这些可以帮到新人
^_^
|
能力值:
( LV2,RANK:10 )
|
-
-
195 楼
楼主写的非常细,对初学者来说这太重要了,谢谢了
|
能力值:
( LV2,RANK:10 )
|
-
-
196 楼
从 OD 查看,SS:[ESP+ESI+1C] 是那一组特别字符的位置,
0012FC34 50 49 5A 49 56 4A 45 44 PIZIVJED
0012FC3C 42 47 5A 41 50 53 49 00 BGZAPSI.
这里怎么看才是啊===================>>> 我的如下:
|
能力值:
( LV2,RANK:10 )
|
-
-
197 楼
这里:0012FC28 16 88 D1 77
0012FC38 3F E5 D3 77 C2 04 22 00 11 01 00 00 EA 03 00 00 ?逵w?"...?..
|
能力值:
( LV2,RANK:10 )
|
-
-
198 楼
好贴留名
注册机
int base = 0;
int GetRand()
{
base = base * 0x343FD + 0x269EC3;
return ( base >> 16 ) & 0x7FFF;
}
void CKeygenDlg::OnOK()
{
// TODO: Add extra validation here
char szName[256] = {0};
this->GetDlgItemText( IDE_USERNAME, szName, sizeof( szName )- 1 );
base = (int)( 0xFFFFFFFF / ( 1 + ( ( szName[0] % szName[1] ) * szName[2] ) ) );
char m[16] = {0};
for( int i=0; i < 15; i++ ) {
m[i] = ( GetRand() % 0x1A ) + 0x41;
}
char szKey[256] = {0};
for( i=0; i < (int)strlen( szName ); i++ ) {
int t = szName[i] >> 5;
int t1 = t*5;
t = t+ t1*8;
t = t * 3;
while( t > 0 ) {
GetRand();
t--;
}
szKey[i] = ( GetRand() % 0x1A ) + 0x41;
}
SetDlgItemText( IDE_KEY, szKey );
//CDialog::OnOK();
};
|
能力值:
( LV2,RANK:10 )
|
-
-
199 楼
非常不错的文章 照着葫芦画瓢都恩那个学到不少啦 哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
200 楼
这个挺好。非常适合新手学习,虽然帖子老了,但是技术仍然非常适合我啊。赫赫。谢谢LZ
|
|
|