|
[求助]非常简单的32位汇编问题
and eax,1的作用是让eax恒等于0和1(当dwCount是奇数是eax==1,是偶数时eax==0),再inc eax则是让eax恒等于1和2。而程序的Icon资源ID则是1和2,这样做可以让LoadIcon载入的ID1和2的Icon资源轮流载入变换图标。 |
|
[求助]非常简单的32位汇编问题
第一很简单,就是循环互换hBmp1和hBmp2的值的放置位置。这样做就可以保证做到第一显示第一个图像,第二次显示第二个图像,第三次又重新显示到第一个图像。 第二、and eax,not WS_THICKFRAME操作是去掉WS_THICKFRAME风格标志,or eax,WS_THICKFRAME是加上WS_THICKFRAME风格标志 第三、shr eax,16的操作是将eax的高16位转到低16位。如eax == 0ffff0000h的值,shr eax,16之后eax == 0000ffffh,就是将ffff的值从高处转到低处。 |
|
[求助]第一次学习分析算法,请指望
不知道你想表示什么?这下面的汇编、C/C++、Delphi代码都可以计算出正确的注册码。 ;这是KeyMake(注册机编写器代码) .const .data szHomePage db "http://www.365hz.net",0 szEmail db "mailto:ljyljx@163.com",0 szErrMess db "输入的序列号不正确!",0 szFormat db '%lu',0 szSn db 256 dup(0) szNameLenErr db '输入的用户名长度必须大于等于5位!',0 RtlZeroMemory proto :DWORD,:DWORD MessageBox proto :DWORD,:DWORD,:DWORD,:DWORD MB_OK EQU 0 NULL EQU 0 .code invoke lstrlen,eax .if eax < 5 invoke MessageBox,NULL,offset szNameLenErr,NULL,MB_OK .else mov edi,eax invoke RtlZeroMemory,offset szSn,sizeof szSn xor esi,esi mov ebx,81276345h .while esi < edi lea eax,hInput1 movsx eax,byte ptr [eax+esi] add ebx,eax mov edx,esi shl edx,8 xor ebx,edx mov eax,edi imul eax,esi not eax mov ecx,esi inc ecx imul eax,ecx imul ebx,eax inc esi .endw invoke wsprintf,offset szSn,offset szFormat,ebx lea eax,szSn .endif // 这是C/C++的注册机的代码 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { DWORD dwCode=0x81276345; char szName[256] = {0}; int i; printf("请输入你的用户名:\n"); scanf("%s",&szName); if (lstrlen(szName) < 5) { printf("错误,用户名长度不能小于5位。\n"); return -1; } for (i = 0; i < lstrlen(szName); i++) { dwCode += (DWORD)szName[i]; dwCode ^= (i << 8); dwCode *= ((~(lstrlen(szName) * i)) * (i + 1)); } printf("你的注册码是:%lu\n",dwCode); system("pause"); return 0; } //这是Delphi代码注册机 program KeyGen; {$APPTYPE CONSOLE} uses windows,Messages,sysutils; var szBuff:array[0..256] of char; szChar:array[0..2] of Char; szSn:String; i:Integer; dwCode:DWORD = $81276345; begin writeln('请输入你的用户名:'); readln(szBuff); if lstrlen(szBuff) < 5 then begin writeln('错误!用户名长度必须大于等于5位。'); end else begin for i := 0 to lstrLen(szBuff) - 1 do begin dwCode := dwCode + DWORD(szBuff[i]); dwCode := dwCode xor DWORD((i shl 8)); dwCode := dwCode * DWORD(((not(lstrLen(szBuff) * i)) * (i + 1))); end; szSn := Format('%u',[dwCode]); writeln(szSn); writeln('按回车键结束!'); readln(szChar); end; end. |
|
[求助]汇编语言中进转表示中的疑问
这是当然的,16进制已经是最高的进制了,10进制以下的进制都包含在16进制内了,所以已经不需要用h、d、b之类后缀表示了,所以无效。而10进制以下的还有比他们高的进制,所以可以用h、b之类的后缀表示比默认的高的进制。 |
|
[求助]为什么我的OD会如此显示?
在OD的CPU窗口中右健菜单->分析->删除模块分析即可。 |
|
|
|
[求助]第一次学习分析算法,请指望
// 他的计算方法用C语言表示就是如下 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { DWORD dwCode=0; char szName[256] = {0}; int i; DWORD dwNameLength,tmp; printf("请输入你的用户名:\n"); scanf("%s",&szName); if (lstrlen(szName) < 5) { printf("错误,用户名长度不能小于5位。\n"); return -1; } for (i = 0; i <= lstrlen(szName); i++) { dwCode += (DWORD)szName[i]; dwCode ^= (i << 8); dwCode *= ((~(lstrlen(szName) * i)) * (i + 1)); } printf("你的注册码是:HEX: %08X - DEC: %u\n",dwCode,dwCode); system("pause"); return 0; } |
|
[求助]汇编语言中进转表示中的疑问
.radix 16这一句不要。 |
|
[原创][成果2.5]查询字符串中与某个字符首个匹配位置&连接字符串&比较两个字符串
不错啊,16位的汇编我还没接触过呢。 |
|
[求助]第一次学习分析算法,请指望
// 他的计算过程大概像下面代码那样。 // 其中你没有给出call 00401900这个子程序的功能,我看他的返回值估计,暂且将他视为StrToInt函数。 // 004015DF |. E8 1C030000 |call 00401900 ; \crackme1.00401900 // 你给的那段程序最后结果暂存在[ebp-10]地址处。 if (NameLength < 5) // 用户名长度小于5则退出计算 return 0; for (ebp_20 = 0; ebp_20 < NameLength; ebp_20++) //循环计算用户名 { epb_10 += StrToInt(Name[ebp_20]); // 依次取出用户名进行计算 ebp_10 ^= (ebp_20 << 8); ebp_10 *= ((~(ebp_1C * ebp_20)) * (ebp_20 + 1)); } |
|
|
|
[己解决]一个很菜的问题?
eax=00D5ACD8, (ASCII "123456789")这里已经说得明白了,eax==00D5ACD8,所以eax放着的是 D8 AC 5A 00这四个字节,而不是31 32 33 34....,而这里的提示(ASCII "123456789")是OD告诉你,00D5ACD8是一个指针,他指向字符串“123456789”。一般来说,传给函数的参数内容长度超过4个四字的内容都是以指针方式传给函数参数的,而指针存放的内容要看是什么类型数据才能知道存的东西长度是多少,并不限于四个字节。 PS:楼主还是先学习一下汇编吧,这是属于很基本的问题,如果你不懂汇编,你还有很多是难以理解的。 |
|
[求助]超级菜鸟请教简单问题
呵呵,很难。如果你那里没有技术型的侵入高手(只懂下载软件侵入的不算),还比较好办,如果有懂得技术型侵入的高手,那就只能看你和他的技术谁高明了。而且看你的说明,你的系统好像谁都可以使用,那要防止密码被破译就更难了。 |
|
[求助]关于条件断点的设置
没用我说的方法,这是Delphi程序,用普通的消息断点没有用,Delphi一般用DEDE辅助找关键点。 |
|
[求助]关于条件断点的设置
晕,看程序不像是CrackMe。倒像是做免杀之类的工具。 |
|
[求助]关于条件断点的设置
先运行程序,点击OD的查看->窗口,打开OD的“窗口”窗口,那里记录着程序里所有回调函数地址,主程序的消息回调函数一般是第一个。 |
|
[求助]关于条件断点的设置
上面的链接是两个版本的,要哪个版本就随便你选择了。 |
|
[求助]关于条件断点的设置
是的,如果你的OD没有这个插件,可以在这里下载。 点击下载:cmdbar3.00.108插件 点击下载:cmdbar3.20.110插件 CmdBar 命令行插件,和OD默认自带的不同,该插件是在OD左下角显示命令行,不占版面。 |
|
[求助]关于条件断点的设置
如果你是在消息回调函数第一句设断点,可以使用下面的条件断点。 bp xxxxxxxx, DWORD ptr [esp+8] == WM_TIMER 不过,没有注册按钮,只有编辑框的注册界面,并不需要使用WM_TIMER消息。一般都是使用EN_CHANGE消息(这个消息是当编辑框有字符变动更新时就会触发),所以你用下面的断点可能比较好(注,xxxxxxxx设断的地址必须是消息回调函数第一句才能对应下面的条件断点,只如你是在第三句以后的地址设置,下面的条件断点地址就无法对应了)。 bp xxxxxxxx, DWORD ptr [esp+8] == WM_COMMAND && WORD ptr [esp+0c] == EN_CHANGE |
|
[求助]如何删除 bpx ShowWindow pause 的当前断点
快捷键ATL+B打开断点窗口,那里记录着你下的int 3断点,你可以在这里删除或关闭打开断点。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值