about 4 years ago - No comments
某天(前天:),看了两个小时高数(具体不详:)之后,想放松一下,找到《是男人就下100层》,打开,玩了两把,突然发现今天怎么看那个“注册”的按钮特别不爽,OK,Crack it! 常规步骤,用PEid侦壳,用VC4.x写的,这样方便了,脱壳都不用。接着祭出用户级调试法宝——Ollydbg,加载《是男人就下100层》,万事俱备,踏上征途! 按F9运行程序,等程序窗口出来,点一下任务栏上按钮,结果竟然中断了,CPU窗口一看,原来是一条INT3指令,麻烦的东西,NOP掉。继续F9运行,好,这下可以把程序窗口调到前面了。切换到程序窗口,点注册,出现填写用户名和序列号的窗口。用户名填HotHeart,序列号填一个123456,确定,当然不会成功,要不我就可以去买彩票了^_^。弹出一个错误提示框,内容是日文的……意思大概是序列号无效。既然有提示框,那就好办,回到Ollydbg,下断点bp MessageBoxA,再次换到程序窗口点确定。YES!顺利中断,切回Ollydbg看看代码: ; 获取对话框中控件文本 00407A78 PUSH 100 00407A7D LEA EAX,DWORD PTR SS:[EBP-204] 00407A83 PUSH EAX 00407A84 PUSH 3EB 00407A89 MOV EAX,DWORD PTR SS:[EBP+8] 00407A8C PUSH EAX 00407A8D CALL DWORD PTR DS:[<&USER32.GetDlgItemText>] 00407A93 LEA EAX,DWORD PTR SS:[EBP-204] 00407A99 PUSH EAX 00407A9A CALL 是男人就.00407C5F 00407A9F ADD ESP,4 00407AA2 TEST EAX,EAX 00407AA4 JNZ 是男人就.00407AE1 ; 从资源中载入字符串,是注册失败的提示信息 00407AAA PUSH 100 00407AAF LEA EAX,DWORD PTR SS:[EBP-104] 00407AB5 PUSH EAX 00407AB6 PUSH 4 00407AB8 MOV EAX,DWORD PTR DS:[40E200] 00407ABD PUSH EAX 00407ABE CALL DWORD PTR DS:[<&USER32.LoadStringA>] ; 下面就是弹出出错提示框的代码了 00407AC4 PUSH 10 More >
about 5 years ago - No comments
在写自己的操作系统时,不能总在实模式下,进入保护模式才是”正道”,不过怎么进入保护模式又是一个问题,我把 XuOS里进入保护模式的代码分析一下. ; 装入GDT mov eax,ds ;设置GDT在物理内存中的正确位置 shl eax,4 add [gdt_addr+2],eax cli ; 关中断 lgdt [gdt_addr] ;载入GDT ; 下面打开A20地址线,这段代码可以在OSzone上找到相关解释. call Empty_8042 mov al,0xd1 out 0×64,al call Empty_8042 mov al,0xdf out 0×60,al call Empty_8042 ; 进入保护模式 mov eax,cr0 ;置PE位 or eax,1 mov cr0,eax jmp oscodesel:code_32 ; 跳到32位代码处执行 Empty_8042: in al,0×64 test al,0×2 jnz Empty_8042 ret ; GDT的内容 gdt: gdt_null: dd 0×0000 dd 0×0000 gdt_system_code: oscodesel equ $-gdt ; 段选择子 dd 0x0000ffff,0x00cf9a00 gdt_system_data: osdatasel equ $-gdt dd 0x1000ffff,0x00cf9200 videosel equ $-gdt dd 0x0000ffff,0x00cf920a gdt_addr: dw gdt_addr-gdt-1 dd gdt ; ;GDT表的位置 当然,由于XuOS目前还比较简单,还没有设置IDT,GDT中段也比较少,况且我的理解也有可能有些偏差或者表述 有些不清楚,这里只提供一个思路,更多更强的功能还是要靠自己才行.
about 5 years ago - No comments
这是转载的,原文可以在http://www.xemean.net的文档中心里找到. 因为原文中的代码编译后运行有错误,这里我把改过后能正确运行的代码讲一下 org 0x07c00 ; 起始地址是0000:7c00 jmp begin_boot ; 跳过其它的数据,跳转到引导程序的开始处 OEM_ID db ”OSeg ” ;软盘信息,具体请参考”FAT格式” BytesPerSector dw 0×0200 SectorsPerCluster db 0×01 ReservedSectors dw 0×0001 TotalFATs db 0×02 MaxRootEntries dw 0x00E0 TotalSectorsSmall dw 0x0B40 MediaDescriptor db 0xF0 SectorsPerFAT dw 0×0009 SectorsPerTrack dw 0×0012 NumHeads dw 0×0002 HiddenSectors dd 0×00000000 TotalSectorsLarge dd 0×00000000 DriveNumber db 0×00 Flags db 0×00 Signature db 0×29 VolumeID dd 0xFFFFFFFF VolumeLabel db ”OSexample ” SystemID db ”FAT12 ” print_mesg: ;打印信息调用 mov ah,0×13 ; 使用中断10h的功能13,在屏幕上写一个字符串 mov al,0×00 ; 决定调用函数后光标所处的位置 mov bx,0×0007 ; 设置显示属性 mov cx,0×20 ; 在此字符串长度为32 mov dx,0×0000 ; 光标的起始行和列 int 0×10 ; 调用BIOS的中断10h ret ; 返回调用程序 get_key: ;等待按键 mov ah,0×00 int 0×16 ; Get_key使用中断16h的功能0,读取下一个字符 ret clrscr: ;清屏 mov ax,0×0600 ; 使用中断10h的功能6,实现卷屏,如果al=0则清屏 mov cx,0×0000 ; 清屏 mov dx,0x174f ; 卷屏至23,79 mov bh,0 ; 使用颜色0来填充 int 0×10 ; 调用10h中断 ret ;返回 begin_boot: ;;引导程序开始 mov ax,cs ;设置段寄存器 mov ds,ax mov es,ax call clrscr ; 先清屏 mov bp,bootmesg ; 提供串地址 call print_mesg ; 输出信息 call get_key ; 等待用户按下任一键 bits 16 ;以16位方式编译 call clrscr ; 清屏 mov ax,0xb800 ; 使gs指向显示内存 mov gs,ax ; 在实模式下显示一个棕色的A More >