OD过JAVA的简单介绍
本篇文章给大家谈谈OD过JAVA,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
华为od代码重复率高
题目简单多重循环。OD是指的是华为的外包公司像德科这种,java软件开发高级工程师OD在每日工作后刷题持续数月后参与机考代码重复率高是因为题目简单多重循环导致的。
如何将java语言转变为汇编语言
流程:
Java词法分析
最开始的时候,高级语言编写的程序对编译器来说只是一连串的单个字符组成的字符串。为了让编译器识别这一连串的字符串,需要逐个字符的读取源程序,然后将其切分成有意义的单词,这些被切分后的单词在编译器眼里是以
标识,语义值对的形式存在。
为了从源程序字符串中依次找出单词,编译器需要具有扫描功能,通常这种扫描器可以用一组有限状态机来实现。为了说明有限状态机是怎么一回事,下面给出一个实例。
下图为一个识别数字的有限状态机,数字由整数部分和可选的小数部分组成。因此,根据这个有限状态机,250和3.14159都能被识别成一个有效的数字。
Java语法分析
完成了“词法分析”后,接下来就是激动人心的“语法分析”阶段。通过语法分析得到语法树。
Java翻译语法树
首先,寻找最小表达式,接下来,将最小表达式与其周边的表达式合并。最后,将所有的表达式有序的进行合并,得到最终的汇编语言描述。
至此,我们便将高级语言翻译成了汇编语言。
java的软件如何脱壳
用OD载入该软件,搜索下字符串,可以很快知道这个软件是java写的,并且用exe4j打包的。
exe4j打包的jar会解包到临时文件下,我们到临时文件看一看,可以看到,jar被释放出来了。目测可以直接反编译。
但是事情并不是尽如人意,class文件被加密了。通过简单的Google一下,classguard用了AES加密,前人采用的破解方法是直接DUMP下来。
0x01 静态分析
简单浏览下这个类的实现,发现和传统的壳没啥不同,都是自己实现了classloader,但是解密算法在dll中。
通过浏览lib文件夹,可以看到不同平台下的库文件,这里主要分析windows下的动态链接库。
IDA载入该dll,查看其导出函数定位到解密class的地方。
这个dll静态链接了OpenSSL的静态库。通过ida对应的FLIRT文件来快速识别OpenSSL的库函数。
可以看到,解密的主要算法是通过构造一个RSA私钥,用该私钥解密内置AES算法的秘钥,最后通过解密出来的key来解密class。
所以为了获得解密后的class,可以跑OD脚本直接dump下来,也可以直接批量解密,这里我采用的是批量解密的方法,首先得动态获取解密后的AES秘钥。
0x02 动态分析
通过勾选OD的“中断于新模块"可以在载入该dll的时候断下来,转到对应的地方下断点,可以获取AES的秘钥。即下图框起来的那一部分。
可以看到class在经过该EVP_DecryptUpdate函数的时候内容已经被解开了(部分解开,写OD脚本的时候可以考虑在EVP_DecryptUpdate和EVP_DecryptFinal下断点获取相关内容及长度)
0x03 编写解密脚本
知道了AES的秘钥可以编写脚本来批量解密,脚本如下:
[Python] 纯文本查看 复制代码
#coding=UTF-8import ioimport osimport base64import binasciiimport sysimport cryptosys.modules['Crypto']=cryptofrom crypto.Cipher import AES def decdata(c): key=binascii.a2b_hex('2CAE9F73999AF1E51AA4547C6B57BB22') iv=16*'\x00' cryptor=AES.new(key,AES.MODE_ECB,iv) data=cryptor.decrypt(c) pad=ord(data[-1]) plain_text=data[0:len(data)-pad] return plain_text if __name__ == '__main__': indir = r'trader' #输入文件夹 outdir= r'output'#输出文件夹 exstr='.classx' #输入文件的扩展名 for path, subdirs, files in os.walk(indir): for filename in files: if filename.endswith(exstr): infilename = path + os.sep + filename size = os.path.getsize(infilename) with open(infilename, 'rb') as inFile: data = inFile.read() inFile.close() try: result=decdata(data) except: print filename break outfilename = outdir + infilename.replace(indir, '', 1).replace('classx','class') print outfilename outPath,outFilename = os.path.split(outfilename) if not os.path.exists(outPath): os.makedirs(outPath) ''' 解密class ''' with open(outfilename, 'wb') as outFile: outFile.write(result) outFile.close()
0x04 结果
可以看到class文件已经被解密出来了,并且能正确反编译。
替换解密出来的文件后,通过修改jar的入口即可脱壳完成。
改成
[XML] 纯文本查看 复制代码
Manifest-Version: 1.0Ant-Version: Apache Ant 1.9.4Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)Main-Class: com.fx24k.fxtrader.trader.FxClient
使用java代码实现List集合的add,于lastIndexOd方法
哥们儿只能给你提供个思路,代码写起来像裹脚布一样长,但思路很简单。
List集合的策略,初始一个数组长度,达到长度时new一个新数组,新数组的长度是原数组长度的二倍,然后把原数组的内容复制到新数组,再将新的元素加到数组中。其中肯定有一个变量来记录最后一个元素所在的数组下标。
至于lastIndexOf,就是遍历数组,找到那个就把下标扔出来,找不到就扔个-1就完事了
什么是OD
语法
使用字符串类型显示文件,来格式化输出。
od [ -v ] [ -A AddressBase ] [ -N Count ] [ -j Skip ] [ -t TypeString ... ] [ File ... ]
使用标志显示文件,来格式化输出。
od [ -a ] [ -b ] [ -c ] [ -C ] [ -d ] [ -D ] [ -e ] [ -f ] [ -F ] [ -h ] [ -H ] [ -i ] [ -I ] [ -l ] [ -L ] [ -o ] [ -O ] [ -p ] [ -P ] [ -s ] [ -v ] [ -x ] [ -X ] [ [ -S [ N ] ] [ -w [ N ] ] [ File ] [ [ + ] Offset [ . | b | B ] [ + ] Label [ . | b | B ] ]
描述
od 命令用指定格式显示由 File 参数指定的文件。如果 File 参数没有给定, od 命令读取标准输入。 使用多个 -bcCDdFfOoSstvXx 选项可以指定多个类型。
在第一个语法格式中,输出格式是由 -t 标志指定。如果没有指定格式类型,-t o2 是缺省值。
在第二个语法格式中,输出格式由标志组合指定。Offset 参数指定了文件中文件输出的开始点。 缺省情况下,Offset 参数解释为八进制字节。如果附加了 . 点后缀, 参数解释为十进制的;如果参数前导以 x 或 0x 开始,处理为十六进制。如果 b 后缀添加到参数,解释为块是 512 字节;如果 B 后缀添加到参数上,解释为块是 1024 字节。
Label 参数解释为首字节显示的伪地址。 如果使用了该参数,它在 () 括号中给出,遵循 Offset 参数。 相对于 Offset 参数,后缀有同样的意义。
当 od 命令读取标准输入时, Offset 参数和 Label 参数前头必须有个 + (加号)。
环境变量的设置如 LANG 和 LC_ALL 影响着 od 命令的操作。 要获取更多信息,请参阅《AIX 5L V5.2 系统管理指南:操作系统与设备》中的『理解环境变量的语言环境』 。
标志
第一种格式的标志:
-A AddressBase 指定输入偏移底数。此 AddressBase 变量是下列的字符之一:
d
偏移底数写为十进制的。
o
偏移底数写为八进制的。
x
偏移底数写为十六进制的。
n
偏移底数没有显示。
除非指定 -A n,输出行前将有需要写的下一字节的输入偏移量,输入偏移量在输入文件间会形成。 另外,跟随在最后一个字节的字节偏移量将在所有的输入数据处理完后显示。没有 -A 基地址选项和 [offset_string] 操作数,输入偏移量底数以八进制显示。
=
使用方法
-j Skip
在开始显示输出前,跳跃过由 Skip 变量给定的字节数。 如果指定的文件超过一个,od 命令在显示输出前跳跃过分配的连接输入文件字节数。 如果混合输入不是至少跳跃字节的长度, od 命令将写出诊断消息给标准错误,并退出非零状态。
缺省情况下,Skip 变量的值解释为十进制数字。 带有前缀 0x 或 0X, 偏移量解释为十六进制数;带有前缀 0,偏移量解释为八进制数。 如果字符 b,k,或者 m 附加到 Skip 变量包含的数,偏移量在字节上等于 Skip 变量各自乘以 512,1024,或者 1024*1024 的值。
-N Count 格式不超过由 Count 变量指定的输入字节数。缺省情况下,Count 变量解释为十进制数。带有前缀 0x 或者 0X,认为是十六进制数。 如果以 0 开始,认为是八进制数。 显示地址的底数不是由 Count 选项参数的底数提示的。
-t TypeString 指定输出类型。TypeString 变量是一个当写出数据时,指定使用类型的字符串。 多个类型能够连接在同一个 TypeString 变量中, 并且 -t 标志能够多次指定。 对于每个指定的类型写出了输出行, 依照给定类型指定字符的顺序。TypeString 变量能够包括下列字符:
a
显示字节为指定的字符。在 0 到 01777 范围内,带有至少 7 位的字节,对于那些字符,用相应的名称来写。
c
显示字节为字符。 由 c 类型字符串变换的字节数由 LC_CTYPE 本地类别确定。可打印的多个字节字符的写法对应于字符的第一个字节;两个字符序列 ** 的写法对应于字符中每个保留的字节,作为字符继续的指示。下列非图形字符作为 C- 语言转义序列使用:
\ 反斜杠
\a 提示符
\b 退格符
\f 换页
\n 换行字符
\0 空
\r 回车符
\t 制表符
\v 垂直制表符
d
显示字节为有符号十进制。缺省情况下,od 命令变换相应的字节数为 C -语言类型 int。d 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。
可选的项 C,I,L,或者 S 字符能够附加到 d 可选项,表示转换应该分别适用于 char,int,long,或者 short。
f
显示字节为浮点。缺省情况下,od 命令变换相应的字节数为 C - 语言类型 double。 f 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型的实例变换的字节数。
可选项 F,D,或者 L 字符能够附加到 f 可选项,表示转换应该分别适用于类型 float,double,或者 long double。
o
显示字节为八进制。 缺省情况下, od 命令变换相应的字节数为 C - 语言类型 int。 o 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。
可选项 C, I,L,或者 S 字符能够附加到 o 可选项,表示转换应该分别适用于类型 char,int,long,或者 short。
u
显示字节为无符号的十进制。缺省情况下,od 命令变换相应的字节数为 C-语言类型 int。u 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型的实例变换的字节数。
可选的项 C,I,L,或者 S 字符能够附加到 u 可选项,表示转换应该分别适用于 char,int,long 或者 short。
x
显示字节为无符号的十六进制。缺省情况下,od 命令变换相应的字节数为 C-语言类型 int。x 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。
可选的项 C,I,L,或者 S 字符能够附加到 x 可选项,表示转换应该分别适用于 char,int,long 或者 short。
第二种格式的标志:
-a 显示字节为字符,并且用它们的 ASCII 名称显示。如果 -p 标志也给定了,带有偶校验的字节加下划线。 -P 标志引起带有奇校验的字节加下划线。 否则忽略奇偶性校验。
-b 显示字节为八进制值。
-c 显示字节为 ASCII 符。下列非图形字符作为 C-语言转义序列使用:
\ 反斜杠
\a 提示符
\b 退格符
\f 换页
\n 换行字符
\0 空
\r 回车符
\t 制表符
\v 垂直制表符
其它表示为 3 位的八进制数。
-C 显示扩展字符作为标准打印 ASCII 字符(使用合适的字符转义),并且以十六进制格式显示多字节字符。
-d 显示 16 位字为无符号十进制值。
-D 显示长字为无符号十进制值。
-e 显示长字为双精度、浮点。(如同 -F 标志)
-f 显示长字为浮点。
-F 显示长字为双精度、浮点。(如同 -e 标志)
-h 显示 16 位字为无符号十六进制。
-H 显示长字为无符号十六进制值。
-i 显示 16 位字为有标记十进制。
-I (大写 i)显示长字为有标记十进制值。
-l (小写 L)显示长字为有标记十进制值。
-L 显示长字为有标记十进制值。
注意: 标志 -I(大写 i),-l(小写 L), 和 -L 是相同的。
-o 显示 16 位字为无符号八进制。
-O 显示长字为无符号八进制值。
-p 表示对 -a 转换进行偶校验。
-P 表示对 -a 转换进行奇校验。
-s 显示 16 位字为有标记十进制值。
-S[N] 搜索以空字节结束的字符的字符串。 N 变量指定了需标识的最小长度的字符串。如果 N 变量省略了,最小长度缺省值为 3 个字符。
-v 标志对于下列两种格式是一样的:
-v 写所有输入数据。 缺省情况下, 等同于先前输出行的输出行没有打印,但是用只包含 * (星号)的行替换。 当指定 -v 标志时,打印所有的行。
-w [N] 指定需解释并且在每个输出行显示的输入字节的数量。 如果 -w 标志没有指定,每一显示行读取 16 字节。 如果指定了 -w 标志没有带 N 变量,每个显示行读取 32 个字节。 最大输入值是 4096 字节。 大于 4096 字节的输入值将重新分配最大值。
-x 显示 16 位字为十六进制值。
-X 显示长字为无符号十六进制值。(如同 -H 标志)
退出状态
此命令返回下列出口值:
0 所有输入文件被成功处理。
0 出现错误。
示例
1. 以八进制显示文件,一次显示一页,请输入:
od a.out | pg
此命令以八进制格式显示 a.out 文件并且通过 pg 命令管道输出。
2. 一次转换文件为数个格式,请输入:
od -t cx a.out a.xcd
此命令把 a.out 文件的内容,以十六进制格式(x)和字符格式(c)写到 a.xcd 文件中。
3. 在中间开始显示文件(使用第一语法格式),请输入:
od -t acx -j 100 a.out
此命令把 a.out 文件以指定的字符(a)、字符(c)和十六进制(x)格式显示,从第 100 个字节开始。
4. 在文件中间启动(使用第二种语法格式),请输入:
od -bcx a.out +100.
把 a.out 文件以八进制字节(-b)、字节(-c)和十六进制(-x)格式显示,从第 100 个字节开始。偏移量后的 . (点)表示它是十进制数。没有点,输出将从第 64(八进制为 100)个字节开始。
文件
/usr/bin/od 包含od 命令。
[编辑本段]OD : OdinMS的简称
odinms是国外研究MapleStory的机构,大家经常把它的服务软件称为OD。同时它也是以JAVA为平台的支持服务,需要安装JAVA开发库软件JDK(JRE)作为搭建环境。整个搭建过程涉及到以下软件:
mysql5.0 (结构化语言 数据库)
SQLyog (数据库图形界面管理工具)
navicat8 (数据库图形界面管理工具)
MySQL Query Browser (数据库图形界面管理工具)
phpstudy (网页服务工具,含apache)
NetBeans IDE6 (JAVA编译工具)
JDK(JRE)(JAVA开发库软件)
OD过JAVA的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、OD过JAVA的信息别忘了在本站进行查找喔。
发布于:2022-12-09,除非注明,否则均为
原创文章,转载请注明出处。