武汉科锐逆向培训学习笔记整理版

2021-04-25 12:50:09本页面

武汉科锐逆向培训学习笔记整理版


【正文】

变量命名的开头方式boolischarstrIntnlonglfloatfdoubled全局变量g指针p静态变量s宏命名都要用大写,2的N次方011224384162565121010241665536312147483648(21亿)324294967296(42亿)6392233720368547758086418446744073709551616,二进制表:二进制八进制十进制十六进制000000000000100111001000222001100333010000444010100555011000666011100777100001088100101199101001210A101101311B110001412C110101513D111001614E111101715F。

应该记住的ASII码00149A65a97,这个选项可以改变VC的TAB为空格,以适应和记事本文本对齐一至,这个选项可以改变VC的数字和字符的颜色,可以和变量区分开,可以把警告变成错误,原码,补码,反码:一个正数的三码相同900001001一个负数原码:910001001反码:911110110补码:911110111N+N补9+(9)=0000100111110111=100000000N+N反9+(9)=0000100111110110=11111111,float的二进制表示方式:895.758951101111111101111111注意这里去掉开头的10.75110乘2取11.101111111。

1109127136(double1023)13610001000依次为符号位,指数位,数字位01000100010111111111001000100010111111111000000000000445FF000Float的指数位占8个Double的指数位占11个,先计算elsefor带参宏要把参加括号强内聚,低偶合,函数puts输出字符串后自动换行字符的输入输出:getcharputchar字符串的输入输出:getsputs作用域:文件作用域函数作用域进程作用域块作用域在一个函数内定义了一个与全局变量名相同的局部变量,则局部变量有效,全局变量在该函数内不起作用。,#definepr(ary)printf(#ary)定义字符串应用举例:pr(123456789)。

#definefloatf#defineF(name)f##name定义源码的拼接应用举例:floatF(abcd);F(abcd)=5.13f;#Ifndefxxxx#definexxxx.#endifxxxx#definedebug1#ifdefdebugprintf(“调试”);#endif宏注释#defineIN#defineOUTFun(INinti,OUTintj),两同类型的指针相减:type*ptr1=type*ptr=pn=B+*(B+*(B+15)/4+10)/4;,指针访问内容不一定可以提高速度*和指针贴在一块*p正确*p错误新定义一个指针时要把它定义成NULL,防止误访问代码规范:指针型和NULL比较。

整型和0比较CRTL+G转到地址处void*pa=,P的地址位移12,数组指针,P的地址位移4,指针数组,用指针排序相对于交换字符串(多于4字节)的排序,他访问慢(先取地址,再找内容),但是排序快,只是交换地址,没有交换内容返回指针值的函数:int*fun(intx,inty)函数的返回值应该是值,不能是地址或是指针,否则有可能溢出函数的指针:int(*pfn)()避免流程嵌套:,If(funa())if(funb()),If(!funa())return0;if(!funb())return0;,voidfuna()printf(funa);voidfunb()printf(funb);intmain(intargc。

char*argv)inti;void(*pfn2)()=funa,funb;for(i=0;i<2;i++)pfni();return0;,inta5=1,2,3,4,5;int*p=a;for(;p<a+5;)printf(%p:%drn,p++,*p);,地址的减法是要除以sizeof的。函数外的指针要想改变,要传指针的指针typeamn;type*p=a0;aij*(p+i*n+j);,staticchar*str=how,are,you;char**p;p=str+1;printf(%srn,*p);//areprintf(%crn,**p);//a,inta23=1,2,3,4,5,6。

int*p=NULL;p=,这个参数可以增加编译出来程序的命令行参数,这个选项可以改变结构体内存对齐的问题,inta23=1,2,3,4,5,6;int*p1=NULL;p1=,intmain(intargc,char*argv,char*envp)inti;for(i=0;i<argc;i++)printf(%srn,argvi);printf(rn);while(*envp!=NULL)puts(*envp++);printf(rn);return0;,当遇到错误返回时:return1;用这种方法返回比较好exit(1);直接这样在c++里局部对象不会析构,fprintf(stdio,”%d”,nsum)。

可以向屏幕输出nsum的值十六进制的3e7是999,十六进制的3e8是1000在结构体里的变量,尽量加入字符串的描述类型在.c的文件里定义结构体变量必须加入static,而在.cpp里不必加入结构体可以嵌套定义指针可以用VC里新加类的方法来加结构体,因为类和结构体很类似。取结构体公式:*(测试esi是否为0,为0就跳cmpeax,0;用到立即数,多访问了一次xoreax,eax;清0moveax,0;用到立即数,多访问了一次,一样,一样,leaesi,ebx+offsetaddr相当于movesi,ebx+offsetaddr(把ebx+offsetaddr的所在地址值的传给esi)但是不支持这种mov命令所以就用leaesi。

ebx+offsetaddr这种方式movesi,ebx+offsetaddr是把ebx+offsetaddr的所在地址的值传给esi,内存文件PE转换,导入表,LoadExe要修改,跳表代码,缩小版不可为F,删掉Dos后的结构,.txt向上0x80,导入表,导出表,内存036000是文件034000,导入表地址换算成034000,.txt向上0x80,导入表,导出表,数组和名称对应,反调试:节区的属性,有的虚拟机写的不好,会漏掉节区的属性,这时往常量区写会写不出错在虚拟机里栈的位置不对触发特殊错误,把返回值对比一下调试版堆和非调试版堆是不一样的窗口版的反调,利用PE文件中的节,新建一个节,设置边界值。

让窗口版调试器溢出,OD有时候慢,禁用以下插件就好了,内存断点BUG:报出异常的地址已经超出内存断点地址,所以没有断下来.,代码执行块,报出异常的地址,内存断点位置,怎么寻找main函数:通常在入口下有3个push的汇编代码,而winmain是有4个pushDebug中有cc初始化chkesp是比较栈顶的esp的平衡Stdcall如果有输入参数的话,那么就有ret+数值返回要平衡Ida的交叉引用树是一个很好的工具Ida按n可以改变函数的名称Ida按;可以注释Ida双击函数到达函数中,可以按esc回到原来的位置Ida中局部变量用var表示,参数用arg表示代码的管理是图(现代编译原理)编译器的优化:1常量的归并。

2:没有用的常量会优化3种call:1:cdecl:跟进去看看有没有对参数的访问,再来看ret2:stdcall:3:fastcall:头两个参数是用寄存器传参的,另外是用栈传参,x/2c编译器优化:按c语言规则,除法是向下取整的,3/2=1若x为正偶数,x/2等价于x1若x为正奇数,x/2等价于(x1)/2,等价于x1,或者(x1)1所以正整数的情况下,不用处理,直接位移按补码格式规定,若x为负偶数,x/2等价于x1若x为负奇数,这时候(3)/2=1,除法变成了向上取整x/2等价于(x+1)/2等价于(x+1)1所以负数情况下不能直接位移,需要加1手工优化asm代码是项目的结尾,1.Bat文件md%1sigcd%1sigfor/F%%iin(linklib/list%1。

lib)dolinklib/extract:%%i%1.libfor%%iin(*.obj)dopcfg0%%isigmakenMyLIBC*.patMyLIBC.Sigdel*.objremcd..,去掉,需要的文件,1,2,3,4,R版的dowhilebegindo:语句体判定:jxxbegindo,R版的while判定:jxxendwhilebeginwhile:语句体判定:jxxbeginwhileendwhile:,R版的for判定:jxxendwhilebeginwhile:语句体判定:jxxbeginwhileendwhile:,代码外提,汇编,

学习计划相关推荐  
三九文库 www.999doc.com
备案图标苏ICP备2020069977号