|
[求助]关于指令预取,请指点一下
猜呗,例如遇到jne,下一步该执行哪儿的指令?鬼才知道,要是知道就不用jne了,但也不能闲着啊,那就蒙一个,对了那就赚了,不对的话就把结果扔掉,照另一种情况去取指。最坏的情况也就跟闲着是一样的,所以大家就都开始猜了。 计算机组成原理课学的,不知现在有什么更先进的方法了没,反正新加了很多指令用于消除跳转,最常见的应该是SETcc指令了吧。 |
|
一个很有新意软件的启动验证,应该是新的加密趋势
直接附加参数调试会提示“不是有效的32位程序”?感觉好像是在另一个程序里修改了它。 |
|
[求助]关于指令预取,请指点一下
我猜测应该是cpu发现指令被修改了,所以丢弃了mov cx,0001h的结果,重新取指运行了,就像cpu处理跳转那样。 |
|
[求助]看看这句代码错在哪里
这是反汇编出来的吧?自己写的时候不要这么写,这么写:invoke GetProcAddress,xx,xx |
|
[求助]关于后缀是dat的文件(不是视频文件)
直接WinHex打开看一下是什么格式的呗。 |
|
[求助]堆栈 注释
对堆栈下注释?有必要么? |
|
[求助]请问如何破解wmv 视频??
DRM?晕死。。 |
|
怎么判断一个CALL的大小呢??
格式调不好,lz自己整理一下格式吧,郁闷死了,为什么论坛会自己在前面跟后面添加《p》《/p》呢?把格式完全弄乱了。 |
|
怎么判断一个CALL的大小呢??
S大大给的那篇文章应该没问题,但是……太复杂了……一般来说函数不会跳到很远的地方再跳回来吧,这时Jcc只是在函数内部跳,如果统计函数大小的话完全可以无视掉它们,直接从函数的起始地址开始一个字节一个字节的统计,遇到0xC3就结束,应该能完全绝大多数任务了。简单写了一下:#include int add(int a,int b){ return (a+b);}int main(int argc,char *argv[]){ int len = 1; //记录长度 unsigned char *ps = (unsigned char *)&add; //byte ptr [xxx] while(*ps != 0xC3) { num++; ps++; } printf("result = %d bytes.\n",num); return 0;}统计结果是11,反汇编一下没问题。 |
|
|
|
麻烦看一下下面这个函数有可能完成什么功能?
多谢liuyq,我明白了。先右移丢掉几位,然后左移回来(右边补0),如果相等那就说明补上的那几位原本就是0。 哈哈,good game。 那这个判断应该是这样写的: if(!((ptr-4)&0x0007)) //判断后三位是否为0 ps.刚才宿舍停电了,囧 |
|
麻烦看一下下面这个函数有可能完成什么功能?
请问ls,“实际上就是判断最低的几位(cl中的值)是否为0”,此句何解?先多谢指教。 |
|
麻烦看一下下面这个函数有可能完成什么功能?
.text:100088E0 sub_100088E0 proc near .text:100088E0 .text:100088E0 arg_0 = dword ptr 4 ;就一个参数,先猜测是指向某个结构体的指针 .text:100088E0 .text:100088E0 mov edx, [esp+arg_0] .text:100088E4 xor eax, eax .text:100088E6 mov al, byte_10064C89 // al = 0 ;是赋值为0? .text:100088EB sub edx, eax ;那这句就没干啥正事嘛 .text:100088ED mov eax, dword_10064A84 ;继续赋值 .text:100088F2 sub edx, 4 ;减4,更加确定是指针,指向前一个值? .text:100088F5 cmp edx, eax ;跟上面的那个常量比较 .text:100088F7 jb short loc_1000891A ;小于就返回-1 .text:100088F9 cmp edx, dword_10064A8C ;再跟另一个常量比较 .text:100088FF ja short loc_1000891A ;大于就返回-1 .text:10008901 sub edx, eax ;减去那个常量 .text:10008903 xor ecx, ecx .text:10008905 mov cx, word_10064C8C ;又赋值了…… .text:1000890C mov eax, edx __ .text:1000890E shr eax, cl \ .text:10008910 push esi \ .text:10008911 mov esi, eax ;这几句好诡异 .text:10008913 shl esi, cl / .text:10008915 cmp esi, edx ;应该相等吧,不相等的情况……貌似只能说明cl太大了,这到底是干什么的?请大牛指教,哪个语句会被优化成这样? .text:10008917 pop esi .text:10008918 jz short locret_1000891E ;相等就返回shr eax,cl,否则返回-1 .text:1000891A .text:1000891A loc_1000891A: .text:1000891A or ax, 0FFFFh .text:1000891E .text:1000891E locret_1000891E: .text:1000891E retn ;很显然,不是stdcall,ecx被初始化,也不是thiscall,不是fastcall .text:1000891E sub_100088E0 endp 重写一下, unknow * __cdecl func(unknow *ptr) { ptr -= byte_10064C89; if(((ptr-4) >= dword_10064A84) && ((ptr-4) =< dword_10064A8C)) { ptr -= dword_10064A84; //下面这一句到底是那条语句优化来的,恳请大牛指点 //我就直译了…… if(((ptr >> word_10064C8C)<<word_10064C8C) == ptr) { return (((ptr >> word_10064C8C)<<word_10064C8C)); } } return -1; } |
|
动态列表的维护过程
SetTimer? |
|
[分享]very nice forum
But ZERO post is inexcusable~ |
|
[建议]要求升为普通会员!
哈哈,他是要当水王的,我可是努力想成为普通会员~因为初级会员不能进会员区看东西……可惜像我这么笨的人发精华帖是没指望了,只好努力找一些简单的问题来回答,哈哈。 |
|
|
操作理由
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 }}
勋章
兑换勋章
证书
证书查询 >
能力值